Производительность Javascript toLowerCase () в сравнении с созданием переменных - PullRequest
3 голосов
/ 15 июля 2011

Что эффективнее?:

var text="ABCdef";
var lowerVersion=text.toLowerCase();
if (lowerVersion=='abcdef' || lowerVersion=='asdfgh' || lowerVersion=='zxcvbn'){...

или

var text="ABCdef";
if (text.toLowerCase()=='abcdef' || text.toLowerCase()=='asdfgh' || text.toLowerCase()=='zxcvbn'){...

, т. Е. Создание переменной дороже, чем запуск toLowerCase () несколько раз?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 15 июля 2011

Это JavaScript.Ответ будет следующим: Это зависит. Это зависит от того, какой движок вы используете, от ваших данных, от других вещей в контексте, от того, соответствует ли первое или последнее совпадение, по вторникам....

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

Взять тест производительности @ Felix и сделать его пессимистичным (например, наихудший случай и ни один из них не соответствует) предполагает, что даже Chrome не может оптимизировать его настолько, чтобы повторные вызовы функций не выходили из строя.Я не проводил всесторонних тестов, но Chrome, Firefox и Opera работали примерно на 60% медленнее.

Конечно, у вас есть альтернатива:

var text="ABCdef";
switch (text.toLowerCase()) {
  case 'abcdef':
    // ...
    break;
  case 'asdfgh'
    // ...
    break;
  case 'zxcvbn'
    // ...
    break;
}

Все этоЭто преждевременная оптимизация, которая, в общем, достаточно плоха, но особенно плоха для JavaScript и меняющихся сред, в которых он работает.

Лучший вопрос: что яснее и удобнее в обслуживании?

1 голос
/ 19 июля 2012

Если вы собираетесь ссылаться на значение более одного раза, сохраните его как переменную: toLowerCase () может быть очень медленным с длинными строками.

1 голос
/ 15 июля 2011

Нет сомнений, что 2-я реализация будет значительно быстрее, чем 1-я.

Это точно, что когда каждый раз text.toLowerCase() будет занимать время, подобное O(n), и будет 3xO(n) vs O(n)

Я запустил тест на jsPref.com, и второй фрагмент кода на 18% быстрее.

1 голос
/ 15 июля 2011

Кэширование кажется более быстрым , что кажется логичным (3 вызова toLowerCase против одного). Но я не думаю, что это будет иметь большое значение, если это будет операция один или несколько раз. Это может быть вопросом вкуса, но я думаю, что присвоение переменной более читабельно / легко поддерживается.

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