哪个printf()会更快,为什么?

时间:2013-10-22 06:06:09

标签: c

了解到,

printf("%*s", 10, "");

相同
printf("%10s", "");

哪些更快,更高效,更适合编译器?

3 个答案:

答案 0 :(得分:6)

printf("%*s", 10, "");

那将打印10个空格。

printf("%10s", 10, "");

这是不正确的;当然你的意思是:

printf("%10s", "");

也将打印10个空格。

老实说,我不知道哪一个更快,它可能取决于特定的printf实现。第一个版本必须处理另一个参数。在第二个中,printf被赋予int值,它不必从字符序列'1''0'中解析。

但是我有理由相信,与将这10个字节的数据写入输出设备的成本相比,性能上的任何差异都可能是微不足道的,无论它是终端窗口(渲染所选字体的每个像素的表示)显示屏上的空格字符),磁盘上的文件(等待读写磁头移动到位以及将磁盘旋转到您想要写入的位置,尽管大部分可能并行完成) ,或网络连接(你明白了)。

有些情况下性能差异很重要。如果您可以调用一次并存储结果,请不要在循环的每次迭代时调用strlen()。当你可以使用Quicksort时,不要将Bubblesort用于大型数组 - 或者只调用qsort(),它将被优化到其生命的一英寸范围内。

这不是其中之一。

相反,写出任何最明确表达你意图的东西。如果我知道我想要10个空格,我可能会写printf("%10s", "");;如果在运行时确定了空格数,我可能会写printf("%*s", n, "");

如果你编写更简单的代码,那么你第一次就能更好地完成它;想象一下,你将用多少CPU周期来修复和重新编译你的程序。

至于哪个更“编译友好”,我不确定你的意思。如果你给它工作,编译器就不会被冒犯。

答案 1 :(得分:1)

哪一个更快取决于库的实现细节。 "%*s"变量从堆栈中提取了一个额外的参数...我希望差异是边际的,特别是与终端输出的开销成本相比。

如果您需要输出宽度可变,请使用"%*s"。如果不这样做,请选择更简单的"%10s",这是(恕我直言)更清晰。

答案 2 :(得分:0)

您始终可以通过编码检查结果。

#include<stdio.h>
#include<time.h>

using namespace std;

int main()
{
    double cl = clock();
   for(int i=0;i<100000;i++){
       printf("%*s", 10, "");//3.814
   }
   cl = clock() - cl;
   fprintf( stderr, "%lf\n", cl / CLOCKS_PER_SEC );

 //printf("%10s", "");//3.617
    return 0;
}
正在评论我的电脑的时间限制。这可以在不同的PC上有所不同。但我认为你的答案已经给出了;