Оптимизирован ли пустой блок? C#

#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:

http://www.telerik.com/products/decompiling.aspx

Комментарии:

1. Это должно было быть моим ответом. Многие люди рекомендуют использовать Dictionary<TKey, Action> , не подозревая, что компилятор выполняет такого рода действия внутри. Я думаю, вы действительно не увидите разницы в производительности в любом случае.

Ответ №2:

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

Комментарии:

1. Не могли бы вы добавить больше деталей о том, как его разобрать? Reflector больше не бесплатный.

2. @icktoofay: ildasm поставляется с VC. Если вы хотите его декомпилировать, ознакомьтесь с ILSpy: wiki.sharpdevelop.net/ILSpy.ashx

3. Это на самом деле так (они изменили условия для старой версии v6, если она у вас есть). Кроме того, есть JetBrains dotPeek, который является бесплатным, и ILDASM, в конце концов.