قارئ سريع غير متلقاة وتدفق لألعاب الشطرنج في تدوين PGN ، كمكتبة للصدأ.
يقوم 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
من الإصدارات القديمة (#12). هذا يحتاج إلى بعض الاهتمام. إلى أن أتجول إليها ، أقوم فقط بعمل الحد الأدنى من الصيانة ، بعد shakmaty
كما هو مطلوب.
ومع ذلك ، ربما لا يزال أحد أسرع محلات PGN حولها.
قم بتشغيل مع lichess_db_standard_rated_2018-10.pgn (24،784،600 لعبة ، 52،750 ميجابايت غير مضغوط) على SSD (Samsung 850) ، Intel I7-6850K CPU @ 3.60 GHz:
معيار | وقت | إنتاجية |
---|---|---|
أمثلة/stats.rs | 111.9S | 471.4 ميغابايت/ثانية |
أمثلة/التحقق من صحة | 237.1S | 222.5 ميغابايت/ثانية |
أمثلة/parallel_validate.rs | 148.6S | 355.0 ميغابايت/ثانية |
scoutfish make | 269.2S | 196.0 ميغابايت/ق |
grep -F "[Event " -c | 39.2S | 1345.7 ميغابايت/ثانية |
examples/stats.rs
مع ملفات مضغوطة:
ضغط | حجم الملف | وقت | إنتاجية |
---|---|---|---|
لا أحد | 52،750 ميغابايت | 111.9S | 471.4 ميغابايت/ثانية |
BZ2 | 6،226 ميغابايت | 1263.1S | 4.9 ميغابايت/ثانية |
XZ | 6،989 ميغابايت | 495.9S | 14.1 ميغابايت/ثانية |
GZ | 10،627 ميغابايت | 335.7s | 31.7 ميغابايت/ثانية |
LZ4 | 16،428 ميغابايت | 180.0s | 91.3 ميغابايت/ثانية |
PGN-Reader مرخصة بموجب GPL-3.0 (أو أي إصدار لاحق في الخيار الخاص بك). راجع ملف النسخ لنص الترخيص الكامل.