我有一个几百万行(~80MB)的txt文件。我必须在Visual Studio 2015中编写一个程序,它读取文件的内容,对行进行排序,然后将结果写入另一个文件。在我的笔记本上有两个操作系统(Windows 7和Ubuntu 15.04)。 首先我使用g ++在Ubuntu上编写它,然后我在Visual Studio 2015中编译了相同的源代码。我测量了这三个操作时间。
结果是:
Ubuntu(Ext3分区)
Ubuntu(在NTFS分区上运行)
Windows(NTFS分区)
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;
答案 0 :(得分:4)
在执行文件io时会有很多事情发生,例如操作系统缓存,反病毒,Windows搜索(是的)。我不会将速度上的任何差异归因于Visual Studio与gcc编译器。
如果你想获得更高的速度,请确保使用相当大的文件读取(我不知道你的情况下实际文件的大小是多少)。
如果您想比较节目的速度,请不要在排序和文件io之间混合测量。文件io是slooooooooow。
您可以从自己的测量中看出,排序本身在您的示例中花费的时间大致相同,或者使用VS实际上更快。
当时从磁盘读取大块或可能将其映射到内存中。