Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET局部变量优化_C#_.net_Optimization_Decimal_Jit - Fatal编程技术网

C# .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

我在阅读.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 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
(“存储到局部变量”)

另请参见:

  • (博客帖子)

所以基本上你对他的问题的回答是肯定的。我会从这个开始,然后再加上解释。@clauless:谢谢你的建议!我添加了一个TL;回答博士。我有一种恼人的倾向,总是给出冗长的答案,我似乎无法摆脱
//  JIT today can't inline methods that contains "starg" opcode.