【发布时间】:2015-01-22 13:32:12
【问题描述】:
我已经知道设置字段比设置局部变量慢得多,但似乎with设置字段比设置局部变量要慢得多。为什么是这样?无论哪种情况,都使用该字段的地址。
public class Test
{
public int A = 0;
public int B = 4;
public void Method1() // Set local with field
{
int a = A;
for (int i = 0; i < 100; i++)
{
a += B;
}
A = a;
}
public void Method2() // Set field with local
{
int b = B;
for (int i = 0; i < 100; i++)
{
A += b;
}
}
}
10e+6 次迭代的基准测试结果为:
方法1:28.1321 毫秒 方法2:162.4528毫秒【问题讨论】:
-
这取决于很多事情,但最明显的解释是geting不一定要访问DRAM(值在CPU缓存中),而setting是(cache write-through.. .ie 值同时写入缓存和系统内存)。请注意,设置局部变量可能会导致根本无法访问内存,因为编译器可能已将局部变量优化为寄存器。
-
@PeterDuniho - 我以为只有本地人有资格获得 CPU 缓存?
-
正如我在评论中提到的,本地人通常甚至不存储在系统 RAM 中。但是 all 内存访问,无论变量的类型如何,都符合缓存条件。缓存不关心(甚至不知道)你为什么使用特定的内存地址;当涉及系统内存时,它会缓存它能够缓存的所有数据。
-
FWIW 在我的机器上,时间几乎相同。 (1%以内)
-
我怀疑我们在这里看到的是对内存中保存的变量和寄存器中的变量进行操作的区别。我希望方法 1 将
a保留在寄存器中,而方法 2 则不然。
标签: c# .net performance field