Извините за мой плохой английский.C#: Производительность между делегатами и метод вызова
У меня есть два метода рисования, допустим, «void Draw1();» и "void Draw2();". Мое приложение всегда должно вызывать Draw1, если пользователь проверяет «вызов функции Draw1». И поэтому мое приложение всегда должно вызывать Draw2, если пользователь не проверяет «вызов функции Draw1».
Есть два способа сделать это:
Использование функции делегатов:
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
- Во втором методе, вызов рисовать () просто:
000007FE8FF3A386 mov rcx,qword ptr [rbp+0FA0h] 000007FE8FF3A38D call 000007FE8FDFD2E0 000007FE8FF3A392 nop
конечно, во втором методе, у меня есть еще один чек после вызова. Но, в конце концов, второй метод быстрее, чем первый ...
Знаете ли вы еще один способ делать то, что я хочу? или, возможно, некоторые трюки, чтобы сделать звонок делегата легче?
Спасибо.