为什么我的C++程序比Python版本慢100倍?

Why my C++ program is 100x slower than a Python Version?(为什么我的C++程序比Python版本慢100倍?)
本文介绍了为什么我的C++程序比Python版本慢100倍?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想对一些编程语言进行比较,于是我选择了C、C++和Python。

以下是我的一个测试循环的C++代码:

#include <iostream>


int main(){

for(int i=0;i<10000;i++){
std::cout<<i;
}

}

用Code::BLOCKS的GCC编译后(我觉得不会有太大不同,而且这不仅仅是一个没有优化的编译问题,否则只需要1000*更少的时间),大约3秒(C版本2秒)就可以全部显示(没有换行符,给了一个文本汤)。

我做了一个简单的Python版本:

for i in range(10000):
  print(i,end="")

,运行时间为0.12秒。(使用sys.Write0.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++程序比Python版本慢100倍?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Boost module machine type #39;X86#39; conflicts with target machine type #39;x64#39;(Boost模块计算机类型#39;x86#39;与目标计算机类型#39;x64#39;)
Trouble running LLVM examples(运行LLVM示例时出现问题)
Linker error while linking some windows APIs(链接某些Windows API时出现链接器错误)
Python ctypes, C++ object destruction(Python ctype,C++对象销毁)
DllGetClassObject return amp;quot;No such interface supportedamp;quot; while CoCreateInstance can find it successful(DllGetClassObject返回amp;不支持这样的接口,而CoCreateInstance发现它成功了)
Is static_castamp;lt;doubleamp;gt;(std::nanf(amp;quot;amp;quot;)) well defined?(Static_castamp;lt;doubleamp;gt;(std::nanf(amp;quot;amp;quot;))是否定义良好?)