为啥加上printf输出执行就慢了

本文探讨了一个C语言多线程程序中,子线程进行大量计算时,加入打印语句前后性能的巨大差异。通过对比两种情况下的运行时间,解释了为何简单的打印操作会导致程序运行时间显著增加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vi test_printf.c

#include<stdio.h>
#include<pthread.h>
#include<math.h>
#include<unistd.h>

#define NBR_THRS  8

void* busywork(void* arg) {
   long t =  (long) arg;
   double res = 0;

   for(long i =0; i< t; i++)
       res += sin(i) * cos(i);
//printf("res=%f\n", res);
   return NULL;
}

int main() {
pthread_t ID[NBR_THRS];
long i;
for(i=0; i<NBR_THRS; i++)
 pthread_create(&ID[i], NULL, busywork, (void*) 100000000);

for(i=0; i<NBR_THRS; i++)
pthread_join(ID[i], NULL);
}
本程序若去除子程序中的打印语句,在我的电脑上运行仅花0.002秒;若加上子程序中的打印语句,则花20.635秒之多!请大侠们解释下为啥差别那么大?编译都用 gcc -Wall -O3 demo.c -lpthread -lm
### C语言 `printf` 函数输出前导空格的实现方法 在C语言中,通过设置字段宽度可以实现在数字前面添加前导空格。字段宽度由转换说明中的一个正整数指定,该整数定义了输出项所需的最小字符数量。如果实际输出长度小于这个值,则会在左侧填充空格以达到指定的宽度。 以下是具体的实现方式: #### 使用字段宽度 可以通过在 `%d` 或其他格式符之前加上一个正整数来设定字段宽度。例如,`%10d` 表示输出的整数至少占据 10 个字符的空间,不足的部分会用空格补齐[^2]。 ```c #include <stdio.h> int main() { int num = 42; printf("|%10d|\n", num); // 输出右侧对齐,前导为空格 return 0; } ``` 运行结果如下: ``` | 42| ``` 在这个例子中,`num` 的值为 `42`,由于设置了字段宽度为 `10`,因此在数字左边填充了足够的空格使其总长度达到 10 个字符。 #### 左侧对齐 默认情况下,`printf` 的字段宽度是右对齐的。如果希望数字靠左对齐,可以在字段宽度前加 `-` 符号。例如,`%-10d` 将使数字向左对齐,右边补充空格[^2]。 ```c #include <stdio.h> int main() { int num = 42; printf("|%-10d|\n", num); // 输出左侧对齐,后导为空格 return 0; } ``` 运行结果如下: ``` |42 | ``` 在这里,`num` 值仍然为 `42`,但由于指定了左对齐选项 (`-`),所以数字被放置在最左侧,剩余空间则填满空格。 #### 自动调整字段宽度 还可以利用星号 (`*`) 动态地从参数列表中读取字段宽度。这种方式允许程序灵活地控制输出格式[^5]。 ```c #include <stdio.h> int main() { int num = 42; int width = 10; printf("|%*d|\n", width, num); // 右对齐,默认行为 printf("|%-*d|\n", width, num); // 左对齐 return 0; } ``` 这段代码展示了两种情况下的动态字段宽度应用:一种保持默认的右对齐;另一种强制执行左对齐操作。 --- ### 总结 为了在使用 `printf` 时输出带有前导空格的内容,主要依赖于字段宽度的功能。这不仅适用于整型数据 (%d),也广泛支持其他类型的格式化输出 (如浮点数 %f)[^2]。合理配置这些属性能够帮助开发者精确掌控最终呈现效果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值