C#:委托和方法调用之间的性能

C#:委托和方法调用之间的性能,c#,performance,methods,delegates,C#,Performance,Methods,Delegates,对不起,我的英语不好 我有两种绘图方法,比如“void Draw1();”和“void Draw2();”。 如果用户选中“调用Draw1函数”,我的应用程序应该始终调用Draw1。因此,如果用户没有选中“调用Draw1函数”,我的应用程序应该总是调用Draw2 有两种方法可以做到这一点: 使用代理功能: 委托无效DrawFct(); DrawFct Draw; ... Draw=(调用\u Draw1.选中)?新图纸FCT(图纸1):新图纸FCT(图纸2); ... Draw(); ...

对不起,我的英语不好

我有两种绘图方法,比如“void Draw1();”和“void Draw2();”。 如果用户选中“调用Draw1函数”,我的应用程序应该始终调用Draw1。因此,如果用户没有选中“调用Draw1函数”,我的应用程序应该总是调用Draw2

有两种方法可以做到这一点:

  • 使用代理功能:
    
    委托无效DrawFct();
    DrawFct Draw;
    ...
    Draw=(调用\u Draw1.选中)?新图纸FCT(图纸1):新图纸FCT(图纸2);
    ...
    Draw();
    ...
    void Draw1(){…调用\u 1…}
    void Draw2(){…调用_2…}
    

  • 使用标志:
    
    bool useDraw1=调用\u Draw1.Checked;
    ...
    作废提款()
    {
    如果(useDraw1){…调用\u 1…}
    否则{…调用_2…}
    }
    

  • 我想知道哪一个跑得最快。 我做了两个测试:

  • 使用调试应用程序时的第一个方法,Draw()的调用在ASM中转换为:
    
    000007FE8FF3A393移动rax,qword ptr[rbp+0FA0h]
    000007FE8FF3A39A移动速率,qword ptr[rax+1B8h]
    000007FE8FF3A3A1 mov qword ptr[rbp+0F58h],rax
    000007FE8FF3A3A8 mov rcx,qword ptr[rbp+0F58h]
    000007FE8FF3A3AF mov rcx,qword ptr[rcx+8]
    000007FE8FF3A3B3移动rax,qword ptr[rbp+0F58h]
    000007FE8FF3A3BA呼叫qword ptr[rax+18h]
    000007FE8FF3A3BD nop
    
  • 在第二个方法中,对Draw()的调用很简单:
    
    000007FE8FF3A386 mov rcx,qword ptr[rbp+0FA0h]
    000007FE8FF3A38D呼叫000007FE8FD2E0
    000007FE8FF3A392无
    
  • 当然,在第二种方法中,我在调用后还有一次检查。但最后,第二种方法比第一种方法快

    你知道做我想做的事的另一种方法吗?或者是一些让代理的呼叫更轻松的技巧


    谢谢。第二个比第一个快。查看
    调用
    指令。在第二个示例中,它只调用常量地址,在第一个示例中,必须首先计算地址。很明显,更多的指令意味着更慢的代码,但我认为可以安全地忽略性能影响