2010-03-18 6 views
10

В JavaScript, вы можете определить обработчик обратного вызова в регулярное выражение строку замены операции: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 для оптимизации, или это все то же самое?

ответ

6

+1 Анни о перфомансах.

Но я бы с

return lookup[match] || match; 

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

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

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

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

+0

+1 По мере того, как поиск элементов объекта идет, компилятор может очень хорошо оптимизировать это в одном вызове даже в варианте 'if ... '(?). Это именно то, что я хочу знать. P.S .: Я прекрасно понимаю, что это довольно микро-менеджмент.Это - * академический вопрос. – Tomalak

+0

@Tomalek: Я бы не стал рассчитывать на это, некоторые реализации потрясающе не оптимизированы. В тех, которые есть (например, Chrome, очень быстро), вы можете уйти почти с чем угодно. :-) Итак, вы беспокоитесь о медленных, если и когда увидите их. –

+1

Если вы вставьте версию if/else этой функции в компилятор Closure, она выплеснет версию T.J., поэтому я бы предположил, что JS-анализаторы могут сделать такую ​​же оптимизацию. Не уверен. Ссылка на компилятор, чтобы вы могли попробовать сами: http://closure-compiler.appspot.com – Annie

5

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

+0

Да, это прагматичный подход. Я искал некоторые глубокие знания гуру о том, как JS справится с этим. Я ценю, что это вполне может быть слишком специфичным для реализации, чтобы дать обобщенный ответ. – Tomalak

Смежные вопросы