c++ 临时变量与动态分配效率测试

在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毫秒左右(耗时差距会因为不同数据结构/机器配置产生些许差异)。

结论:以博主的测试耗时为参考,若实际工程中并不追求毫秒级别的效率差异,或服务并发量小(小于百万级别),动态分配是可以大胆采用的。

猜你喜欢

转载自blog.csdn.net/Vis_Stu/article/details/102542763