我是初学c程序员,我读到printf()
是非常复杂的功能,非常慢并消耗许多CPU周期。所以我想知道标准纯c库中是否存在任何函数,它是否比printf()
更快,何时使用该函数以及何时不使用它。我的目标是编写可以在任何计算机和/或嵌入式系统上运行的高效代码
答案 0 :(得分:4)
实际上我发现write()
是printf()
的最快替代品
我已经编写了2个小程序,可以将hello world打印出来
第一个
#include <stdio.h>
#include <string.h>
#include <unistd.h> int main() {
char* h = "hello world\n";
for ( int i=0; i < 100000; i++) write(0,h,strlen(h));
}
和第二个
#include <stdio.h>
int main() {
char* x = "hello world\n";
for (int i =0;i<100000; i++) printf("%s",x); }
并比较了我的电脑上2个程序的运行时间 第一次在2.740s终止 而第二个在3.071s终止
答案 1 :(得分:1)
有理由不鼓励使用printf。
1)printf是一个函数,不太可能是内联函数,因此作为一个函数,它会破坏编译器对它周围代码的优化。如果你有一个循环,它做了很多繁重的工作,并且你希望编译器能够很好地优化它,那么不要在该循环中调用任何非内联函数。
2)stdio路由内容的方式非常依赖于实现,并且可能非常慢。如果您使用开发板来运行代码,那么stdio通常通过JTAG实现。在这种情况下,不仅printf,而且通过stdio的一切都非常慢。如果你使用printf太多,你将很容易达到时间限制。
3)您的目标平台可能无法实施stdio。这对于嵌入式平台来说很常见,因为它们嵌入了其他内容,并且可能没有简单的方法将内容路由到内外。
对你的问题:是和否。
是的:有一些跟踪实用程序设计为轻量级和快速,可以用作printf的更快替代品,例如Texas Instruments的GT_TRACE用于DPS。与printf不同,可以在运行时和编译时轻松关闭跟踪。关闭时,它们只需要很少的时间。
否:跟踪实用程序不是标准C.它们通常是目标平台SDK的一部分
结论:就目前而言,不要过多考虑它。如有必要,在移动到嵌入式平台时将printfs替换为trace。