C 函数的真实性能测试
Posted
技术标签:
【中文标题】C 函数的真实性能测试【英文标题】:Realistic performance testing of C functions 【发布时间】:2013-12-21 18:10:42 【问题描述】:我目前正在通过调用函数 100 万对某些函数进行基准测试 时间并测量这需要多长时间(挂钟)。示例代码:
/* start timer */
for (int i=0; i<1000000; i++)
/* call my function here */
/* stop timer, result = diff/i */
但是该函数执行得非常快,因为 代码/数据在从那里执行时被加载到 L1 缓存中。 这不是一个现实的场景,因为其他代码将被执行 介于两者之间。
有没有办法在每次循环迭代中刷新或删除 L1 缓存, 所以我的函数是从外部 RAM 执行的?
谢谢
【问题讨论】:
对于每个可能的实现来说,从 RAM 加载代码/数据的时间难道不是完全相同吗?为什么要测量 RAM 性能?你的目标是什么? 看看agner.org/optimize 【参考方案1】:我认为不会。我正在寻找方法来强制使用我正在从事的项目的缓存,研究表明操作系统几乎可以为您处理所有这些。您可能需要更大的数据集来强制使用 RAM,因为现代机器上的缓存非常大。
【讨论】:
【参考方案2】:您没有说明这些功能在做什么。如果您只是使用相同的数据执行相同的函数,每次都会产生相同的结果,那么如果您不使用结果,优化将只执行一次,或者根本不执行。
您使用的是什么计时器。如果您需要准确性,则需要类似于以下内容。
void getSecs()
clock_gettime(CLOCK_REALTIME, &tp1);
theseSecs = tp1.tv_sec + tp1.tv_nsec / 1e9;
return;
Ow Windows using
QueryPerformanceCounter(&astarttime);
如果您每次都从 RAM 加载功能指令,唯一的方法是拥有相同代码的多个副本,这足以将总运行时间增加至计时器的分辨率范围内。即使这样,计算的速度也可能存在很大差异。
【讨论】:
以上是关于C 函数的真实性能测试的主要内容,如果未能解决你的问题,请参考以下文章