優勝したO'RourkeのPerlソリューションをLundhのPythonソリューションと比較していただければ幸いです。Perlがそこで何が起こっているのかを理解するのに十分な知識がないからです。より具体的には、Perlバージョン3xの利点をもたらしたものを知りたいです:アルゴリズムの優位性、C拡張機能の品質、その他の要因?
5 に答える
perl のより優れた正規表現の実装は、ストーリーの一部です。しかし、それではなぜ perl の実装が優れているのかを説明することはできません。プロセッサが増えるほど、差は大きくなります。何らかの理由で、Python の実装に問題があります。
Perl は、テキスト処理用に大幅に最適化されています。非常に多くの要因があるため、正確な違いを特定することは困難です。テキストは内部で完全に異なって表現され (utf-8 と utf-16/utf-32)、正規表現エンジンも完全に異なります。Python の正規表現エンジンはカスタムのもので、perl ほど使用されていません。基本的に「言語のコア」であるPerlのものとは対照的に、それに取り組んでいる開発者はほとんどいません(ほとんどメンテナンスされていないと思います)。
やはりPerlはテキスト処理言語です。
Perl 用のメニーコア エンジン (MCE) がリリースされました。MCE は、8 つのワーカー (コールド キャッシュ) を使用してディスクから直接読み取る場合でも、これで非常にうまく機能します。wf_mmap と比較してください。MCE は、入力データを読み取るときにバンク キューイング モデルに従います。画像フォルダーの下にあるスライドを探します。
ソース コードはhttp://code.google.com/p/many-core-engine-perl/でホストされています。
perl のドキュメントはhttps://metacpan.org/module/MCEで読むことができます。
MCE を使用した Wide Finder の実装は、examples/tbray/ で提供されています。
https://metacpan.org/source/MARIOROY/MCE-1.514/examples/tbray/
MCEをお楽しみください。
Script....: baseline1 baseline2 wf_mce1 wf_mce2 wf_mce3 wf_mmap
Cold cache: 1.674 1.370 1.252 1.182 1.174 3.056
Warm cache: 1.236 0.923 0.277 0.106 0.098 0.092
Perl の実装では、mmapシステム コールを使用します。その呼び出しが行うことは、プロセスにとって通常のメモリセグメントまたはプログラムへのバッファであるように見えるポインタを確立することです。ファイルの内容をメモリ領域にマップします。これを実行すると、通常のファイル IO (読み取り) と比べてパフォーマンス上の利点があります。1 つは、データへのアクセスを取得するために必要なユーザー空間ライブラリ呼び出しがないこと、もう 1 つは、多くの場合、必要なコピー操作が少ないことです (例: 間でデータを移動する)。カーネルおよびユーザー空間)。
Perl の文字列と正規表現は (たとえば Java の utf16 とは対照的に) 8 ビット バイト ベースであるため、Perl のネイティブの「文字型」は mmaped ファイルと同じエンコーディングです。
正規表現エンジンが mmap に裏打ちされた変数で動作する場合、Perl の IO 関数や libc の IO 関数さえも経由せずに、マンピングされたメモリ領域を介してファイル データに直接アクセスします。
mmap はおそらく、通常の Python IO ライブラリを使用する Python バージョンとのパフォーマンスの違いの主な原因です。これにより、改行を探すオーバーヘッドがさらに発生します。
Perl プログラムは、処理を並列化するための -J もサポートしています。親のファイルハンドルが子の stdout である fork() を引き起こします。子プロセスは結果を stdout にシリアライズし、親プロセスはそれらをデシリアライズして結果を調整および要約します。
Perl の実装では、mmap システム コールを使用します。
これ。バッファのコピーを回避し、非同期 I/O を提供します。