我对 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 ++中编写,并使用Codeblocks附带的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程序循环1百万次仍然只需要13秒)。我也用Visual Studio 17编写了C++并使用x86发布配置进行了编译。现在程序大小为9.5KB,但运行时间与g ++版本相同:62秒。为什么对于这样一个简单的程序会出现这种情况?
using namespace std;
并使用printf
替代cout
,并再次检查它们之间的差异。当进行这样的实验时,应该尽可能地让两个代码接近。 - andresantacruz'\n'
替代std::endl
,这样就不需要每次都刷新。你尝试过使用优化编译器进行编译吗,例如-O2
? - Bob__std::cout
等)默认情况下与它们的 C 语言版本同步 - 这意味着默认情况下会有性能损失。在执行输出之前尝试使用std::ios::sync_with_stdio(false)
,然后 C++ 版本将更接近(虽然不完全等同于)C 版本。此外,endl
流操作符会刷新流缓冲区,而在向printf()
提供'\n'
时不会这样做。另外,在未经优化的代码上进行基准测试通常是无意义的。 - Peter