为什么我的 C++ 程序比 Python 版本慢 100 倍?
Why my C++ program is 100x slower than a Python Version?
我一直想对一些编程语言做个比较,考了C、C++和Python。
这是我的测试循环的 C++ 代码:
#include <iostream>
int main(){
for(int i=0;i<10000;i++){
std::cout<<i;
}
}
用Code::blocks的GCC编译后(我不认为会有什么大的不同,而且这不仅仅是一个没有优化的编译问题,否则只需要少1000* time ), 大约需要 3 秒(对于 C 版本为 2 秒)来显示所有内容(没有换行符,给出文本汤)。
我做了一个简单的 Python 版本:
for i in range(10000):
print(i,end="")
它在 0.12 秒内运行。(sys.write 0.05)
我的问题很简单:
为什么我的 C++ 程序这么慢? (相对于这个简单的 Python 版本)
在 Windows 上,如果输出是交互式控制台,则默认行为是不缓冲标准输出。虽然其他平台也做类似的事情,但再加上默认的 Windows 控制台出奇地慢,这意味着如果你向它输出大量文本,你的程序就会变慢。
另一方面,Python 默认为基于行的缓冲方法。这样它只会在 运行.
时尝试绘制到标准输出一次
对于 Python 端,如果您 运行 您的脚本使用如下命令:
python -u script_name.py
它应该与 C/C++ 版本一样长,大致是因为就控制台而言,它所做的工作量相同。
另一方面,如果您 运行 像这样的 C++ 程序:
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 10000; i++) {
std::cout << i;
}
std::cout << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
setvbuf(stdout, NULL, _IOLBF, 8192);
for (int i = 0; i < 10000; i++) {
std::cout << i;
}
std::cout << std::endl;
auto t3 = std::chrono::high_resolution_clock::now();
std::cout << "Default behavior: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
std::cout << "Buffered behavior: " << std::chrono::duration_cast<std::chrono::milliseconds>(t3 - t2).count() << std::endl;
这将显示使用默认缓冲模式与更类似于 Python 缓冲技术的缓冲模式对性能的影响。
在我的机器上它最后输出这个,显示缓冲速度提高了 20 多倍:
Default behavior: 751
Buffered behavior: 34
我一直想对一些编程语言做个比较,考了C、C++和Python。
这是我的测试循环的 C++ 代码:
#include <iostream>
int main(){
for(int i=0;i<10000;i++){
std::cout<<i;
}
}
用Code::blocks的GCC编译后(我不认为会有什么大的不同,而且这不仅仅是一个没有优化的编译问题,否则只需要少1000* time ), 大约需要 3 秒(对于 C 版本为 2 秒)来显示所有内容(没有换行符,给出文本汤)。
我做了一个简单的 Python 版本:
for i in range(10000):
print(i,end="")
它在 0.12 秒内运行。(sys.write 0.05)
我的问题很简单: 为什么我的 C++ 程序这么慢? (相对于这个简单的 Python 版本)
在 Windows 上,如果输出是交互式控制台,则默认行为是不缓冲标准输出。虽然其他平台也做类似的事情,但再加上默认的 Windows 控制台出奇地慢,这意味着如果你向它输出大量文本,你的程序就会变慢。
另一方面,Python 默认为基于行的缓冲方法。这样它只会在 运行.
时尝试绘制到标准输出一次对于 Python 端,如果您 运行 您的脚本使用如下命令:
python -u script_name.py
它应该与 C/C++ 版本一样长,大致是因为就控制台而言,它所做的工作量相同。
另一方面,如果您 运行 像这样的 C++ 程序:
auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 10000; i++) {
std::cout << i;
}
std::cout << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
setvbuf(stdout, NULL, _IOLBF, 8192);
for (int i = 0; i < 10000; i++) {
std::cout << i;
}
std::cout << std::endl;
auto t3 = std::chrono::high_resolution_clock::now();
std::cout << "Default behavior: " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count() << std::endl;
std::cout << "Buffered behavior: " << std::chrono::duration_cast<std::chrono::milliseconds>(t3 - t2).count() << std::endl;
这将显示使用默认缓冲模式与更类似于 Python 缓冲技术的缓冲模式对性能的影响。
在我的机器上它最后输出这个,显示缓冲速度提高了 20 多倍:
Default behavior: 751
Buffered behavior: 34