c中全局变量的性能影响

har*_*ari 5 c optimization performance global-variables function-calls

我有5个函数被调用10000次(平均).所有这些都修改/使用某些变量.

我知道拥有全局变量是不好的做法.但是出于性能的考虑,将它们保持全局而不是传递它们是否有意义 - 特别是当我多次进行函数调用时?

或者我在性能方面不会获得太多收益?

R..*_*R.. 8

出于性能目的,不要引入全局变量/全局状态.这是错误的,与所有良好的编码实践相反,通常不会有助于提高性能(甚至可能会受到伤害).

如果您发现传递大量变量的成本太高,您可以将它们全部放在上下文中struct并将单个指针传递给struct.这样就可以避免创建全局状态(甚至static存储持续时间变量是全局状态),这会阻止您的代码在多个实例中使用.成本几乎为零,实际上它在位置无关代码(共享库或位置无关的可执行文件)中的成本低于全局变量.


And*_*mbe 5

通过减少传递给函数的参数数量,通过预分配变量(例如全局或静态变量),您可能会看到小的性能改进

性能的变化绝对取决于许多因素,其中最重要的是您正在开发的平台。如果您正在为微型微处理器开发,则将参数复制到堆栈(来自调用函数)所花费的时间和访问堆栈所花费的时间可能占总执行时间的足够大的比例,以保证这一点。

请注意,在传递参数所花费的时间很长的情况下,您可能会发现其他一些建议(例如,将指针传递给结构,将指针传递给静态变量)也不会提供任何好处。使用全局变量确实让编译器/链接器有机会对这些变量进行硬编码访问,而不必从堆栈上的指针间接访问它们。这与没有任何缓存的处理器特别相关。

当然,这一切都非常依赖于目标,并且高度依赖于您使用的处理器的指令集。在任何具有合理指令集的平台上,您都应该看到改进。

但是,只有在分析此代码后才应采取此类措施。在大多数平台上,对于任何非平凡的函数,传递参数和访问它们所花费的时间都是微不足道的。任何潜在的性能提升都将以更困难的代码维护为代价。

通过使用其他优化技术,您很可能会获得更大的性能提升。检查问题以尝试一些方法。


编辑:我从您的评论中看到您仍处于该项目的设计阶段。

现在进行这样的优化还为时过早。在这个阶段,通过优化您使用的算法,您将对性能产生更大的影响,而不是像这样在指令级别进行最小化。