【发布时间】:2015-05-01 21:45:45
【问题描述】:
对不起,我的英语不好。
我有两个绘制方法,比如说“void Draw1();”和“无效 Draw2();”。 如果用户选中“调用 Draw1 函数”,我的应用程序应始终调用 Draw1。因此,如果用户未选中“调用 Draw1 函数”,我的应用程序应始终调用 Draw2。
有两种方法可以做到这一点:
使用委托功能:
delegate void DrawFct(); DrawFct Draw; ... Draw = (call_Draw1.Checked) ? new DrawFct(Draw1) : new DrawFct(Draw2); ... Draw(); ... void Draw1() { ... calls_1 ... } void Draw2() { ... calls_2 ... }使用标志:
bool useDraw1 = call_Draw1.Checked; ... void Draw() { if (useDraw1) { ... calls_1 ... } else { ... calls_2 ... } }
我想知道哪个是最快的。 我做了两个测试:
- 当我调试我的应用程序时,使用第一种方法,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 - 在第二种方法中,对 Draw() 的调用很简单:
000007FE8FF3A386 mov rcx,qword ptr [rbp+0FA0h] 000007FE8FF3A38D call 000007FE8FDFD2E0 000007FE8FF3A392 nop
当然,在第二种方法中,我在通话后还有一个检查。但最后,第二种方法比第一种更快……
你知道另一种方法来做我想做的事吗?或者一些技巧可以让委托的调用更轻松?
谢谢。
【问题讨论】:
标签: c# performance methods delegates