我与一位同事讨论了一份声明的表现。它大致类似于下面。
var a = class.member.member1.variable;
为变量创建局部变量并在需要变量的过程中使用它是否更快,或通过.
访问变量。我认为创建局部变量更好,但我并不确定性能。我记得在某处阅读它比访问.
更快。
答案 0 :(得分:1)
当您使用.
(访问运算符)时,这意味着运行时环境首先需要找出对象所在的位置,然后计算该字段所在的位置,然后获取该值。
如果你访问一个属性,那就更糟了,因为运行时环境有时需要进行调用(正如@RowlandShaw所说:有时可以内联对属性的访问,在这种情况下,它不能进行任何操作您是否直接访问该字段或使用属性)。并且财产并不总是立即提供价值:可以在两者之间进行计算。
另一方面,本地变量可以直接访问 ,在很多情况下,它也会被放入寄存器中以进一步提高性能(大约是5-10倍) )。所以一个局部变量确实几乎总是更快。
如果您想要寻址的字段是只读的,智能编译器可以优化调用,因为它肯定知道该值不会改变。但在许多情况下(例如,如果您访问属性),您无法知道两个调用之间的值是否已更改,因为另一个线程可以同时修改该对象。
作为引用类型的var
或值类型之间没有太大区别。对于引用类型,引用将是快捷方式,对于值类型(基元和结构),将复制该值。
如果var
是一个大型结构,那么使用局部变量的唯一可能的下行性能。在这种情况下,复制值会导致显着的开销。
简短回答:如果您知道您访问的内容的值不会发生变化(或者您不太关心它),出于性能原因,最好将其存储在本地变量中。否则,您应该继续使用对字段/属性的访问权限。在极少数情况下,它可能导致开销:如果它是值类型并且类型的大小非常大:在这种情况下必须复制struct
,这可能导致大量指令。 / p>