zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 85-2
    边工作边刷题:70天一遍leetcode: day 85-1
    边工作边刷题:70天一遍leetcode: day 85
    边工作边刷题:70天一遍leetcode: day 86-2
    边工作边刷题:70天一遍leetcode: day 86-1
    边工作边刷题:70天一遍leetcode: day 86
    边工作边刷题:70天一遍leetcode: day 87
    边工作边刷题:70天一遍leetcode: day 88
    边工作边刷题:70天一遍leetcode: day 101
    边工作边刷题:70天一遍leetcode: day 89-1
  • 原文地址:https://www.cnblogs.com/attilax/p/15199239.html
Copyright © 2011-2022 走看看