C++;:提高ifstream二进制文件读取速度 我正在从PHP到C++的小程序改写。其基本思想是在SSD上读取32Gb的文件,并对其执行一些简单的操作

C++;:提高ifstream二进制文件读取速度 我正在从PHP到C++的小程序改写。其基本思想是在SSD上读取32Gb的文件,并对其执行一些简单的操作,php,c++,performance,stl,iostream,Php,C++,Performance,Stl,Iostream,我正在使用VisualStudio2012和x64版本构建。PHP是5.32位的 问题是PHP中的裸阅读速度比C++高,这真的让我困惑。PHP速度约为350 Mb/s,C++/ifstream代码速度为180 Mb/s 代码非常简单: ifstream datafile("data.txt", ios::binary); while(datafile.read((char*)buffer, data_per_chunk)) { // do stuff; 我尝试了不同大小的缓冲区,最大可达1

我正在使用VisualStudio2012和x64版本构建。PHP是5.32位的

问题是PHP中的裸阅读速度比C++高,这真的让我困惑。PHP速度约为350 Mb/s,C++/ifstream代码速度为180 Mb/s

代码非常简单:

ifstream datafile("data.txt", ios::binary);

while(datafile.read((char*)buffer, data_per_chunk)) {
//  do stuff;
我尝试了不同大小的缓冲区,最大可达16Mb,但效果几乎没有什么不同。我还试图通过datafile.rdbuf()->pubstebuf(…)设置内部缓冲区,但也没有什么不同

有没有关于如何在不恢复到古老的C级接口的情况下加速ifstream的提示?我希望至少达到PHP的性能水平。可能是一些花哨的预读/缓存设置之类的


我知道内存映射文件可能会有所帮助,但我更愿意调整ifstream的设置,如果考虑到文件比物理RAM大得多,也比4Gb大得多,可以保持简单,即不需要潜在的32位构建。

我不认为在将所有文件读入缓冲区时使用
ifstream
有什么意义。
basic\u filebuf
或“古老的”C接口都可以工作。您需要首先将
ifstream
与C接口进行比较,这样您就知道这确实是
ifstream
的错

为了提高性能,我看到了以下选项:

  • std::ifstream
    read
  • open
    sgetn
  • fopen
    fread
  • CreateFile
    not
    OpenFile
    !)、
    ReadFileEx

也许PHP在内部没有使用C接口,而是使用winapi,这就是区别所在。

看来,即使使用ifstream,您也可以达到最大的SSD读取速度

为此,您需要将内部ifstream readbuffer设置为~2Mb,这是SSD读取速度达到峰值的地方,同时非常适合CPU的二级缓存。然后,您需要读出比内部缓冲区小的数据块。我在读取8-16kB数据块时获得了最好的结果,但它只比读取1Mb数据块快1%左右

设置ifstream内部缓冲区:

ifstream datafile("base.txt", ios::binary);
datafile.rdbuf()->pubsetbuf(iobuf, sizeof iobuf);
通过所有这些调整,我获得了495 Mb/秒的读取速度,接近M500 480Gb SSD的理论最大值。在执行期间,CPU负载为5%,这意味着它实际上不受ifstream实现开销的限制

我发现ifstream和std::basic_filebuf之间没有明显的速度差异