这里有基本的c ++问题。我正在尝试在Windows 7 Pro上读取大文件。 C ++编译器是Visual Studio 2010.(版本16.0)。我发现Windows 7上的程序运行速度比在同一个机器上运行Ubuntu的虚拟机上慢5倍。 Ubuntu版本10.04使用gcc 4.4.3。该文件相当大~900MB。有问题的代码可以缩小到以下代码段。有关Windows特定调优以更快读取文件的任何线索?该文件约为1700万行,在Windows 7上大约需要13秒,在Ubuntu上大约需要2.3秒(在同一个Windows 7机器上是一个VM)。我在Visual c ++上使用/ O2标志,在Ubuntu / gcc 4.4.3上使用-O3
由于
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
const char* test_file_path = argv[1];
ifstream ifs(test_file_path);
if (!ifs.is_open()) {
cout << "Could not open " << test_file_path << endl;
return 0;
}
unsigned long line_count = 1;
unsigned long sum = 0;
string line;
// Go through all the lines in the file
while (getline(ifs, line)) {
line_count++;
}
cout << line_count << '\n';
return 0;
}
编辑:由Anders尝试提升内存映射文件建议,时间降至1.2秒。看起来Ubuntu是默认的,而你需要在Windows上显式。谢谢安德斯。
答案 0 :(得分:3)
如果你关心性能,我建议你走出C ++世界并进入Win32 API文件处理(例如内存映射文件,boost有一个库)。
答案 1 :(得分:1)
通常情况下,如果您担心性能问题,那么使用缓存而不是系统会好得多。根据{{1}}的实施情况,可能会非常缓慢。例如,标准getline()
实现使用4kb的内部缓存,因此会有许多I / O调用。所以,请实现一些缓存并使用fread()
的实现。
但在这种特殊情况下,我认为问题出在其他地方。从标准HDD读取时,您将达到大约80-100mb / s,在特定文件的最佳情况下,这将提供大约10秒。您的情况下的处理逻辑非常简单,因此HDD将成为瓶颈。这种差异有两个可能的原因:
1)Windows缓存文件(Windows中的第一次测试将其放入缓存中,因此下次从VM读取同一文件来自系统缓存)
2)如果文件在VM的文件系统中并且VM使用压缩用于HDD(考虑到该文件是文本文件,它将是高度可压缩的),那么实际的HDD I / O量将会少得多。 / p>