#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-32bit 机器上的 VS2012 中尝试过上面的代码。
版本 1 的执行时间为 0.200 秒,版本 2 的执行时间为 0.071 秒。
数组只是内存的连续区域,C++ 以 Row 主要方式存储数组。当您请求数组中的元素时,您的操作系统可能会将内存页面引入包含该元素的缓存中。但是,由于接下来的几个元素也在该页面上(因为它们是连续的),因此下一个访问将已经在Version-1的缓存中!
所以,Version-1 必须要快。
但结果显示版本 2 速度很快。
请解释结果冲突的原因。