了解到,
printf("%*s", 10, "");
和
printf("%10s", "");
其中哪一个更快、更高效且对编译器更友好?
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 周期来修复和重新编译您的程序。
至于哪个更“编译器友好”,我不确定你的意思。如果你给它工作,编译器不会被冒犯。
哪个更快取决于库的实现细节。该"%*s"
变体从堆栈中提取了一个附加参数...我希望差异很小,尤其是与终端输出的间接成本相比。
如果您需要输出宽度可变,请使用"%*s"
. 如果您不这样做,请选择更简单的"%10s"
,(恕我直言)更清晰。
您始终可以通过编码检查结果。
#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;
}
我的电脑中的时间限制正在被评论。这在不同的电脑上可能会有所不同。但我认为你的答案是给定的;