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

MrP*_*ler 15 c c++ performance

我是C和C ++编程的新手,所以我从基础开始。我为c和c ++编写了相同的Fibonacci循环程序,以测试相对速度。我以为它们对于简单的东西差不多一样,但是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;
}
Run Code Online (Sandbox Code Playgroud)

这是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;
}
Run Code Online (Sandbox Code Playgroud)

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

g++ -o fibc.exe fib.c -s
g++ -o fibcpp.exe fib.cpp -s
Run Code Online (Sandbox Code Playgroud)

可执行文件的大小差别很大:c为8.5KB,c ++为784KB!我使用powershell为它们计时:

Measure-Command {start-process "C:\Path\fibcpp.exe" -RedirectStandardOutput "C:\Path\cpp.txt" -Wait}
Run Code Online (Sandbox Code Playgroud)

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

Lun*_*din 6

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

printf是一个非常慢的函数,但可能仍然比 快osteam,它必须维护自己的模板元编程的私有地狱,以保持它像 C++ 标准所要求的那样灵活。cout绝对比printf. 更多的功能意味着更慢的代码。

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

void foo (int x);
...

while(x < 255)
{
  foo(x);
Run Code Online (Sandbox Code Playgroud)

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

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

  • 模板元编程不会影响执行速度。诸如缓冲策略、刷新和同步之类的事情都是如此。 (3认同)