sal*_*r p 22 c memory-management global-variables local-variables static-variables
我的功能将被召唤数千次.如果我想让它更快,将局部函数变量更改为静态是否有用?我背后的逻辑是,因为静态变量在函数调用之间是持久的,所以它们仅在第一次分配时,因此,每个后续调用都不会为它们分配内存并且会变得更快,因为内存分配步骤没有完成.
此外,如果上述情况属实,那么使用全局变量而不是参数会更快地在每次调用时将信息传递给函数吗?我认为参数的空间也分配在每个函数调用上,以允许递归(这就是递归占用更多内存的原因),但由于我的函数不是递归的,如果我的推理是正确的,那么理论上取下参数它更快.
我知道我想要做的这些事情是可怕的编程习惯,但请告诉我它是否明智.无论如何我会试一试,但请告诉我你的意见.
Set*_*eth 25
局部变量的开销为零.每次调用函数时,您已经为参数,返回值等设置了堆栈.添加局部变量意味着您要向堆栈指针添加稍大一些的数字(在编译时计算的数字) .
此外,由于缓存局部性,局部变量可能更快.
如果您只是"数千次"(不是数百万或数十亿)调用您的函数,那么在运行分析器之后,您应该查看算法以获得优化机会.
Re:缓存局部性(在这里阅读更多):经常访问的全局变量可能具有时间局部性.它们也可以在函数执行期间复制到寄存器中,但在函数返回后将被写回到存储器(缓存)中(否则它们将无法被其他任何东西访问;寄存器没有地址).
局部变量通常具有时间和空间局部性(它们通过在堆栈上创建而获得).另外,它们可以直接"分配"到寄存器中,永远不会写入存储器.
M2t*_*2tM 11
找出答案的最佳方法是实际运行一个分析器.这可以像使用两种方法执行多个定时测试一样简单,然后平均结果和比较,或者您可以考虑一个完整的分析工具,它将自身附加到一个过程并绘制出随时间和执行速度的内存使用情况.
不要执行随机微代码调整,因为你有一种直觉,它会更快.编译器的实现略有不同,在一个环境中的一个编译器上的真实情况在另一个配置上可能是错误的.
要解决有关参数较少的注释:"内联"函数的过程实质上消除了与调用函数相关的开销.机会是一个小函数,将由编译器自动排列,但你也可以建议一个函数内联.
在另一种语言C++中,出现的新标准支持完美转发,并且使用rvalue引用完美移动语义,这在某些情况下不需要临时值,这可以降低调用函数的成本.
我怀疑你过早地进行了优化,但是,在你发现真正的瓶颈之前,你不应该关注性能.