我用不同的参数连续几次调用snprintf
。我花了每个snprintf
所需的时间。我发现第一次拨打snprintf
的时间最长。之后,调用相同函数所需的时间减少,直到收敛为止。这是什么原因?我尝试过其他功能,也表现出相同的行为。
我问这个是因为它与测试代码性能有关。通常在主程序中,它只会被定期调用。但是,当我像循环一样单独测试函数时,它会更快,因此导致性能测量的不准确。
第一个调用需要4000 ++ ns,第二个调用需要1700ns,第三个调用需要800 ns直到大约10个++调用,它减少到130ns。
snprintf(buffer, 32, "%d", randomGeneratedNumber1);
snprintf(buffer, 32, "%d", randomGeneratedNumber2);
.
.
.
答案 0 :(得分:3)
最可能的解释是,功能代码将在第二次执行后终止于指令缓存中,就像输入数据(如果有的话)将在数据缓存中一样。此外,第二次可以正确预测某些分支。
所以,总而言之,“事情已被缓存”。
答案 1 :(得分:2)
您的程序可能会动态链接到包含snprintf()
的库。第一次延迟将是加载库所需的时间。
答案 2 :(得分:1)
搜索TLB和缓存。但是对于小答案,在这些小代码中,缓存会影响执行时间。对于大型代码,除了缓存之外,许多内存页面将被换出,以便以后使用从硬盘交换到你的ram。因此,当您经常使用部分代码时,它将不会被换出,因此它的执行时间会得到增强。