性能:我应该在经常调用的函数中使用全局变量吗?

Posted

技术标签:

【中文标题】性能:我应该在经常调用的函数中使用全局变量吗?【英文标题】:Performance: should I use a global variable in a function which gets called often? 【发布时间】:2014-08-01 11:02:56 【问题描述】:

首先,让我坦白这样一个事实,即我是一个新手,试图以正确的方式做事,这意味着我时不时地对什么是正确的方式产生矛盾。

我正在修改包含函数的外围设备的驱动程序 - 我们称之为 Send()。在函数中,我有一个时间戳变量,因此函数循环指定的时间量。

那么,我应该将变量声明为全局变量(这样它总是在内存中,并且每次函数运行时都不会浪费时间来声明它)还是将变量留在函数上下文中(并避免糟糕的设计具有全局变量的模式)?

请记住,该函数每毫秒可以调用多次。

【问题讨论】:

变量声明仅在编译期间发生,而不是在运行时发生。 那么在本地声明变量不会影响执行时间? 测量,不要猜测。但是,假设它是一个简单的类型,一个局部变量应该花费很少或没有,而且访问起来可能比全局变量更快。 除了测量之外,您还可以随时比较两种方式生成的汇编代码。 您能描述一下您打算如何在Send() 中使用这个神秘的时间戳变量吗?了解上下文将更容易提出解决方案 【参考方案1】:

本地变量与全局变量的执行速度不应有显着差异。唯一真正的区别是变量所在的位置。局部变量在栈上分配,全局变量在不同的内存段。确实每次进入例程时都会分配局部变量,但分配内存是移动堆栈指针的一条指令。

在决定一个变量应该是全局变量还是局部变量时,有许多更重要的考虑因素。

【讨论】:

优秀。显然我对可变分配速度知之甚少。 Localstack allocation 不是同义词 - 声明为 static 的局部变量与具有静态链接的全局变量和变量具有相同的存储类(即文件范围)。 C++ 还具有命名空间和类范围 - 没有变量需要是全局的。 @Clifford 您对静态本地和静态链接变量是正确的。我的回答故意限制了它的细节。我只是想说明执行速度并不是避免使用局部变量的理由。 请问“更重要的考虑因素”是什么?【参考方案2】:

在实现驱动时,尽量避免使用全局变量,因为:

    它们是线程不安全的,您不知道用户应用程序的调度方案(事实上,即使没有线程,使用同一驱动程序的多个实例也是一个潜在问题)。

    它会自动生成数据部分,作为链接到驱动程序的任何应用程序的可执行映像的一部分(这是应用程序程序员可能希望避免的)。

【讨论】:

【参考方案3】:

您是否分析了代码的完全优化的发布版本并确定瓶颈是此函数中的小分配?

您提出的更改是微优化;对代码的一小部分进行更改,以提高其效率。如果上述问题的问题正如我所期望的那样是“否”,那么您甚至不应该考虑这些事情。

为您的代码选择正确的算法。使用惯用技术编写代码。不要写微优化。您可能会惊讶于您的编译器在为您优化代码方面有多出色。它通常能够优化掉这些小分配,但即使不能,您仍然不知道它们带来的性能损失是否明显或显着。

【讨论】:

不,我没有分析应用程序(但会尽快)。感谢您对微优化的建议,请记住! 这没有回答问题【参考方案4】:

对于驱动程序,通常与位置无关,全局变量通过 GOT 表间接访问,除非 IP 相关操作可用(即 x86_64、ARM 等)

如果是 GOT,你可以认为它是一个额外的间接指针。

但是,即使使用额外的指针,如果它“仅”以毫秒频率调用,也不会产生任何明显的差异。

【讨论】:

以上是关于性能:我应该在经常调用的函数中使用全局变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

Python函数全局变量?

Delphi 中全局变量无法被修改

lua的局部变量为什么要比全局变量快

var 是我们声明全局变量和函数的唯一选择吗? [关闭]

matlab global定义全局变量的问题

使用xlwings在excel中的函数调用之间保留python全局变量