ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

堆区?栈区?速度差异到底有多少

2021-12-08 14:01:16  阅读:184  来源: 互联网

标签:栈区 堆区 stack 内存 heap 差异


本文档的出发点

堆与栈的概念与异同点,不打算赘述,因为已经有太多相关文章了,本文档以定量化的形式展示与对比堆区与栈区速度上的差异,随便聊聊,希望可以为大家后续的学习与工作,起到一定的帮助作用。

由于自己近期在做效率优化相关的工作,像彻底的深挖下堆区与栈区的区别,探讨下是否会启发效率优化的工作。但是随着自己翻阅了众多的技术文章,发现一个问题,很多文章都是定性的阐述了基本概念,相信对面试会有很大辅助。这些文章基本都可以总结为以下,对两者的几点差异点总结如下:

变量可分配空间大,基于虚拟内存
分配速度
访问速度
维护难,麻烦自动释放

所以,其中关于访问速度查到的都是定性的论断,慢,到底慢多少?我想知道具体的差异,因此决定还是亲历亲为,自己测试下。


运行环境

项目
编译器MSVC
系统Windows 10
芯片Intel
内存8GB
支持指令CPUZ 实测支持 SSE、SSE2等
线程单线程

测量方法

1、以微妙级别统计时间函数 QueryPerformanceCounter 进行测量,官方介绍如下:

QueryPerformanceCounter function - Win32 apps​docs.microsoft.com/zh-cn/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter?redirectedfrom=MSDN正在上传…重新上传取消​

2、每次循环 1000000 次,取均值进行对比;

3、测量函数自己封装一层,所以当本身时间运行很短时,会有 overhead;


测量结果

  1. 每个人的测试环境一定不一样,这里给出的结果,大家可以看其相对值,有个大体概念;
  2. 精力有限,只测试乘法,其它如加法、乘累加、偏移、标量乘等未测;
  3. 取6组长度,均取以2底的指数,因为信号处理领域FFT的缘故,经常出现此类长度;
  4. 为了区分读与写的速度差异,如下分为四组,比如 stack*heap->heap,就表示该乘法中,第一个变量表示源自栈区,第二个变量源自堆区,写入地址为堆区,其他表示方法以此类推。

乘法速度测试结果,单位微秒:

stack*stack->stackheap*heap->heapstack*heap->heapstack*heap->stack
641.11.11.11.1
2561.11.21.21.1
10241.11.81.71.1
40961.24.13.61.2
163841.713.011.01.7
655363.549.33.541.2

结论

1、通过典型的 stack*heap->heap 这一组可以发现,当前软硬环境下,堆区和栈区对于的速度已经几乎不敏感,重点在于对内存的速度上了。

2、随着向量长度的增加,四者运算时间差异显著拉大,原因自己还没有探究明白,不知是否因为内存不连续导致

3、所以如果代码中有大量频繁的写操作,建议将对应内存开辟在栈上,应该可以大幅度优化效率。

 

标签:栈区,堆区,stack,内存,heap,差异
来源: https://blog.csdn.net/weixin_40571814/article/details/121789430

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有