【问题标题】:C# : Performance between Delegates and Method CallingC#:委托和方法调用之间的性能
【发布时间】:2015-05-01 21:45:45
【问题描述】:

对不起,我的英语不好。

我有两个绘制方法,比如说“void Draw1();”和“无效 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# performance methods delegates


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多