#c# #compiler-optimization
#c# #оптимизация компилятора
Вопрос:
Я разрабатываю игровой сервер на C #, и определенный пакет отправляется на мой сервер 3-5 раз в секунду для каждого игрока. Мы будем называть этот пакет PacketA
. Я ничего с ним не делаю, кроме как удостоверяюсь, что я его получу.
Поскольку этот пакет отправляется чаще всего, я хочу поместить его первым в блок switch, чтобы мне не приходилось делать так много ненужных сравнений. Будет ли компилятор в конечном итоге оптимизировать его в любом случае (что заставит меня выполнить все сравнения по блоку switch?)
switch (packetId)
{
case PacketID.PacketA: // I do not want to do anything here.
break; // Just avoid all other packet id comparisons.
case PacketID.PacketB:
HandlePacketB(data);
break;
case PacketID.PacketC:
HandlePacketC(data);
break;
// ...
case PacketID.PacketZ:
HandlePacketZ(data);
break;
}
Если компилятор оптимизирует это, как я могу изменить свой код, чтобы мне не приходилось проверять все остальные идентификаторы пакетов?
Ответ №1:
switch
Оператор в C # оптимизирован таким образом, что позволяет очень быстро оценить, куда двигаться. Он не читает список опций в точности. Вместо этого он создает список переходов, который он оптимизировал для определения, какой случай выполнить. Вот ссылка с дополнительной информацией об этом:
http://www.dotnetperls.com/switch-char
В принципе, я бы посоветовал вам протестировать производительность этого оператора по сравнению с другим оператором (например, сначала выполнить if
оператор только для этого, case
а затем выполнить switch
оператор, если это не так PacketA
). Я бы предположил, что, в конце концов, switch
оператор — это правильный путь.
Если вы решите, что хотите разобраться в своем приложении путем его декомпиляции, вы можете воспользоваться новым (бесплатным) инструментом от Telerik:
Комментарии:
1. Это должно было быть моим ответом. Многие люди рекомендуют использовать
Dictionary<TKey, Action>
, не подозревая, что компилятор выполняет такого рода действия внутри. Я думаю, вы действительно не увидите разницы в производительности в любом случае.
Ответ №2:
Разберите свой код и проверьте, доступен ли этот вариант. Если он недоступен, то компилятор оптимизировал его.
Комментарии:
1. Не могли бы вы добавить больше деталей о том, как его разобрать? Reflector больше не бесплатный.
2. @icktoofay:
ildasm
поставляется с VC. Если вы хотите его декомпилировать, ознакомьтесь с ILSpy: wiki.sharpdevelop.net/ILSpy.ashx3. Это на самом деле так (они изменили условия для старой версии v6, если она у вас есть). Кроме того, есть JetBrains dotPeek, который является бесплатным, и ILDASM, в конце концов.