C# .NET局部变量优化
我在阅读.NET资料时发现:C# .NET局部变量优化,c#,.net,optimization,decimal,jit,C#,.net,Optimization,Decimal,Jit,我在阅读.NET资料时发现: // Constructs a Decimal from an integer value. // public Decimal(int value) { // JIT today can't inline methods that contains "starg" opcode. // For more details, see DevDiv Bugs 81184: x86 JIT CQ: // Removing the inline
// Constructs a Decimal from an integer value.
//
public Decimal(int value) {
// JIT today can't inline methods that contains "starg" opcode.
// For more details, see DevDiv Bugs 81184: x86 JIT CQ:
// Removing the inline striction of "starg".
int value_copy = value;
if (value_copy >= 0) {
flags = 0;
}
else {
flags = SignMask;
value_copy = -value_copy;
}
lo = value_copy;
mid = 0;
hi = 0;
}
如您所见,Decimal结构的构造函数将方法参数复制到局部变量,而不是直接使用它。我想知道这个评论是什么意思,它与性能和优化有什么关系
我的猜测是,一旦您想要修改现有的参数,方法就不能再内联了
我的猜测是,一旦您想要修改现有的参数,方法就不能再内联了
简短回答:您的猜测是正确的(如果源代码注释今天仍然正确)
“JIT”是.NET运行时中转换为计算机汇编语言的部分。只有这样,您的计算机才能执行代码。JIT一个方法一个方法地执行这个转换方法,并且只在实际需要时执行:每当第一次调用一个方法时,它首先被编译成实际的汇编语言“即时”(JIT)
C#编译器不会立即为计算机的体系结构生成汇编语言;相反,它生成,这是一种抽象堆栈机器(在中定义)的汇编语言
例如,对参数的赋值(在您的示例中:value
)将由C#编译器转换为名为starg
(“存储到参数”)的IL指令
注释基本上说,如果该方法包含这样一个赋值(value=…
),那么JIT当前将无法“内联”它意味着JIT不会生成对方法的调用指令(即将命令分支到不同的代码位置),而是将方法的整个主体插入调用它的位置。这样做通常是为了优化执行速度,因为不需要分支/跳转,另外我假设也不需要设置新的堆栈帧
通过改为赋值给局部变量(value\u copy=…
),避免了JIT的这种限制,因为赋值给局部变量会导致生成不同的IL指令:stloc
(“存储到局部变量”)
另请参见:
- (博客帖子)
// JIT today can't inline methods that contains "starg" opcode.