【问题标题】:Why my C++ program is 100x slower than a Python Version?为什么我的 C++ 程序比 Python 版本慢 100 倍?
【发布时间】:2021-05-30 00:57:37
【问题描述】:

我想对一些编程语言进行比较,我选择了 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.write 0.05)

我的问题很简单: 为什么我的 C++ 程序这么慢? (相对于这个简单的 Python 版本)

【问题讨论】:

  • 您是否编译了启用优化的.cpp 文件? -O2-O3?
  • 是每次运行 3 秒,还是第一次运行?这可能是一个行为不端的防病毒扫描程序。
  • 这能回答你的问题吗? Why is std::cout so time consuming?
  • 尝试用 g++ 编译。
  • 不,因为它与 C 版本基本相同

标签: python c++ compilation codeblocks


【解决方案1】:

在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多