Pan*_*oro 6 c performance android-ndk
我现在已经使用Java for Android编程了很多.由于性能对于我正在研究的东西非常重要,我最终只是在发送垃圾邮件给全局变量.我想现在每个人都会冲进去告诉我这是有史以来最糟糕的风格,但是让我们保持简单.对于Android,局部变量意味着垃圾收集和垃圾收集是杀死性能的东西.
最近我开始使用NDK.现在我觉得实际上采取所有局部变量并将它们更改为全局变量的冲动.我想知道如果这在c代码中有任何意义.显然这不是好风格,但如果速度需要,我会很乐意牺牲风格.
我已经浏览过关于本地和全球的旧线程,但我还没有找到关于速度的任何信息.所以我的问题是,如果我经常调用一个函数,它是否与创建局部变量的速度相关并在函数完成后死亡?或者根本不重要,我可以愉快地继续使用局部变量.
我会自己测试一下,但由于某种原因,我的应用程序的性能像过山车一样上下起伏,我怀疑我是否能真正理解数据.我希望有人可以在我重写整个代码之前帮助我:)
在C中,性能差异取决于硬件.在RISC处理器上加载全局是更多指令(因为您必须在单独的指令中加载地址的两半而不是添加到堆栈指针),然后您需要应对缓存问题.在大多数情况下,您可以依赖缓存中的本地变量.使用全局变量会使缓存稍微颠簸,某些功能可能会受到非常不利的影响.
如果在运行应用程序时性能差异很大,那么关于局部变量对性能影响的断言很可能是无关紧要的.
在C中创建局部变量的"成本"为零; 它只是碰撞一个寄存器(堆栈指针)为本地腾出空间.然后通过适当的方式初始化该变量.您应该能够通过随意检查来了解这是否昂贵.当函数退出时,无论您拥有多少局部变量,堆栈指针都会返回其先前的值.
但是,如果您对"局部变量"的定义是堆分配的对象,则会受到内存分配成本的影响.在我看来,内存分配非常慢,所以无论你如何摆脱malloc/free(以及Java中的'new'),你都会越好.(我制作游戏,我们倾向于使用dlmalloc,但即使这对于常规使用来说太慢;每次通话400ns也会快速增加.)