C ++在g ++和msvc之间的不同文件读/写时间

时间:2015-11-02 18:54:11

标签: c++ performance visual-studio visual-c++ g++

我有一个几百万行(~80MB)的txt文件。我必须在Visual Studio 2015中编写一个程序,它读取文件的内容,对行进行排序,然后将结果写入另一个文件。在我的笔记本上有两个操作系统(Windows 7和Ubuntu 15.04)。 首先我使用g ++在Ubuntu上编写它,然后我在Visual Studio 2015中编译了相同的源代码。我测量了这三个操作时间。

结果是:

Ubuntu(Ext3分区)

  • 阅读:~1s
  • 排序:~3.2-3.4s
  • 写:~1s

Ubuntu(在NTFS分区上运行)

  • 阅读:~1s
  • 排序:~3.2-3.4s
  • 写:~4.7s

Windows(NTFS分区)

  • 阅读:~5.5-6.0s(未经优化需要2分钟)
  • 排序:~2.6s
  • 写:~2.6-2.8s

Ubuntu的: g ++ -std = c ++ 14 main.cpp(也尝试使用-O3但结果相同。

视窗: 带有-O3优化的msvc编译器

测试是在华硕K50AB上进行的。

所以我的问题是,是否有可能接近Ubuntu上达到的读/写时间,或者msvc只能编译为与g ++一样高效的代码? 另外我认为差异可能是由不同的文件系统引起的,但是在NTFS上从Ubuntu读取的速度是相同的。

auto t1 = std::chrono::high_resolution_clock::now();

std::ifstream is{ "rec.txt" };
std::ofstream os{ "res.txt" };

// number is the number of lines
std::vector<std::string> lines(number);

for (int i = 0; i < number; ++i)

    is >> lines[i];

auto t2 = std::chrono::high_resolution_clock::now();

std::cout << "read time: " <<
    std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;


// sort elements


t1 = std::chrono::high_resolution_clock::now();

for (int i = 0; i < number; ++i)

    os << s[i] << '\n';

t2 = std::chrono::high_resolution_clock::now();

std::cout << "write time: " <<
    std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;

1 个答案:

答案 0 :(得分:4)

在执行文件io时会有很多事情发生,例如操作系统缓存,反病毒,Windows搜索(是的)。我不会将速度上的任何差异归因于Visual Studio与gcc编译器。

如果你想获得更高的速度,请确保使用相当大的文件读取(我不知道你的情况下实际文件的大小是多少)。

如果您想比较节目的速度,请不要在排序和文件io之间混合测量。文件io是slooooooooow。

您可以从自己的测量中看出,排序本身在您的示例中花费的时间大致相同,或者使用VS实际上更快。

当时从磁盘读取大块或可能将其映射到内存中。