Сначала пара очков.Во-первых, такие низкоуровневые языковые конструкции, которые более или менее выполняют одно и то же, почти никогда не являются узким местом в любом реальном приложении, поэтому глупо (часто) глупо фокусироваться на них.Во-вторых, как уже упоминалось, если вы действительно обеспокоены этим, вы должны сравнить его.Инструменты Ruby для бенчмаркинга и профилирования, конечно, не самые передовые в экосистеме программирования, но они выполняют свою работу.
Мой инстинкт инстинкта заключается в том, что хеши будут быстрее, потому что (опять же, я думаю,оператор case должен проверять каждое условие по очереди (делая поиск элементов O (n) вместо O (1)).Но давайте проверим!
Полный код сравнения в https://gist.github.com/25 По сути, он генерирует файл, который определяет соответствующий регистр / хэш, а затем использует их.Я пошел дальше и включил поиск хеша в вызов метода, чтобы издержки не были фактором, но в реальной жизни нет причин, по которым он должен застрять внутри метода.
Вот что я получаю,В каждом случае я делаю 10 000 поисков.Время - это время пользователя в секундах
Case statement, 10 items 0.020000
Hash lookup, 10 items 0.010000
Case statement, 100 items 0.100000
Hash lookup, 100 items 0.010000
Case statement, 1000 items 0.990000
Hash lookup, 1000 items 0.010000
Итак, очень похоже, что оператор case равен O (n) (шокера там нет).Также обратите внимание, что 10K-поиск - это всего лишь секунда даже в операторе case, поэтому, если вы не выполняете метрическую загрузку этих поисков, вам лучше сосредоточиться на остальной части кода.