我对 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 秒。为什么这么简单的程序会出现这种情况?
最佳答案
您正在对 printf
与 cout
进行基准测试,因为这些是您程序中的主要瓶颈。
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/