在PGN符號中,作為rust庫中的國際象棋遊戲的快速非分配和流式讀者。
Reader
解析了用戶提供Visitor
的遊戲和調用方法。實施自定義訪問者可以最大程度的靈活性:
在每個遊戲的主線中計算句法有效移動數量的訪問者。
use std :: io ;
use pgn_reader :: { Visitor , Skip , BufferedReader , SanPlus } ;
struct MoveCounter {
moves : usize ,
}
impl MoveCounter {
fn new ( ) -> MoveCounter {
MoveCounter { moves : 0 }
}
}
impl Visitor for MoveCounter {
type Result = usize ;
fn begin_game ( & mut self ) {
self . moves = 0 ;
}
fn san ( & mut self , _san_plus : SanPlus ) {
self . moves += 1 ;
}
fn begin_variation ( & mut self ) -> Skip {
Skip ( true ) // stay in the mainline
}
fn end_game ( & mut self ) -> Self :: Result {
self . moves
}
}
fn main ( ) -> io :: Result < ( ) > {
let pgn = b"1. e4 e5 2. Nf3 (2. f4)
{ game paused due to bad weather }
2... Nf6 *" ;
let mut reader = BufferedReader :: new_cursor ( & pgn [ .. ] ) ;
let mut counter = MoveCounter :: new ( ) ;
let moves = reader . read_game ( & mut counter ) ? ;
assert_eq ! ( moves, Some ( 4 ) ) ;
Ok ( ( ) )
}
閱讀文檔
與舊版本的基於mmap
的方法相比,API可能更清潔,性能可能會略有回歸(#12)。這需要一些關注。直到我到處走動之前,我只按照要求進行最小的shakmaty
。
但是,它可能仍然是周圍最快的PGN解析器之一。
使用LICHESS_DB_STANDARD_2018-10.PGN(24,784,600遊戲,52,750 MB未壓縮)在SSD上(三星850),Intel I7-6850K CPU @ 3.60 GHz:
基準 | 時間 | 吞吐量 |
---|---|---|
示例/Stats.rs | 111.9s | 471.4 MB/s |
示例/validate.rs | 237.1s | 222.5 MB/s |
示例/parallel_validate.rs | 148.6s | 355.0 MB/s |
scoutfish make | 269.2s | 196.0 MB/s |
grep -F "[Event " -c | 39.2s | 1345.7 MB/s |
帶有壓縮文件的examples/stats.rs
:
壓縮 | 文件大小 | 時間 | 吞吐量 |
---|---|---|---|
沒有任何 | 52,750 MB | 111.9s | 471.4 MB/s |
BZ2 | 6,226 MB | 1263.1s | 4.9 MB/s |
xz | 6,989 MB | 495.9s | 14.1 MB/s |
GZ | 10,627 MB | 335.7 | 31.7 MB/s |
LZ4 | 16,428 MB | 180.0s | 91.3 MB/s |
PGN閱讀器已根據GPL-3.0(或您選項的任何以後版本)獲得許可。請參閱複製文件以獲取完整的許可文本。