小さなプログラムを PHP から C++ に書き直しています。アイデアは、基本的に SSD 上の 32Gb ファイルを読み込んで、いくつかの簡単な操作を実行することです。
x64 リリース ビルドで Visual Studio 2012 を使用しています。PHP は 5.3 32bit です。
問題は、PHP の素の読み取り速度が C++ よりも速いことであり、これは私を本当に困惑させます。PHP は ~350 Mb/秒、C++/ifstream コードは 180 Mb/秒です。
コードはとてもシンプルです:
ifstream datafile("data.txt", ios::binary);
while(datafile.read((char*)buffer, data_per_chunk)) {
// do stuff;
最大 16Mb までのさまざまなバッファ サイズを試しましたが、ほとんど違いはありませんでした。また、datafile.rdbuf()->pubsetbuf(...) を介して内部バッファーを設定しようとしましたが、違いはありませんでした。
古代の C レベル インターフェイスに戻らずに ifstream を高速化する方法に関するヒントはありますか? 少なくとも PHP レベルのパフォーマンスに到達したいと考えています。多分いくつかの凝った先読み/キャッシュ設定か何か。
メモリマップされたファイルが役立つ可能性が高いことは理解していますが、ファイルが物理 RAM よりも大幅に大きく、4Gb よりも大きいことを考えると、物事を単純に保つことができる場合、ifstream の設定を微調整することをお勧めします。つまり、潜在的な 32 ビット ビルドには使用できません。 .