是否可以通过声明变量static
,const
或将其变为global
来获得C ++性能?
答案 0 :(得分:5)
性能取决于很多因素,你不能假设只是改变这些细节就能真正提高性能。
提高性能的最佳方法是了解实施的详细信息,并应用分析工具来识别您的真正瓶颈。
大多数时候,人们倾向于尽早优化代码,花费大量精力并使代码在对应用程序整体性能影响不大的部分上不可读。
干杯
答案 1 :(得分:4)
你不太可能超越内置类型的函数局部变量而把它放在别的地方除外:如果变量的值可以在编译时计算,那么它将成为constexpr
理想的。
static
可能会在函数的每次调用中产生一个小成本,确定对象是否已经初始化,特别是在初始化是线程安全的C ++ 11中。即使它不需要检查,堆栈也可能在缓存内存中,而static
变量则不是。const
可能会有所帮助。如果变量具有非平凡类型,则事物会变得更多,因为例如std::vector<T>
的初始化成本是非平凡的。我不希望使对象static
函数与全局对象相比具有区别(即,我不会将它们设为全局;无论如何都没有全局对象的空间)。但是,使对象static
引入了它们可以在线程之间共享的可能性。如果这是一个问题,增加的锁定和序列化可能会使任何潜在的节省失败,使用基于堆栈的内存的分配器是一种更好的方法来提高成本(假设它们足够小,可以在堆栈上合理地生活)。
答案 2 :(得分:1)
查看编译器生成的汇编代码。
我观察到static const
变量将直接访问只读内存位置中的数据,而不是在堆栈上分配并复制数据。
static
全局变量和全局变量之间的性能提升可以忽略不计(几乎无法估量)。通过编码可以帮助编译器将变量放入寄存器中,从而获得更好的结果。
您还可以通过设置数据以适应单个数据缓存行来获得性能。处理器可以将数据一次性地提取到其高速缓存中并在那里引用它,而不是从外部存储器获取。
当然,如果您希望获得更明显的性能提升,请减少函数调用和分支(跳转)。这些导致处理器重新加载指令高速缓存,这比从外部存储器访问数据变量花费更多的时间。
如果使用全局变量,则会浪费更多时间进行调试。一般而言,程序的开发成本超过其性能。一些游戏程序需要数年才能开发,但多年来从未执行过。