在Windows 7上读取文件速度很慢

时间:2010-10-23 23:40:36

标签: c++ visual-c++

这里有基本的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上显式。谢谢安德斯。

2 个答案:

答案 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>