JavaScript заменить на обратный вызов - вопрос производительности

В JavaScript вы можете определить обработчик обратного вызова в операциях замены строки regex:

str.replace(/str[123]|etc/, replaceCallback); 

Представьте, что у вас есть объект поиска строк и замен.

var lookup = {"str1": "repl1", "str2": "repl2", "str3": "repl3", "etc": "etc" };

и эта функция обратного вызова:

var replaceCallback = function(match) { 
  if (lookup[match])
    return lookup[match]; 
  else
    return match;
}

Как вы оцениваете производительность вышеупомянутого обратного вызова? Есть ли способ улучшить его? Будет

if (match in lookup) //....

или даже

return lookup[match] || match;

приводят к возможности оптимизации JS-компилятора или все это одно и то же?

Ответ 1

+1 Энни о перфекционных тестах.

Но я бы пошел с

return lookup[match] || match;

Не только это просто поиск свойства (а не оптимизация запрета - два, как в ваших предыдущих примерах), но он также короче и (это не всегда верно для более короткого кода), более ясного для любого наполовину опытный JavaScript-кодер. Это будет иметь тенденцию бросать новичков немного, но одна из первых вещей, которые вы хотите учить новичков, заключается в том, как специальные (и отлично) || и && работают в JavaScript, поэтому...

Он также работает с несколькими (очень) краевыми случаями в некоторых реализациях. (Пример: 'toString' in {} должен быть true [все объекты наследуют toString из прототипа Object], но он false в Microsoft JScript.)

Относительно оптимизации: Запрет на очевидное (не заставляйте ваше условие цикла выполнять функцию подсчета, если это может быть инвариант, избегать дублирования поиска без необходимости), даже если отсутствует общая дискуссия о том, стоит ли беспокоиться о этот материал, прежде чем вы увидите проблему (иногда называемую "преждевременная оптимизация" ), особенно это касается JavaScript для общей сети. Различные микро-оптимизации имеют разные результаты в разных реализациях, иногда конфликтующие результаты ( "А" лучше в Internet Explorer, но намного хуже в FireFox и наоборот). В основном это вопрос ожидания, пока вы не увидите конкретную проблему, а затем обратитесь к этой конкретной проблеме.

Я предпочитаю простоту и ясность, если у меня нет веских оснований полагать, что что-то бесцеремонное даст мне измеримое, реальное улучшение.

Ответ 2

Вы можете использовать инструмент сравнения, например JSLitmus, чтобы сравнить различные подходы. Обязательно проверьте различные браузеры.