我正在将小型程序从PHP重写为C ++。这个想法基本上是读取SSD上的32Gb文件并对其执行一些简单的操作。
我将Visual Studio 2012与x64发行版一起使用。PHP是5.3 32位。
问题是PHP的裸读速度比C ++快,这确实让我感到困惑。PHP的速度约为350 Mb / s,而C ++ / ifstream的代码速度为180 Mb / sec。
代码真的很简单:
ifstream datafile("data.txt", ios::binary);
while(datafile.read((char*)buffer, data_per_chunk)) {
// do stuff;
我尝试了高达16Mb的不同大小的缓冲区,但差别不大。我还尝试通过datafile.rdbuf()-> pubsetbuf(...)设置内部缓冲区,但它也没有改变。
关于如何加快ifstream的速度而又不恢复到古老的C级接口的任何提示?我想至少达到PHP的性能水平。也许一些花哨的预读/缓存设置或其他内容。
我知道内存映射的文件可能会有所帮助,但是如果可以简化事情,因为文件明显大于物理RAM且大于4Gb,即可能的32位构建不可行,则我宁愿调整ifstream的设置。 。
看来即使使用ifstream也可以达到最大的SSD读取速度。
为此,您需要将内部ifstream读缓冲区设置为〜2Mb,这是峰值SSD读取速度发生的地方,同时恰好适合CPU的二级缓存。然后,您需要分块读取小于内部缓冲区的数据。以8-16kB的块读取数据具有最佳结果,但比以1Mb的块读取速度仅快约1%。
设置ifstream内部缓冲区:
ifstream datafile("base.txt", ios::binary);
datafile.rdbuf()->pubsetbuf(iobuf, sizeof iobuf);
通过所有这些调整,我获得了495 Mb / sec的读取速度,这接近M500 480Gb SSD的理论最大值。在执行期间,CPU负载为5%,这意味着它实际上不受ifstream实现开销的限制。
我发现ifstream和std :: basic_filebuf之间没有明显的速度差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句