Что быстрее - если .. еще или Select..case? - PullRequest
5 голосов
/ 11 ноября 2009

У меня есть три условия для сравнения. Какой из них быстрее между следующими двумя? Пожалуйста, укажите мне. Спасибо всем!

If var = 1 then
    Command for updating database
ElseIf var = 2 then
    Command for updating database
ElseIf var = 3 then
    Command for updating database
EndIf

и

Select Case var
   Case 1
      Command for updating database
   Case 2
      Command for updating database
   Case 3
      Command for updating database
End Select

Ответы [ 4 ]

13 голосов
/ 11 ноября 2009

Если вы скомпилируете два фрагмента и используете рефлектор для разборки, вы увидите, что оба они в конечном итоге представляют собой практически одинаковый IL. Компилятор заменяет if / else на оператор case.

Этот вид микрооптимизации вряд ли поможет вам, если у вас есть проблемы с производительностью.

Если у вас проблемы с производительностью, вам нужно профилировать программу и выяснить, где находятся узкие места.

Если у вас нет проблем с производительностью, прекратите заниматься этим и беспокойтесь о написании кода, который легко понять.

10 голосов
/ 11 ноября 2009

Теоретически, switch..case должен быть быстрее, потому что это справочная таблица (как это чаще всего реализуется компилятором).

Однако, если вы беспокоитесь о том, какая из них работает быстрее, и это действительно узкое место в вашей программе, у вас есть феноменально хорошо ведущий себя проект.

8 голосов
/ 11 ноября 2009

Операция с базой данных будет как минимум в 1000 раз медленнее, чем оператор if/else или case.

Как правило, операторы case могут выполняться быстрее, так как компилятор или среда выполнения могут создавать таблицу переходов. Обычно для менее чем пяти элементов компилятор записывает оператор case в виде списка операторов if / else. Если бы производительность вышеизложенного была измеримой, я бы предположил, что производительность будет одинаковой, так как, вероятно, выполняются одни и те же инструкции.

MSIL имеет специальный код операции для операторов . Нужно декомпилировать в MSIL, чтобы увидеть, создаст ли VB.Net таблицу переходов для трех элементов.

4 голосов
/ 11 ноября 2009

Лучший способ окончательно ответить на этот тип вопросов - с помощью эталона.

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

...