加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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)这是在使用该流的第一次调用函数时完成的,并且在流关闭之前是静态的.
我不知道设置这个方向的开销是多少,但这是一次性成本.

如果有人认为我完全错了,请随时纠正我.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读