我想知道哪个更好/更快处理:
printf("%s", foo);
和
for(int i = 0; i < len; i++)
printf('%c', foo[i]);`
我注意到输出并不总是一样。
答案 0 :(得分:3)
单个电话printf("%s", foo);
很可能更快。您只需对printf
进行一次函数调用,而不是n
函数调用,每个函数调用都必须解析格式字符串。
即使后者更快,前者仍然是首选,因为读者会更清楚。
答案 1 :(得分:2)
性能测试吧。试图提出A比B快的规则是不好的做法。随着时间的推移或稍微不同的情况,该假设将变得不正确。优化时始终进行性能测试。
编写测试用例并使用高精度计时器进行测试。确保您的性能计时器具有足够高的粒度以显示差异。在Windows上,您可以使用QueryPerformanceCounter
。谷歌搜索该功能应该让你开始。
答案 2 :(得分:1)
请注意:for(int i = 0; i < len; i++) printf('%c', foo[i]);
中存在语法错误。它应该是:
int len = strlen(foo);
for (int i = 0; i < len; i++)
printf("%c", foo[i]);
假设foo
的长度适合int
,此循环效率非常低。 printf("%s", foo);
很可能比这更快,但是如果你注意到不同的输出,就会发生一些可疑的事情......可能len
计算不正确。
另请注意,您可以编写可能更高效的版本:
for (int i = 0; i < len; i++)
putchar(foo[i]);
您还可以使用此变体改进printf("%s",foo);
:
fputs(foo, stdout);
但与往常一样,您应该对系统进行测试和基准测试,以衡量实际性能。有些编译器会自动将printf("%s", foo);
优化为fputs(foo, stdout);
。
答案 3 :(得分:1)
没有循环的语句肯定比带循环的语句快。 我会告诉你两者究竟发生了什么。 1.带循环
for(int i = 0; i < len ; i++) printf("%c", foo[i]) ;
在每次迭代中,我都会与&#39; len&#39;进行比较。并且在每个字符打印后我都会增加。 2.没有循环
printf("%s", foo) ;
foo这里基本上是一个指向字符串的指针,它将继续打印foo [0]之后的每个字符,直到&#39; \ 0&#39;找到字符(或终止字符)。 因此,在第二种情况下,我们基本上节省了更新i的时间并访问foo [i] wrt到foo [0]。
但是,当然,这是基本的表现。实际性能测试可能会导致您得到的结果取决于您正在使用的编译器和操作系统。