c++ - 相同的 c 和 c++ 程序之间的巨大速度差异

标签 c++ c performance

我对 c 和 c++ 编程非常陌生,所以我从基础开始。我为 c 和 c++ 编写了相同的斐波那契循环程序来测试相对速度。我认为对于如此简单的事情它们几乎相同,但是 c++ 版本要慢 60 倍。他们所做的只是循环并打印前 14 个斐波那契数 10,000 次。这是c版本:

#include <stdio.h>

int main (){
    int c = 0;
    int x, y, z;

    while(c < 10000)
    {
        x = 0;
        y = 1;
        while(x < 255)
        {
            printf("%d\n", x);
            z = x + y;
            x = y;
            y = z;
        }
        c++;
    }
    return 0;
}

这里是 c++ 版本:

#include <iostream>
using namespace std;

int main()
{
    int c = 0, x = 0, y = 0, z = 0;
    while(c < 10000)
    {
        x = 0;
        y = 1;
        while(x < 255)
        {
            cout << x << endl;
            z = x + y;
            x = y;
            y = z;
        }
        c++;
    }
    return 0;
}

我都用 Notepad++ 编写并使用代码块附带的mingw中的g++编译它们:

g++ -o fibc.exe fib.c -s
g++ -o fibcpp.exe fib.cpp -s

可执行文件的大小非常不同:c 为 8.5KB,c++ 为 784KB!我用 powershell 来计时:

Measure-Command {start-process "C:\Path\fibcpp.exe" -RedirectStandardOutput "C:\Path\cpp.txt" -Wait}

生成的文件是相同的,但是 c 版本需要 1 秒,而 c++ 版本需要 60 秒! (实际上,为 c 程序放一个 100 万的循环仍然只用了 13 秒)。我还在 Visual Studio 17 中编写了 c++,并在其中使用 x86 发布配置对其进行了编译。程序大小现在为 9.5KB,但运行时间与 g++ 版本相同:62 秒。为什么这么简单的程序会出现这种情况?

最佳答案

您正在对 printfcout 进行基准测试,因为这些是您程序中的主要瓶颈。

printf 是一个非常慢的函数,但可能仍然比 osteam 快,后者必须维护自己的模板元编程的私有(private) hell ,以保持其灵 active 根据 C++ 标准的要求。 cout 绝对比 printf 灵活和复杂得多。更多功能意味着更慢的代码。

如果您真的想比较这两种语言,请删除打印函数并将其替换为具有外部链接的虚拟函数“foo”:

void foo (int x);
...

while(x < 255)
{
  foo(x);

当使用 gcc -O3 for x86 对该代码进行基准测试时,我得到的 C version 的代码几乎相同和 C++ version .

唯一显着的区别是 C++ 在 main() 末尾添加的“CRT”粘胶。它正在调用 atexit 和 C 也会执行的各种其他清理,但可能在应用程序代码之外。在 C++ 中仍然总会有开销,因为它必须调用具有静态存储持续时间的对象的构造和清理析构函数。 C 不必这样做。

关于c++ - 相同的 c 和 c++ 程序之间的巨大速度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57625038/

相关文章:

c++ - 使用 C++98 标准访问 map

c - 为什么我会遇到以下程序的段错误?

重定位 vector 表的C代码

SQL Server 从类型 varbinary(max) 慢速选择查询

c++ - 是否需要销毁移出的对象?

c++ - VS 2015 中的基本错误处理

c++ - 在不同的 GPU 上初始化结构

c - 在PIC18F中实现定时器以生成随机数

c++ - 使用 opencv 框架的 Objective-C 项目的最佳编译器标志

javascript - 具有数千个可观察值的 Knockout.js 表单对浏览器性能的影响