gpt4 book ai didi

c# - 为什么设置字段比获取字段慢很多倍?

转载 作者:可可西里 更新时间:2023-11-01 07:46:05 26 4
gpt4 key购买 nike

我已经知道设置一个字段比设置一个局部变量慢得多,但似乎用一个局部变量设置一个字段比用一个字段设置一个局部变量慢得多。为什么是这样?在任何一种情况下,都会使用该字段的地址。

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 次迭代的基准测试结果为:

Method1: 28.1321 msMethod2: 162.4528 ms

最佳答案

在我的机器上运行它,我得到类似的时间差异,但是查看 10M 迭代的 JITted 代码,很清楚为什么会这样:

方法一:

mov     r8,rcx
; "A" is loaded into eax
mov eax,dword ptr [r8+8]
xor edx,edx
; "B" is loaded into ecx
mov ecx,dword ptr [r8+0Ch]
nop dword ptr [rax]
loop_start:
; Partially unrolled loop, all additions done in registers
add eax,ecx
add eax,ecx
add eax,ecx
add eax,ecx
add edx,4
cmp edx,989680h
jl loop_start
; Store the sum in eax back to "A"
mov dword ptr [r8+8],eax
ret

和方法B:

; "B" is loaded into edx
mov edx,dword ptr [rcx+0Ch]
xor r8d,r8d
nop word ptr [rax+rax]
loop_start:
; Partially unrolled loop, but each iteration requires reading "A" from memory
; adding "B" to it, and then writing the new "A" back to memory.
mov eax,dword ptr [rcx+8]
add eax,edx
mov dword ptr [rcx+8],eax
mov eax,dword ptr [rcx+8]
add eax,edx
mov dword ptr [rcx+8],eax
mov eax,dword ptr [rcx+8]
add eax,edx
mov dword ptr [rcx+8],eax
mov eax,dword ptr [rcx+8]
add eax,edx
mov dword ptr [rcx+8],eax
add r8d,4
cmp r8d,989680h
jl loop_start
rep ret

正如您从程序集中看到的那样,方法 A 的速度明显更快,因为 A 和 B 的值都放在寄存器中,并且所有的加法都发生在寄存器中,中间没有写入内存。另一方面,每次迭代,方法 B 都会加载并存储到内存中的“A”。

关于c# - 为什么设置字段比获取字段慢很多倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27111593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com