- 此问题在此处已有答案**:
Why is C++ slower than C when doing literaly nothing(2个答案)
Why is std::cout so time consuming?(1个答案)
'printf' vs. 'cout' in C++(16个答案)
16小时前关门了。
我用C和C编写程序来寻找水仙花的数量,发现C程序的速度只有C的一半(我用bash脚本来重复运行和测量时间),是什么原因呢?
main.c
#include <stdio.h>
#include <stdbool.h>
bool is(int number)
{
int s = number;
int t = 0;
while(number)
{
t += (number % 10) * (number % 10) * (number % 10);
number /= 10;
}
return t == s;
}
int main()
{
for(int i = 100; i < 1000; i++)
{
if(is(i))
{
printf("%d\n",i);
}
}
return 0;
}
编译:gcc main. c
main.cpp
#include <iostream>
using namespace std;
bool is(int number)
{
int s = number;
int t = 0;
while(number)
{
t += (number % 10) * (number % 10) * (number % 10);
number /= 10;
}
return t == s;
}
int main()
{
for(int i = 100; i < 1000; i++)
{
if(is(i))
{
cout << i << endl;
}
}
return 0;
}
编译:g ++ main.cpp
bash脚本(test.sh):对于{1..1000}中的i;做;完成
测试命令:时间/测试h
2条答案
按热度按时间eanckbw91#
您的基准测试远非理想,其结果基本上毫无意义。
1.它测量未优化的代码。未优化的编译不能生成快速代码。请使用
-O2
或-O3
。1.它测量运行迭代次数太少的代码,以排除随机波动和边缘效应。将迭代次数增加5个数量级。如果需要,添加一个外循环。
1.它将计算和I/O混在一起,并且不清楚哪一个占主导地位。#2应该纠正这一点,但是为了完全确定,在测试中只执行最小的I/O或根本不执行I/O(除非您正在对I/O进行基准测试)。
1.它将编译后的代码和bash代码集中在一起。#2也应该消除对bash脚本的需要。
svmlkihl2#
我认为是“endl”过早地刷新了缓冲区。
标准::cout〈〈i〈〈“\n”;
这将创建一个新行但不刷新缓冲区。然后您可以std::cout〈〈endl;在return语句之前刷新缓冲区是一个很好的做法。但是,大多数编译器会在退出时刷新缓冲区。