Производительность if-else, переключения или настройки на основе карт
Мне было интересно узнать о действиях следующих реализаций условных структур в javascript.
Метод 1:
if(id==="camelCase"){
window.location.href = "http://www.thecamelcase.com";
}else if (id==="jsFiddle"){
window.location.href = "http://jsfiddle.net/";
}else if (id==="cricInfo"){
window.location.href = "http://cricinfo.com/";
}else if (id==="apple"){
window.location.href = "http://apple.com/";
}else if (id==="yahoo"){
window.location.href = "http://yahoo.com/";
}
Метод 2:
switch (id) {
case 'camelCase':
window.location.href = "http://www.thecamelcase.com";
break;
case 'jsFiddle':
window.location.href = "http://www.jsfiddle.net";
break;
case 'cricInfo':
window.location.href = "http://www.cricinfo.com";
break;
case 'apple':
window.location.href = "http://www.apple.com";
break;
case 'yahoo':
window.location.href = "http://www.yahoo.com";
break;
}
Метод 3
var hrefMap = {
camelCase : "http://www.thecamelcase.com",
jsFiddle: "http://www.jsfiddle.net",
cricInfo: "http://www.cricinfo.com",
apple: "http://www.apple.com",
yahoo: "http://www.yahoo.com"
};
window.location.href = hrefMap[id];
Метод 4
window.location.href = {
camelCase : "http://www.thecamelcase.com",
jsFiddle: "http://www.jsfiddle.net",
cricInfo: "http://www.cricinfo.com",
apple: "http://www.apple.com",
yahoo: "http://www.yahoo.com"
}[id];
Вероятно, метод 3 и 4 может иметь почти такую же производительность, но только сообщение для подтверждения.
Ответы
Ответ 1
В соответствии с этим тестом JSBen.ch настройка switch
является самой быстрой из предоставленных методов (Firefox 8.0 и Chromium 15).
Методы 3 и 4 немного менее быстры, но это едва заметно. Очевидно, что метод if-elseif значительно медленнее (FireFox 8.0).
Тот же тест в Chromium 15 не показывает существенных различий в эффективности между этими методами. Фактически, метод if-elseif является самым быстрым методом в Chrome.
Update
Я снова запустил тестовые примеры с 10 дополнительными записями. Hrefmap (методы 3 и 4) показывают лучшую производительность.
Если вы хотите реализовать метод сравнения в функции, метод 3 определенно выиграет: сохраните карту в переменной и обратитесь к этой переменной в более поздней точке, вместо того, чтобы ее восстановить.
Ответ 2
Вы всегда можете выполнить jsPerf самостоятельно. Однако, как правило, справочная таблица является самым быстрым способом доступа к данным. Это будет (3) в ваших фрагментах. Кроме того, switch/case
почти всегда быстрее, чем if-else
. Таким образом, порядок для вашего примера будет
< → (3) → (4)
→ (2) → (1)
Ответ 3
Просто подумал, что добавлю это как возможное соображение. Я наткнулся на это, проводя исследование по этому самому вопросу... http://davidbcalhoun.com/2010/is-hash-faster-than-switch-in-javascript
Учитываются разные двигатели и браузеры.