在C++中较常接触的内存对象一般都存储于两种空间中:
1.栈(临时变量)
2.堆(动态分配 new / malloc)
临时变量的内存分配在程序编译的时候已经预设好了,而动态分配的内存则要等到程序实际运行时跟系统进行申请的,效率肯定比前者要低。具体细节可以查阅这位博主的博客分析 栈为什么效率比堆高
本文中想要测试的是栈比堆具体快多少,在实际工程应用中,应该如何取舍。
测试用例:
#include <stdio.h>
#include <windows.h>
struct Position
{
int x;
int y;
Position()
{
x = 0;
y = 0;
}
};
void TestStack(int nTimes)
{
for (int i = 0; i < nTimes; i++)
{
Position PosTest;
PosTest.x = 10;
PosTest.y = 10;
}
}
void TestHeap(int nTimes)
{
for (int i = 0; i < nTimes; i++)
{
Position* pTest = new Position();
pTest->x = 10;
pTest->y = 10;
delete pTest;
}
}
int main()
{
LARGE_INTEGER nFreq,t1,t2,t3;
double dtStack,dtHeap;
int nTimes = 100000;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&t1);
TestStack(nTimes);
QueryPerformanceCounter(&t2);
TestHeap(nTimes);
QueryPerformanceCounter(&t3);
dtStack = (t2.QuadPart - t1.QuadPart)/(double)nFreq.QuadPart;
dtHeap = (t3.QuadPart - t2.QuadPart)/(double)nFreq.QuadPart;
printf("stack=%lfs,heap=%lfs\n", dtStack, dtHeap);
}
在博主的机器(公司的一般机器)上运行测试,其结果为:
nTimes为10000(循环10000次)时,栈模块的耗时为52us,堆模块耗时585us。
nTimes为100000时,栈模块的耗时为563us,堆模块耗时6665us。
nTimes为1000000时,栈模块的耗时为6147us,堆模块耗时62690us。
可以观察到,在该测试模型中,堆耗时为栈耗时的10倍左右,但因两者耗时单位均为微秒,即使循环100万次,耗时差距也仅是50~60毫秒左右(耗时差距会因为不同数据结构/机器配置产生些许差异)。
结论:以博主的测试耗时为参考,若实际工程中并不追求毫秒级别的效率差异,或服务并发量小(小于百万级别),动态分配是可以大胆采用的。