我有一个2GB的文件。平均线有15个字符(最多50个)。使用时:
#include <iostream>
#include <fstream>
#include <string>
void main()
{
std::ifstream input("myfile.txt");
std::string line;
while (std::getline(input, line))
{
}
return;
}
需要大约320秒,而这个Python代码:
with open('myfile.txt', mode='r') as f:
for l in f:
semicolonpresent = ';' in l # do anything here, not important
不到一分钟。
我使用的C ++版本有什么问题?
注意:我已经尝试了很多次,每次重新启动后,或者之前的许多次运行(因此它可能在I / O缓存中),但我总是得到这样的数量级。
注意2:我在Windows 7/64上编译了C ++代码,使用:
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86
cl main.cpp
答案 0 :(得分:0)
void main
不是有效的C ++。 return
中的空main()
都不是。while
。此外,启用优化后,您的std::ifstream ifs(filename);
auto end = ifs.tellg();
ifs.seekg(0, std::ios::beg);
auto beg = ifs.tellg();
std::string buffer;
buffer.reserve(end - beg);
std::copy(std::istreambuf_iterator<char>(ifs),
std::istreambuf_iterator<char>(),
buffer.begin());
循环将被优化掉。随着那说......
如果启用优化,您应该会注意到速度的提升。但是,C ++中的流很慢。这对C ++世界来说不是新闻。那么为什么Python要快得多?这两者并不是真正相同的。 Python是用C语言编写的,内部委托给C库函数。此外,Python可能会提前分配缓冲区并一次性复制缓冲区。如果你想在C ++中做类似的事情:
{{1}}
答案 1 :(得分:0)
答案 2 :(得分:0)
在我的测试中,C++
并不比Python
慢。在大型二进制文件中,它们大致相同。
我稍微修改了你的代码,以提供我觉得应该是准确的时间。
Python代码:
import sys
import time
start = time.time()
sum = 0
with open(sys.argv[1], mode='r') as f:
for l in f:
sum = sum + 1
end = time.time()
print "(", sum, ")", (end - start), "secs"
C ++代码:
auto start = std::chrono::steady_clock::now();
std::ifstream ifs(argv[1]);
std::string line;
unsigned sum = 0;
while(std::getline(ifs, line))
++sum;
auto end = std::chrono::steady_clock::now();
auto time = double(std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count());
OUT("( " << sum << " ) " << (time / 1000.0) << " secs");
处理7.1 GiB
二进制视频文件会产生:
Python: ( 32547618 ) 62.9722070694 secs
C++ : ( 32547618 ) 63.368 secs
使用以下标志在C++
上编译GCC v7.2
代码:
g++ -std=c++17 -O3 ...
相比之下,未经优化的代码在68.541 secs