宏定义如何影响性能?

Hao*_*oyu -2 c++ algorithm macros matrix

我正在研究一个旋转二维数组的项目.当我使用宏来替换某些代码时,结果令人惊讶,因为一切都完全相同.完成任务所需的时间可能会有很大差异.我一直认为宏只是一个占位符,但这怎么可能发生呢?

struct pixel
{
    unsigned short red;
    unsigned short green;
    unsigned short blue;
} ;

//n is the # of elements in the two dimensional array
void rotate1(int n, pixel *src, pixel *dst)
{
    int row, col, max = n - 1;
    for (row = 0; row < n; row++)
        for (col = 0; col < n; col++)
            *(dst+ (((max - row)*n)+col)) = *(src+ (row*n + col));
}

void rotate11(int n, pixel *src, pixel *dst)
{
#define TARGET  *(dst + (((max - row)*n)+col))
#define SOURCE  *(src + (row*n + col))

    int row, col, max = n - 1;
    for (row = 0; row < n; row++)
        for (col = 0; col < n; col++)
        {
            TARGET = SOURCE;
        }

}
Run Code Online (Sandbox Code Playgroud)

结果是:

Time= 2.25 n= 512  Method= rotate1 
Time= 2.18 n= 512  Method= rotate11 

Time= 8.05 n= 1024  Method= rotate1 
Time= 8.08 n= 1024  Method= rotate11 

Time= 25.18 n= 2048  Method= rotate1 
Time= 25.24 n= 2048  Method= rotate11 

Time= 104.38 n= 4096  Method= rotate1 
Time= 104.21 n= 4096  Method= rotate11

Time= 1272.41 n= 8192  Method= rotate1 
Time= 423.00 n= 8192  Method= rotate11
Run Code Online (Sandbox Code Playgroud)

当n很小时,两者具有相似的性能,但随着n越来越大,rotate11时间越来越少.

yan*_*yan 7

就编译器而言,这两个示例完全相同.你在同一次运行中运行这两个例子吗?可能发生的是第一个运行的函数(无论你是否使用过宏)都填充了缓存,第二个函数运行速度要快得多.

如果更改调用函数的顺序,或者每次执行限制为一个函数运行,该怎么办?您应该看到几乎相同的性能.