在printf%s和for循环%c之间哪个更快
请告诉我,在以下两种情况下,哪种处理方式更好/更快:在printf%s和for循环%c之间哪个更快,c,algorithm,performance,printf,C,Algorithm,Performance,Printf,请告诉我,在以下两种情况下,哪种处理方式更好/更快: printf("%s", foo); 及 for(int i=0;i
printf("%s", foo);
及
for(int i=0;i
我注意到输出并不总是相同的。单个调用
printf(“%s”,foo)代码>很可能更快。只对printf
进行一次函数调用,而不是n
函数调用,每个函数调用都必须解析格式字符串
即使后者更快,前者仍然是首选,因为它对读者来说更清晰。性能测试它。试图想出A比B快的任何规则都是不好的做法。随着时间的推移或在稍有不同的情况下,该假设将变得不正确。优化时始终进行性能测试
编写一个测试用例,并使用高精度计时器进行测试。确保性能计时器具有足够高的粒度以显示差异。在Windows上,您可以使用QueryPerformanceCounter
。用谷歌搜索该函数应该可以让您开始使用。注意:for(int i=0;i。应改为:
int len = strlen(foo);
for (int i = 0; i < len; i++)
printf("%c", foo[i]);
您还可以改进printf(“%s”,foo)代码>使用此变量:
fputs(foo, stdout);
但和往常一样,您应该在系统上进行测试和基准测试,以衡量实际性能。一些编译器将优化printf(“%s”,foo)编码>进入fput(foo,stdout)代码>自动。没有循环的语句肯定比有循环的语句快。
我会告诉你在这两个地方到底发生了什么。
1.带回路
for(int i = 0; i < len ; i++) printf("%c", foo[i]) ;
这里的foo基本上是一个指向字符串的指针,它将继续打印foo[0]之后的每个字符,直到找到“\0”字符(或终止字符)。
因此,在第二种情况下,我们基本上节省了更新i和访问foo[i]wrt到foo[0]的时间
当然,这是最基本的表现。实际的性能测试可能会导致您得到的结果取决于您所使用的编译器和操作系统。您如何打印这样的代码?@LVNDRY:您可以在反勾(`)和缩进代码块之间键入代码片段4个空格。这里有一个完整的指南:你为什么不计时看看呢?有时间功能吗?如果您不知道如何计算时间,那么您不太可能为性能差异而烦恼。一些编译器(包括)可以将printf
优化为更简单的东西。没有明确的答案。它取决于编译器、库和处理器的许多方面。这两种方法的复杂性顺序相同。更快的是花时间编写更高级别的关注点,而这正是可以获得真正性能提升的地方——而不是在这种微观优化中代码>调用错误;它应该是printf(“%c”,foo[i])当然是代码>。假设这是固定的,那么让一个对printf()
的调用迭代字符串应该比一次对一个字符多次调用printf()
要快。如果替换printf(“%c”,foo[i])代码>带有putchar(foo[i])
,那么您可能会有机会,但是printf()
可以使用代码,这样就避免了对putchar()
调用太多的开销-无论putchar()
是否是宏。因此,我会惊讶地发现,一次调用printf()
要比多次调用printf()
慢。有人可能会说,printf也可能在字符串上循环,增加一些索引或指针,直到达到其长度,并将每个字符放入stdout缓冲区。主要的性能提升可能是printf()
没有被频繁调用。但我怀疑,循环中的putchar(foo[I])
-版本在大多数实现中的性能远不如printf(“%s”,foo)代码>,尽管循环。@Ctx:putchar()
循环在某些环境中的效率往往比printf
低得多,因为流每个字符锁定/解锁一次,而不是printf()
只锁定/解锁一次。它是一个指向字符串的指针,不应该一直添加sizeof(char)吗对于当前地址,请将其与“\0”进行比较并打印字符?在循环和打印每个字符的情况下,在每次迭代之后,偏移量被添加到字符串的开头,并解析整个字符串,直到到达给定的地址。如果我错了,请纠正我@Ctx
fputs(foo, stdout);
for(int i = 0; i < len ; i++) printf("%c", foo[i]) ;
printf("%s", foo) ;