paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.
paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.
#----为什么要设计堆栈,它有什么独特的用途?
为了性能 .... 堆比栈的性能
也有的说法为了编程容易...这个是错误的.因为使用堆+func也能实现编程简单地..
#----为什么stack 比堆快,stackAccess 要快两到三倍
主要的2点:: 使用堆额外的操作多,而且机器硬件上直接支持栈操作..
堆栈都是一段内存条中的内存区域,感觉上,应该上没有多大的访问速度差别..但是,实际上,还是有很大的的速度效率区别..
1.存取路径短1倍. 堆的分配/释放都要比栈要慢的多
结论:可以明显看出,前者直接有目的地从栈中读取数据到寄存器eax中,后者则要先把指针值读出来,再通过指针去找需要的地址的值,根据我们关于计算机组成原理的常识,多了一次访问内存,显然效率低了。
在使用栈时,是直接从地址读取数据到寄存器,然后放到目标地址;使用堆时,第一步将分配的地址放到寄存器,然后取出这个地址的值,然后放到目标地址。大概是这样,堆的数据读出要多一步,我现在没环境,明天去看一下汇编代码就清楚了。
1.a 堆在分配和释放时都要调用函数..他们做了很多额外的工作,而栈却不需要这些
栈只是个LIFO的队列。堆的结构要复杂得多。
1.b 机器直接支持
栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高
cpu有专门的寄存器(esp,ebp)来操作栈,堆都是使用间接寻址的
作者 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
2. 另外由于栈访问比较频繁,被高速Cache缓存的几率比较大,速度也会快 。
栈在CPU内部的内存cache命中率高,因为更满足局部性。
3.栈的变量可以直接存储在寄存器...所以,更快.
局部变量的操作是直接读写寄存器
4.因为堆 经常造成内存碎片,造成存取速度大的减少..
#-----------另一个性能提升的方法VirtualAlloc 快速内存
.VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存
#静态变量速度怎么样
instanceAccess 和 staticAccess 的执行时间基本相同。但是,stackAccess 要快两到三倍
参考 :: 尽可能使用堆栈变量(我比较喜欢) - 西部数码站长资讯中心.htm
#怎么使用栈??
局部变量法
尽可能不个静止的变量,实例变量先转换成个局部变量,计算结束后在转换出去...
尽可能使用原生数据类型...基本数据类型包括byte、int、char、long、float、double、boolean和short。
#---硬堆栈跟软堆栈
硬堆栈是由硬件自动完成,其堆栈区也是固定的,软堆栈属于用户程序中的临时区
#----栈空间大小不大,不过能调整了..
栈空间是1M左右的。并不要求很大,一般对象才几个字节,1M大约有一百万字节,所以还是挺充足的。而且,当一个函数返回之后,他所占的栈空间就会被回收,提供给下一个函数使用。综上,能不用new最好不new
paip.提升性能3倍--使用栈跟VirtualAlloc代替堆的使用.的更多相关文章
- paip.提升性能--多核cpu中的java/.net/php/c++编程
paip.提升性能--多核cpu中的java/.net/php/c++编程 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http ...
- paip. 提升性能---hibernate的缓存使用 总结
paip. 提升性能---hibernate的缓存使用 总结 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- paip.提升性能---mysql 优化cpu多核以及lan性能的关系.
paip.提升性能---mysql 优化cpu多核以及lan性能的关系. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...
- paip.提升性能---mysql 性能 测试以及 参数调整.txt
paip.提升性能---mysql 性能 测试以及 参数调整.txt 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://b ...
- paip.提升性能---jvm java 工具使用.
paip.提升性能---jvm java 工具使用. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- paip.提升性能---协程“微线程”的使用.
paip.提升性能---协程的使用. 近乎无限并发的"微线程" 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:h ...
- paip.提升性能---并行多核编程哈的数据结构list,set,map
paip.提升性能---并行多核编程哈的数据结构list,set,map vector/copyonwritearraylist 都是线程安全的. 或者经过包装的list ::: collection ...
- paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
paip.提升性能---list,arraylist,vector,linkedlist,map的选用.. arraylist,vector基本一样,但是,vector线程安全的. 作者Attilax ...
- paip.提升性能---string split
paip.提升性能---string split 大概一万次就能看到慢的兰.. /////split 慢的原因.因为使用了正则表达式的,这样,就慢的了.. 作者Attilax 艾龙, EMAIL: ...
随机推荐
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
- C# DataSet和DataTable详解
1.C# DataSet和DataTable详解:http://www.cnblogs.com/top5/archive/2009/04/23/1441765.html 2.DataSet和DataT ...
- ASP.NET ZERO 学习 JTable的ChildTable用法
效果图: Jtable的子表用法: _$masterTable.jtable({ title: app.localize('PharmacyInventory'), openChildAsAccord ...
- 获取datagrid选择行
var rows = $('#dg').datagrid('getChecked'); var ids = ''; for (var i = 0; i < rows.length; i ...
- 转发(request.setRequestDispacter)和重定向(response.sendRedirect)的区别以及转发的include和forward的区别
//response 重定向的时候,url是会跳转到新的页面的,输入的地址要包含项目名(可以跳到项目之外的页面,比如百度)//request 请求转发的时候,url是不会跳转到新页面的,输入的地址不包 ...
- Python:print显示颜色
显示颜色格式:\033[显示方式;字体色;背景色m......[\033[0m] ------------------------------------------- --------------- ...
- PHP 输出缓冲控制(Output Control) 学习
php 缓冲简介 其实我对php ob 系列印象还是很模糊,具体怎么玩的,还不是很了解,平时curd,确实对这些内容没有深入.作为phper 甚是惭愧.网上搜了一通,互相copy,代码运行不能出现作者 ...
- SQlserver 行转列
列转行编程中很容易碰到,小弟在此总结下, 行转列暂时还没遇到,遇到再补充. 列转行: , , , , 以上都是以逗号分隔,分隔符可以自定义.
- 【Linux】LAMP环境的搭建
LAMP定义 LAMP指的Linux(操作系统).ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母,一般用来建 ...
- html5新特性之音频、视频
1.视频 标签video video标签的属性 属性 描述 autoplay 视频就绪后自动播放 preload 视频在页面加载时加载 loop 视频播放完成后循环播放 controls 显示控件 s ...