2015-03-01 2 views
-1

Извините за мой плохой английский.C#: Производительность между делегатами и метод вызова

У меня есть два метода рисования, допустим, «void Draw1();» и "void Draw2();". Мое приложение всегда должно вызывать Draw1, если пользователь проверяет «вызов функции Draw1». И поэтому мое приложение всегда должно вызывать Draw2, если пользователь не проверяет «вызов функции Draw1».

Есть два способа сделать это:

  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. Во втором методе, вызов рисовать () просто:
    000007FE8FF3A386 mov rcx,qword ptr [rbp+0FA0h] 000007FE8FF3A38D call 000007FE8FDFD2E0 000007FE8FF3A392 nop

конечно, во втором методе, у меня есть еще один чек после вызова. Но, в конце концов, второй метод быстрее, чем первый ...

Знаете ли вы еще один способ делать то, что я хочу? или, возможно, некоторые трюки, чтобы сделать звонок делегата легче?

Спасибо.

ответ

0

Вторая скорость быстрее первой. Посмотрите инструкцию call. Во втором примере он просто вызывает постоянный адрес, где в первом примере сначала должен быть вычислен адрес. Понятно, что больше инструкций означает более медленный код, но я думаю, что влияние производительности можно безопасно игнорировать.

Смежные вопросы