c – 为什么第一个printf需要更长时间?
发布时间:2020-12-16 10:43:17 所属栏目:百科 来源:网络整理
导读:我正在玩高精度计时器,我的第一个测试之一是使用rdtsc来测量printf.下面是我的测试程序,然后输出.我注意到的是,第一次printf运行时,它在第一次打印时总是比在后续打印时长约25倍.这是为什么? #include stdio.h#include stdint.h// Sample code grabbed from
我正在玩高精度计时器,我的第一个测试之一是使用rdtsc来测量printf.下面是我的测试程序,然后输出.我注意到的是,第一次printf运行时,它在第一次打印时总是比在后续打印时长约25倍.这是为什么?
#include <stdio.h> #include <stdint.h> // Sample code grabbed from wikipedia __inline__ uint64_t rdtsc(void) { uint32_t lo,hi; __asm__ __volatile__ ( "xorl %%eax,%%eax n cpuid" ::: "%rax","%rbx","%rcx","%rdx"); __asm__ __volatile__ ("rdtsc" : "=a" (lo),"=d" (hi)); return (uint64_t)hi << 32 | lo; } int main(int argc,const char *argv[]) { unsigned int i; uint64_t counter[10]; uint64_t sum = 0; for (i = 0; i < 10; i++) { counter[i] = rdtsc(); printf("Hello,worldn"); counter[i] = rdtsc() - counter[i]; } for (i = 0; i < 10; i++) { printf("counter[%d] = %lldn",i,counter[i]); sum += counter[i]; } printf("avg = %lldn",sum/10); return 0; } 并输出: Hello,world Hello,world counter[0] = 108165 counter[1] = 6375 counter[2] = 4388 counter[3] = 4388 counter[4] = 4380 counter[5] = 4545 counter[6] = 4215 counter[7] = 4290 counter[8] = 4237 counter[9] = 4320 avg = 14930 (作为参考,这是在OSX上使用gcc编译的) 解决方法
我的猜测是,在第一次调用printf时,stdout资源不在缓存中,调用需要将它带入缓存 – 因此速度较慢.
对于所有后续调用,缓存已经很热. 第二种可能的解释是,如果这是在Linux上(也可能适用于OSX,我不确定),程序需要设置流方向. (ASCII与UNICODE)这是在使用该流的第一次调用函数时完成的,并且在流关闭之前是静态的. 如果有人认为我完全错了,请随时纠正我. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |