分享

C++静态变量、临时变量、性能分析

 地势坤行者无疆 2018-02-06
现在有这个疑问,我有一个功能函数需要频繁调用,这个函数里面的临时变量比较多,我担心这么多的临时变量在这个高频调用的函数里面会影响程序执行的效率,我想将这些局部临时变量改为局部静态变量,不知道这样做能不能提高程序执行效率?

        另外,在程序性能优化方面有什么好的建议可以说说?

回答:

1.局部变量被频繁调用,计算机会自动把这个放到寄存器里面吧,用作静态局部变量,貌似也提升不了多高的效率。编译出来的执行文件还增大了。如果局部变量的确很多,的确可以考虑当作局部静态变量。注意内存对齐

2.静态全局变量存储在全局数据区中,还需要显式的初始化,如果变量实在很多的话,我想这样做应该可以提高执行效率,不过显著提高效率的方式应该是重构代码逻辑,或从代码框架出发,这样应该不是很明显

3.访问栈上的数据是最快的。
执行效率问题不在于数据的声明,而在于算法。
你这个函数临时变量比较多,那么肯定不适合内联。
综合起来你只能在使用数据的算法上做文章。

4.静态变量不管是全局的还是局部的都是存储在静态全局区的,因为静态变量具有记忆功能,就是你的函数执行一次后,静态变量的值会保存在内存中,当你第二次调用的时候会出现意外的或是不想要的结果。不到万不得已的时候不要将函数中的局部变量设置为静态的,因为你很难控制函数执行中这些变量的值到底是多少。

5.首先要看你的函数逻辑上需不需要在每次调用时都重新初始化本地变量。如果需要的话,这么做就没有意义了。

如果不需要,并且本地变量的创建和撤消的代价很高,可以放在经常调用的函数外面,作为参数传递给函数。如果这样的变量很多,可以打包在一个结构体里,把对象指针传递给函数。

其实遇到这种情况,你就要考虑改变一下程序结构了。把你所说的函数本地变量设计成一个类的私有成员,把这个函数设计成类的公有成员。在外层定义一个类的对象,需要时调用这个对象的公用函数。

6.为什么不将改前改后两个版本的程序实际运行测试并对比呢?

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

使用电脑计时有时误差会很大,因为待测程序段的运行会影响电脑时钟。
将待测程序段循环足够多次,手动掐秒表计时可能更准确。

7.我认为从算法上考虑,简单的把局部变量换成静态变量不是一个好办法,因为局部变量和静态变量都有它适用的范围和条件。

8.看看 C++性能是怎么提高的 内联 、无锁线程,数据存到哪里无所谓关键是处理数据的算法 决定效率

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多