循环交换的性能冲突

时间:2013-03-21 11:55:14

标签: c++ performance caching loops

#include <windows.h>

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
    cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
    StartCounter();
int i,j;
    static int x[4000][4000];
#if 1 //Version 1
    for (i = 0; i < 4000; i++) 
    {
        for (j = 0; j < 4000; j++) 
        {
            x[j][i] = i + j; 
        }
    }
#else //Version 2
    for (j = 0; j < 4000; j++) 
    {
        for (i = 0; i < 4000; i++) 
        {
            x[j][i] = i + j; 
        }
    }
#endif    
    cout << GetCounter() <<"\n";
    return 0;
}

我在Win7-32​​bit机器上的VS2012中尝试过上面的代码。

版本1的执行时间为0.200秒,版本-2的执行时间为0.071秒。

数组只是连续的内存区域,而C ++以Row主要方式存储数组。当您在数组中请求元素时,您的操作系统可能会将内存页面引入包含该元素的缓存中。但是,由于接下来的几个元素也在该页面上(因为它们是连续的),下一次访问将已经在 Version-1 的缓存中!

因此,版本1必须快速。

但结果显示版本2很快。

请解释结果冲突的原因。

0 个答案:

没有答案