了解到,
printf("%*s", 10, "");
与
相同printf("%10s", "");
哪些更快,更高效,更适合编译器?
答案 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上有所不同。但我认为你的答案已经给出了;