2

我正在为低级 C/x64 代码编写速度优化,我想知道是否有任何标准方法来衡量哪种选择更快更可靠。

在比较技术 A 和 B 时,我目前的技术涉及重复 A 几百次,而不是重复 B 大约相同的时间,并比较每个技术所花费的平均时间。然后我在几十个例子中重复这个,然后比较每种技术的平均值。(我对平均分钟做同样的事情)

不幸的是,这种方法似乎存在一些问题。例如,如果我考虑使用第三种技术进行测试,但实际上使用 B,那么 B 的第二次运行几乎系统性地更快(缓存效果?),快到足以击败 A。

还有更合适的技术来分析 JIT 代码吗?

4

2 回答 2

1

这个函数应该可以解决问题。

static unsigned long long rdtsctime() {
    unsigned int eax, edx;
    unsigned long long val;
    __asm__ __volatile__("rdtsc":"=a"(eax), "=d"(edx));
    val = edx;
    val = val << 32;
    val += eax;
    return val;
}

调用一次以获取当前时间,然后再次调用它并减去第一个值以获取经过时间(以周期为单位)。

于 2013-05-22T18:38:53.483 回答
0

这是个好问题。我一直想知道衡量绩效的最佳方法是什么。我不认为你会找到一个简单的答案。我通常做的是使函数指针指向函数的不同变体,然后在多次迭代中为每个函数计时。我使用了来自 OpenMP 的函数(即使不使用任何线程)omp_get_wtime()来进行计时。例如,假设我有一个函数的两个变体,foo_v1并且,它采用一个包含多个元素foo_v2的数组。我可以用来衡量这两个功能的性能的通用方法如下:an

#include <stdio.h>
#include <omp.h>
void foo_v1(float *a, const int n) {
   //    
}
void foo_v2(float *a, const int n) {
   //    
}
int main() {
    const int n = 1000;
    float *a = new float[n];
    void (*fp[2])(float *a, const int n);
    fp[0] = foo_v1;
    fp[1] = foo_v2;
    const int nrepeat = 1000; //some number large so that the functions take at least a second to finish
    for(int j=0; j<2; j++) {
        double dtime = omp_get_wtime();
        for(int i=0; i<nrepeat; i++) {    
            fp[j](a, n);
        }
        dtime = omp_get_wtime() - dtime;
        printf("time in seconds %f\n", dtime);
     }
     delete[] a;
}

您可以在此处查看我在赏金问题中使用 16 个函数变体执行此操作的示例。 加快浮动转换的速度?

我不确定这种比较性能的方法有多好,但这是我一直在使用的方法。

于 2013-05-22T19:25:59.723 回答