比 printf 更快的函数
a function that is faster than printf
我是初学者 c 程序员,我读到 printf()
是非常复杂的函数,它非常慢并且消耗许多 CPU 周期。所以我想知道标准纯 c 库中是否存在任何函数并且是否比 printf()
快,以及何时使用该函数以及何时不使用它。我的目标是编写可以在任何计算机上运行的高效代码 and/or 嵌入式系统
实际上我发现 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.071 秒终止
不鼓励使用 printf 的原因有很多。
1) printf 是一个函数,不太可能是可内联的,因此作为一个函数,它会破坏编译器对其周围代码的优化。如果你有一个循环做很多繁重的工作并且你希望编译器很好地优化它,那么不要在该循环内调用任何非内联函数。
2) stdio 输出内容的方式非常依赖于实现,并且可能非常慢。如果您使用开发板来 运行 代码,那么 stdio 通常是通过 JTAG 实现的。在这种情况下,不仅 printf,而且通过 stdio 的一切都非常慢。如果你使用 printf 太多,你很容易达到时间限制。
3) 您的目标平台可能未实现 stdio。这对于嵌入式平台很常见,因为它们嵌入在其他东西中,可能没有简单的方法将内容传入或传出。
关于你的问题:是和否。
是的:有一些跟踪实用程序被设计为轻量级和快速的,可以用作 printf 的更快替代品,例如德州仪器 (Texas Instruments) 用于其 DPS 的 GT_TRACE。与 printf 不同,trace 可以在 运行 时间和编译时间轻松关闭。关闭时,它们只需要很少的时间。
否:跟踪实用程序不是标准 C。它们通常是目标平台 SDK 的一部分
底线:现在,不要想太多。如有必要,在迁移到嵌入式平台时将 printfs 替换为 trace。
我是初学者 c 程序员,我读到 printf()
是非常复杂的函数,它非常慢并且消耗许多 CPU 周期。所以我想知道标准纯 c 库中是否存在任何函数并且是否比 printf()
快,以及何时使用该函数以及何时不使用它。我的目标是编写可以在任何计算机上运行的高效代码 and/or 嵌入式系统
实际上我发现 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.071 秒终止
不鼓励使用 printf 的原因有很多。
1) printf 是一个函数,不太可能是可内联的,因此作为一个函数,它会破坏编译器对其周围代码的优化。如果你有一个循环做很多繁重的工作并且你希望编译器很好地优化它,那么不要在该循环内调用任何非内联函数。
2) stdio 输出内容的方式非常依赖于实现,并且可能非常慢。如果您使用开发板来 运行 代码,那么 stdio 通常是通过 JTAG 实现的。在这种情况下,不仅 printf,而且通过 stdio 的一切都非常慢。如果你使用 printf 太多,你很容易达到时间限制。
3) 您的目标平台可能未实现 stdio。这对于嵌入式平台很常见,因为它们嵌入在其他东西中,可能没有简单的方法将内容传入或传出。
关于你的问题:是和否。
是的:有一些跟踪实用程序被设计为轻量级和快速的,可以用作 printf 的更快替代品,例如德州仪器 (Texas Instruments) 用于其 DPS 的 GT_TRACE。与 printf 不同,trace 可以在 运行 时间和编译时间轻松关闭。关闭时,它们只需要很少的时间。
否:跟踪实用程序不是标准 C。它们通常是目标平台 SDK 的一部分
底线:现在,不要想太多。如有必要,在迁移到嵌入式平台时将 printfs 替换为 trace。