スキャンしなければならないテキストの本文があり、各行には少なくとも 2 つ、場合によっては 4 つの情報部分が含まれています。問題は、各行が 15 ~ 20 の異なるアクションのうちの 1 つになる可能性があることです。
ruby では、現在のコードは次のようになります。
text.split("\n").each do |line| #20回くらい… ………… 式['actions'].each do |pat, reg| #20回くらい ...................
これは明らかに「問題」です。すべての正規表現を 1 つに結合することで (C++ で 50% のマージンで) 高速化することができましたが、それでもまだ必要な速度ではありません。何千ものこれらのファイルを高速に解析する必要があります。
現在、正規表現と照合していますが、これは耐えられないほど遅いです。私はルビーから始めて、速度が向上することを期待して C++ に飛び乗りましたが、それは実現していません。
PEG と文法ベースの解析について何気なく読んだことがありますが、実装するのはやや難しいようです。これは私が向かうべき方向ですか、それとも別のルートがありますか?
基本的に、私はポーカー ハンドの履歴を解析しています。ハンド履歴の各行には、通常、収集する必要がある 2 ~ 3 ビットの情報が含まれています: プレイヤーが誰で、いくらの金額で、アクションに必要なカードは何かなど..
解析が必要なサンプル テキスト:
Buredtens の投稿 $5 ボタンは4番席にあります *** ホールカード *** メイヘム 31337 [8s 広告] に対処 Sherwin7 フォールド OneMiKee フォールド syhg99 コール $5 Buredtens が $10 にレイズ
この情報を収集した後、各アクションは xml ノードに変換されます。
今のところ、これの Ruby 実装は私の C++ 実装よりもはるかに高速ですが、それは問題です。私は4〜5年以上Cコードを書いていないからです
更新: ここにすべてのコードを投稿したくはありませんが、これまでのところ、私の手/秒は次のようになっています:
588 ハンド/秒 -- boost::spirit in c++ 60 ハンド/秒 -- C++ の非常に長くて複雑な 1 つの正規表現 (すべての正規表現をまとめたもの) 33 ハンド/秒 -- Ruby の通常の正規表現スタイル
私は現在、さらに先に進むことができるかどうかを確認するために antlr をテストしていますが、現時点では、spirit の結果に非常に満足しています。