如果在 update/listener 中使用局部作用域变量以避免每次都创建它,是否最好将其设为 class 变量?

Is it better to make a local scope variable a class variable if it is being used in an update/listener to avoid it being created every time?

考虑以下代码片段,您可以在其中从 MyType 实例参数中获取浮点数(或相应类型):

void myMethod(MyType floatArgument) {
    float myFloat = (float)MyType.Value;
    if (myFloat < 100) {
        //not meaningfull code
    }
}

如果在侦听器中连续调用该方法,或者在物理或图形引擎的更新中,将其设为这样的 class 变量是否在效率方面确实更好? :

private float myFloat
void myMethod(MyType floatArgument) {
    myFloat = (float)MyType.Value;
    if (myFloat < 100) {
            //not meaningfull code
    }
}

该变量仅在本地范围内使用,所以据我所知每次都会在堆栈中创建它。因此,从中创建一个 class 变量会更快,这样即使该变量的内存也会在堆上并且内存消耗会更高,代码会 运行 更快。

我知道对于一个浮点数来说可能没什么大不了的,但如果有很多变量或一个大数据的实例就把它当作它吧class。

这个推理正确吗?

在我看来,这是一个设计决定。但大多数情况下,您可以简单地创建一个本地范围变量。为什么?这是每个设计,如果你非常、非常、非常频繁和快速地调用你的方法,那么你的记忆可能会遇到麻烦。另一方面,当你将它移动到 class 范围时,每次你创建你的 class 你都会为你的变量寻址内存,它永远不会被使用。所以,这取决于你和你的设计。即使是性能,如果你有一个对象,几乎没有性能问题,而不是因为你的对象被设置为引用而保留一点内存来保存它。

为了代码更简洁,我建议在这些情况下使用本地作用域。

正如Tinoz所说,它更多的是一种设计设计,从技术上讲,性能上存在差异,但无关紧要。将它放在 class 范围内,即使变量未被使用,也会使用内存来存储它,而将它放在方法范围内,每次方法时都会使用稍微多一点的 CPU 时间来创建它是 运行.

您可以尝试测量差异,但实际上差异很小,除非您每秒调用该函数数千次或有数千个实例,否则差异不大。即便如此,差异可能仍然很小。例如,在 C# 的 class 作用域中有一个 int 大约只需要 4 个字节或 0.000004 MB,但不能说定义相同的 int 变量需要多少执行时间。

对于更整洁的代码来说,将变量本地化在性能成本上已经足够微不足道了,但它确实归结为您的应用程序的设计。

编辑:在某些大型应用程序中定义较大对象的新实例时,出现这种想法可能更重要。这可能会对性能产生更大的影响,具体取决于对象存储的内容。除非你有巨大的对象存储大量数据,否则它仍然不太重要,在这种情况下,你应该检查你的应用程序的设计,看看这样的对象是否需要存储那么多数据。

在这种情况下,它归结为内存使用与 CPU 时间。如前所述,将变量存储在 class 范围内将一直使用内存来存储数据。在方法范围内仍将使用相同数量的内存,但仅在方法 运行s 时才会使用,之后将被清除。每次定义变量需要更多 CPU 个周期才能完成。

为了争论起见,假设内存使用量和 CPU 用于此的时间是一个很大的数量。它成为速度与内存的平衡游戏。如果您尝试针对内存较少或类似推理的系统进行优化,那么在方法范围内为所有方法定义可以节省内存成本,但会增加执行时间。如果您希望任务完成得更快并且内存使用率较低,那么在 class 范围内定义所有变量将使用更多内存,因为您存储更多数据的时间更长,但会减少所需的执行时间。

这两种方式都不太可能重要,因为在大多数情况下,我们谈论的是微量的时间和内存,但在极少数情况下,这确实重要,最好考虑您的应用程序的设计以及您想要做什么最适合