Я пишу объект JS, который должен выполнять действительно базовое кэширование ключа-значения в парах функций:. Класс работает на клиенте и кэширует частично скомпилированные шаблоны для частичной части страницы, поэтому он может содержать от 20 до 200 элементов.
Прежде чем писать класс, я решил, что было бы неплохо увидеть, какой был самый быстрый метод поиска кэша. Возможные варианты:
1. Доступ к основным ресурсам:
if (x[k] !== undefined) {
v = x[k];
}
2. Проверка ключа (собственный):
if (x.hasOwnProperty(k)) {
v = x[k];
}
3. Проверка ключа (общее):
if (k in x) {
v = x[k];
}
Я предположил, что 3 будет самым быстрым (проверяет, существует ли свойство, но не получает его или не беспокоится о том, где оно существует), а 1 будет самым медленным (фактически получает свойство, даже если оно ничего не делает).
У меня возникли проблемы с объяснением этих результатов. Возможно, что # 1 отмечает, что ничего не произойдет с данными, и поэтому просто проверяет ключ внутри, но почему это происходит быстрее, чем # 3? Почему # 3 не получает ту же оптимизацию?
Что вызывает эти результаты? Есть ли какая-то оптимизация JIT, которую я мог бы нанести, что искажает данные?
Что еще более важно, почему это так сильно отличается между браузерами, причем все параметры примерно равны в FF?