遵循这个问题 - 使用C#传递方法作为参数和我的一些个人经验我想更多地了解调用委托与仅在C#中调用方法的性能.
虽然代表非常方便,但我有一个应用程序通过委托做了很多回调,当我们重写这个使用回调接口时,我们得到了一个数量级的速度提升.这是使用.NET 2.0所以我不确定3和4的情况如何变化.
如何在编译器/ CLR内部处理对委托的调用,这对方法调用的性能有何影响?
编辑 - 澄清代表与回调接口的含义.
对于异步调用,我的类可以提供一个OnComplete事件和调用者可以订阅的相关委托.
或者,我可以使用调用者实现的OnComplete方法创建一个ICallback接口,然后将其自身注册到类,然后在完成时调用该方法(即Java处理这些事情的方式).
我有一个接口I,一个抽象类A,这两者的具体类,以及一个C用作基线的具体类.
interface I
{
void Do();
}
abstract class A
{
public abstract void Do();
}
class C
{
public void Do() {}
}
class IImpl : I
{
public void Do() {}
}
class AImpl : A
{
public override void Do() {}
}
Run Code Online (Sandbox Code Playgroud)
我对基准通话C.Do(),I.Do()并A.Do()使用BenchmarkDotNet.
public class Bench
{
private C _c;
private I _i;
private A _a;
[Setup]
public void Setup()
{
_c = …Run Code Online (Sandbox Code Playgroud) 我正在构建一个动态方法,使用 ILGenerator 插入操作码。我正在使用 Visual Studio 插件查看 DynamicMethod 中的 IL 代码,因此这不是问题。
不过,我希望看到 JITer 发出的最终 x86 代码。无论我如何尝试,Visual Studio 2017 都不会让我进入 x86 汇编代码。它在堆栈中显示为“轻量级函数”,VS 将直接跳过它。
有没有办法查看编译 DynamicMethod 生成的 x86 汇编代码?