.net 我是否将IL代码编织成IL_9999而损害了应用程序的性能?

.net 我是否将IL代码编织成IL_9999而损害了应用程序的性能?,.net,offset,cil,il,.net,Offset,Cil,Il,我在我的dll文件中乱搞我的IL代码(只是为了学习)。我想看看如果我注入自己的IL代码会发生什么,例如。。。我加入了一个盒子呼叫:il9999:box!T。我想知道偏移值是否真的很重要 就性能而言,9999的IL补偿是否比1000的IL补偿成本更高?我的猜测是没有,因为编译器本身在按顺序运行时跳过偏移: IL_000d: ldc.i4.3 IL_000e: box [mscorlib]System.Int32 IL_0013: call instance int3

我在我的dll文件中乱搞我的IL代码(只是为了学习)。我想看看如果我注入自己的IL代码会发生什么,例如。。。我加入了一个盒子呼叫:
il9999:box!T
。我想知道偏移值是否真的很重要

就性能而言,9999的IL补偿是否比1000的IL补偿成本更高?我的猜测是没有,因为编译器本身在按顺序运行时跳过偏移:

IL_000d:  ldc.i4.3
IL_000e:  box        [mscorlib]System.Int32
IL_0013:  call       instance int32 [mscorlib]System.Enum::CompareTo(object)
IL_0018:  call       void [mscorlib]System.Console::WriteLine(int32)
IL_001d:  nop

另外,如果我的IL偏移量9999被抛出到其他值低得多的IL偏移量调用中间,是否会损害我的应用程序?

所有这些
IL\u XXXX:
实际上都不是偏移量,而是标签。只是反编译器倾向于为每条指令添加一个标签,并根据其偏移量对其命名。这是因为标签名称没有保留在编译代码中(例如,编译的C#可能不会有有有意义的标签名称,即使它们被保留),反编译器至少需要有一些标签才能在分支指令中使用

因此,如果您修改“偏移量”,然后使用ilasm编译代码,实际上您没有以任何方式更改代码。因此,它不会对性能产生任何影响


验证这一点的一种方法是再次反编译修改后的程序集。

所有这些
IL\u XXXX:
实际上都不是偏移量,而是标签。只是反编译器倾向于为每条指令添加一个标签,并根据其偏移量对其命名。这是因为标签名称没有保留在编译代码中(例如,编译的C#可能不会有有有意义的标签名称,即使它们被保留),反编译器至少需要有一些标签才能在分支指令中使用

因此,如果您修改“偏移量”,然后使用ilasm编译代码,实际上您没有以任何方式更改代码。因此,它不会对性能产生任何影响


验证这一点的一种方法是再次反编译修改后的程序集。

这毫无意义,IL_000d:注释是反汇编程序显示的内容。当您编写自己的IL或使用反射时,实际上并不是您自己编写的。Emit@HansPassant:对不起,如果我不清楚。。。我使用反汇编程序来访问我的dll的IL。这就是我玩的地方。@m-y但反汇编程序通常不允许您修改代码。@svick:我修改了反汇编的代码,然后使用ilasm.exe将其重新组装回dll。所以我可以修改代码:)这个符号只是指代码的偏移量,解释偏移量是如何获得的比“它慢吗”要复杂一些。在这两种情况下,最安全的做法是不要弄脏偏移量,或者更好的做法是,在没有明确指定偏移量的情况下创建自己的IL文件。这毫无意义,IL_000d:注释是反汇编程序显示的内容。当您编写自己的IL或使用反射时,实际上并不是您自己编写的。Emit@HansPassant:对不起,如果我不清楚。。。我使用反汇编程序来访问我的dll的IL。这就是我玩的地方。@m-y但反汇编程序通常不允许您修改代码。@svick:我修改了反汇编的代码,然后使用ilasm.exe将其重新组装回dll。所以我可以修改代码:)这个符号只是指代码的偏移量,解释偏移量是如何获得的比“它慢吗”要复杂一些。在这两种情况下,最安全的做法是不使用偏移量,或者更好的做法是,创建自己的IL文件而不显式指定偏移量。啊,您是对的,先生。我在编译后反编译了我的库,并且重新组织了标签(再次)。我想这个标签只是一个标签,它似乎根本不会影响任何性能。谢谢啊,你说得对,先生。我在编译后反编译了我的库,并且重新组织了标签(再次)。我想这个标签只是一个标签,它似乎根本不会影响任何性能。谢谢