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

本文关键字:调用 之间 性能 方法 | 更新日期: 2024-09-08 06:26:48

很抱歉我的英语不好。

我有两种绘制方法,比如说"void Draw1();"answers"void Draw2()。如果用户选中"调用Draw1函数",我的应用程序应该始终调用Draw1。因此,如果用户没有选中"调用Draw1函数",我的应用程序应该始终调用Draw2。

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

  1. 使用委派功能: delegate void DrawFct(); DrawFct Draw; ... Draw = (call_Draw1.Checked) ? new DrawFct(Draw1) : new DrawFct(Draw2); ... Draw(); ... void Draw1() { ... calls_1 ... } void Draw2() { ... calls_2 ... }

  2. 使用标志: bool useDraw1 = call_Draw1.Checked; ... void Draw() { if (useDraw1) { ... calls_1 ... } else { ... calls_2 ... } }

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

  1. 使用调试应用程序时的第一个方法,Draw()的调用在ASM中转换为:
    000007FE8FF3A393 mov rax,qword ptr [rbp+0FA0h] 000007FE8FF3A39A mov rax,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 mov rax,qword ptr [rbp+0F58h] 000007FE8FF3A3BA call qword ptr [rax+18h] 000007FE8FF3A3BD nop
  2. 在第二个方法中,对Draw()的调用简单地为:
    000007FE8FF3A386 mov rcx,qword ptr [rbp+0FA0h] 000007FE8FF3A38D call 000007FE8FDFD2E0 000007FE8FF3A392 nop

当然,在第二种方法中,我在调用后还有一次检查。但最终,第二种方法比第一种方法更快。。。

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

谢谢。

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

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