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 函数的真实性能测试的主要内容,如果未能解决你的问题,请参考以下文章

怎么进行性能测试

性能测试---流程篇

Go语言使用gorm对MySQL进行性能测试

性能测试--测试流程篇

功能性能测试

Locust 创建性能测试