JavaScript заменить на обратный вызов - вопрос производительности - PullRequest
10 голосов
/ 19 марта 2010

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

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, или это все одно и то же?

Ответы [ 2 ]

6 голосов
/ 19 марта 2010

+ 1 к Энни о тестах производительности.

Но я бы пошел с

return lookup[match] || match;

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

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

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

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

5 голосов
/ 19 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...