0

了解到,

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

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

其中哪一个更快、更高效且对编译器更友好?

4

3 回答 3

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 周期来修复和重新编译您的程序。

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

于 2013-10-22T06:30:36.310 回答
1

哪个更快取决于库的实现细节。该"%*s"变体从堆栈中提取了一个附加参数...我希望差异很小,尤其是与终端输出的间接成本相比。

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

于 2013-10-22T07:00:37.783 回答
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;
}

我的电脑中的时间限制正在被评论。这在不同的电脑上可能会有所不同。但我认为你的答案是给定的;

于 2013-10-23T03:48:58.293 回答