【发布时间】:2019-12-28 16:55:02
【问题描述】:
我对 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;
}
我都用记事本++编写并使用代码块附带的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 秒。为什么这么简单的程序会出现这种情况?
【问题讨论】:
-
在 C++ 代码中尽量使用与 C 代码相同的标头。删除
using namespace std;并使用printf而不是cout并再次检查它们之间的区别。当你运行这样一个实验时,你应该尽可能地使用最接近的代码。 -
尝试使用
'\n'而不是std::endl作为初学者,你不需要每次都刷新。您是否尝试过使用优化进行编译,例如-O2? -
您不是在比较等效代码。默认情况下,C++ 流(
std::cout等)与其 C 等效项同步 - 这意味着默认情况下会影响性能。在执行输出之前尝试执行std::ios::sync_with_stdio(false)- 那么C++ 版本将更接近(尽管不完全等同)C 版本。此外,endl流操作符会刷新流缓冲区,而在将'\n'提供给printf()时不会这样做。此外,基准测试通常对未优化的代码毫无意义。 -
你能把 cout 换成 printf 吗?
-
好吧,你们在 2 分钟内解决了我的问题 - 谢谢。在 c++ 代码中切换到 stdio 和 printf 就是一切——新的 exe 与 c 版本的大小和性能相同。如您所见,我对此非常陌生。
标签: c++ c performance