在我进行小型性能问题调查时,我注意到了一个有趣的堆栈分配特性,下面是用于测量时间的模板:
#include <chrono>
#include <iostream>
using namespace std;
using namespace std::chrono;
int x; //for simple optimization suppression
void foo();
int main()
{
const size_t n = 10000000; //ten millions
auto start = high_resolution_clock::now();
for (size_t i = 0; i < n; i++)
{
foo();
}
auto finish = high_resolution_clock::now();
cout << duration_cast<milliseconds>(finish - start).count() << endl;
}
现在重点是foo()
的实现,每个实现将分配总共500000个整数
:
Allocated in one chunk:
void foo() { const int size = 500000; int a1[size]; x = a1[size - 1]; }
Result: 7.3 seconds;
Allocated in two chunks:
void foo() { const int size = 250000; int a1[size]; int a2[size]; x = a1[size - 1] + a2[size - 1]; }
Result: 3.5 seconds;
Allocated in four chunks:
void foo() { const int size = 125000; int a1[size]; int a2[size]; int a3[size]; int a4[size]; x = a1[size - 1] + a2[size - 1] + a3[size - 1] + a4[size - 1]; }
Result: 1.8 seconds.
等等等...我把它分成了16块,结果时间为0.38秒。
请向我解释一下,这是为什么以及如何发生的?
我使用的是MSVC 2013(v120),发布版本。
更新:
我的机器是x64平台。我是用Win32平台编译的。
当我使用x64平台编译时,在所有情况下都会产生大约40ms的结果。
为什么平台选择会如此影响?
void main
зљ„д»Јз ЃгЂ‚FTFY. - Cheers and hth. - Alf