В переключателе vs словаре для значения Func, что быстрее и почему?

Предположим, есть следующий код:

private static int DoSwitch(string arg)
{
    switch (arg)
    {
        case "a": return 0;
        case "b": return 1;
        case "c": return 2;
        case "d": return 3;
    }
    return -1;
}

private static Dictionary> dict = new Dictionary>
    {
        {"a", () => 0 },
        {"b", () => 1 },
        {"c", () => 2 },
        {"d", () => 3 },
    };

private static int DoDictionary(string arg)
{
    return dict[arg]();
}

Повторяя оба метода и сравнивая, я получаю, что словарь работает немного быстрее, даже когда «a», «b», «c», «d» расширены, чтобы включить больше ключей. Почему это так?

Связано ли это с цикломатической сложностью? Это потому, что джиттер компилирует операторы возврата в словаре в собственный код только один раз? Это потому, что поиск словаря O (1 ), который может не иметь место для оператора switch ? (Это всего лишь догадки)

43
задан Community 23 May 2017 в 11:47
поделиться