AFAIK, причина в том, что symbol.hash
является константой, поэтому вызов hash
для символа - это простой поиск свойств и довольно быстрый;символы оптимизированы для этого конкретного использования.Требуется вычислить значение хеш-функции для строки, поэтому вызов hash
для строки включает в себя реальную работу, и строки, по-видимому, не кэшируют свои значения хеш-функции.Значение hash
для Fixnum, по-видимому, вычисляется с помощью некоторого простого преобразования битов по внутреннему ID объекта Fixnum (константе), поэтому оно также должно быть быстрым.Не воспринимайте это как авторитетное, я только что сделал краткий обзор источника 1.9.2, но вряд ли я эксперт по внутренним компонентам Ruby.
Тем не менее, я бы использовал Fixnums в качестве хеш-ключей.Это дает вам естественное представление для разреженного массива, который также эффективен с точки зрения памяти.Любые различия в скорости, вероятно, будут неуместным шумом.Итак, используйте ясный подход и беспокойтесь об оптимизации, когда есть реальная проблема скорости.