C++ std::fstream-慢速秒读

C++ std::fstream-慢速秒读,c++,performance,visual-studio,g++,fstream,C++,Performance,Visual Studio,G++,Fstream,我在读取大型二进制文件(2G字节)时遇到了fstream问题。使用这个测试代码,我创建了fstream,然后一直读到EOF。然后清除标志并将位置重置为文件的开头。然后我又读了一遍。问题是,第二次读取(第二次while循环)总是非常慢 我需要为Embarcadero RAD Studio XE7解决这个问题。同样,在MS Visual 2010中也可以复制较慢的二次读取。第一次读取是以硬盘的最高速度(约140 MB/s)完成的,第二次读取总是以硬盘的四分之一(35 MB/s)完成的 奇怪的是,当我

我在读取大型二进制文件(2G字节)时遇到了fstream问题。使用这个测试代码,我创建了fstream,然后一直读到EOF。然后清除标志并将位置重置为文件的开头。然后我又读了一遍。问题是,第二次读取(第二次while循环)总是非常慢

我需要为Embarcadero RAD Studio XE7解决这个问题。同样,在MS Visual 2010中也可以复制较慢的二次读取。第一次读取是以硬盘的最高速度(约140 MB/s)完成的,第二次读取总是以硬盘的四分之一(35 MB/s)完成的

奇怪的是,当我在Debian上使用g++4.9.2时,第一次和第二次读取的时间与我预期的相同

#include <stdio.h>
#include <cstdlib>
#include <fstream>
#include <string>

char buffer[400000];
int main()
{
    std::fstream stream;
    std::string filename = "largeFile.bin";
    stream.open(filename, std::ios_base::in | std::ios_base::binary);

    while(stream.good()){
        stream.read(buffer, 400000);
    }

    printf("first read complete");

    stream.clear();
    stream.seekg(std::ios::beg);

    while(stream.good()){
        stream.read(buffer, 400000);
    }

    printf("second read complete");
    stream.close();
    return 0;
}
#包括
#包括
#包括
#包括
字符缓冲区[400000];
int main()
{
std::fstream流;
std::string filename=“largeFile.bin”;
open(文件名,std::ios_base::in | std::ios_base::binary);
while(stream.good()){
读取(缓冲区,400000);
}
printf(“首次阅读完成”);
stream.clear();
stream.seekg(std::ios::beg);
while(stream.good()){
读取(缓冲区,400000);
}
printf(“二读完成”);
stream.close();
返回0;
}
我省略了这两个while周期的时间度量,因为它对于这个问题并不重要


在一次打开的文件上从开始到EOF多次读取时,我是否做错了什么?

很久以前,由于涉及一些硬件缓存机制,所以将读取缓冲区大小设置为64KB很重要。。。但我不知道这是否仍然有效。不过,我不确定这是如何解释性能下降的。我曾尝试将缓冲区设置为各种大小(现在甚至设置为64KB),但遗憾的是没有任何区别。