【发布时间】:2012-10-16 04:06:34
【问题描述】:
我正在分配 2 个相同大小的数组,一个在堆栈上,一个在堆上,然后通过简单的赋值对它们进行迭代。
可执行文件被编译为主线程堆栈分配 40mb。
此代码仅经过测试,可在带有 /STACK:41943040 链接器标记的 vc++ 中编译。
#include "stdafx.h"
#include <string>
#include <iostream>
#include <malloc.h>
#include <windows.h>
#include <ctime>
using namespace std;
size_t stackavail()
{
static unsigned StackPtr; // top of stack ptr
__asm mov [StackPtr],esp // mov pointer to top of stack
static MEMORY_BASIC_INFORMATION mbi; // page range
VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi)); // get range
return StackPtr-(unsigned)mbi.AllocationBase; // subtract from top (stack grows downward on win)
}
int _tmain(int argc, _TCHAR* argv[])
{
string input;
cout << "Allocating 22mb on stack." << endl;
unsigned int start = clock();
char eathalfastack[23068672]; // approx 22mb
auto length = sizeof(eathalfastack)/sizeof(char);
cout << "Time taken in ms: " << clock()-start << endl;
cout << "Setting through array." << endl;
start = clock();
for( int i = 0; i < length; i++ ){
eathalfastack[i] = i;
}
cout << "Time taken in ms: " << clock()-start << endl;
cout << "Free stack space: " << stackavail() << endl;
cout << "Allocating 22mb on heap." << endl;
start = clock();
// auto* heaparr = new int[23068672]; // corrected
auto* heaparr = new byte[23068672];
cout << "Time taken in ms: " << clock()-start << endl;
start = clock();
cout << "Setting through array." << endl;
for( int i = 0; i < length; i++ ){
heaparr[i] = i;
}
cout << "Time taken in ms: " << clock()-start << endl;
delete[] heaparr;
getline(cin, input);
}
输出是这样的:
Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 45
Free stack space: 18872076
Allocating 22mb on heap.
Time taken in ms: 20
Setting through array.
Time taken in ms: 35
为什么堆栈数组的迭代速度比堆上的相同?
编辑: nneonneo 吐出我的错误
现在输出是相同的:
Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 42
Free stack space: 18871952
Allocating 22mb on heap.
Time taken in ms: 4
Setting through array.
Time taken in ms: 41
根据 Öö Tiib 在下面的回答发布构建:
Allocating 22mb on stack.
Time taken in ms: 0
Setting through array.
Time taken in ms: 5
Free stack space: 18873508
Allocating 22mb on heap.
Time taken in ms: 0
Setting through array.
Time taken in ms: 10
【问题讨论】:
-
因为堆栈在内存中更高,这意味着 CPU 需要进一步获取它:-) 不,只是在开玩笑。但是,您可能需要多次运行程序以获得更好的样本,并可能切换操作并重试。一个样本量是统计学家的噩梦。
-
@paxdiablo:这是我很久以来听到的最可怕的解释 X__X
-
是的,我不知道 pax 是在开玩笑还是我错过了问题中非常明显的东西。 :)
-
嗯,为什么有时使用
std::cout而其他时候使用cout?保持一致... -
FWIW,我无法重现这些数字。堆的时间总是比堆栈的时间长——即使大小被校正为匹配。
标签: c++ visual-c++