Comments 20
ХМ… пруф?
У меня вот как-то другие получаются результаты:
Или я не верно понял идею?
Это о чем? я знаю только о поведении реплейса с флагом 'g' и экспериментальном флаге 'y', но у нас тут другая ситуация вроде.
PS. А за что человека-то заминусовали — все верно заметил.
У меня вот как-то другие получаются результаты:
var n, re1, re2, res;
re1 = /test/;
re2 = /test/;
res = (function() {
var _i, _results;
_results = [];
for (n = _i = 0; _i <= 1; n = ++_i) {
_results.push(/test/);
}
return _results;
})();
console.log('re1 === re1 ->', re1 === re1); // re1 === re1 -> true
console.log('re1 === re2 ->', re1 === re2); // re1 === re2 -> false
console.log('res[0] === res[1] ->', res[0] === res[1]); // res[0] === res[1] -> false
Или я не верно понял идею?
поиск продолжается с места предыдущего найденного результата
Это о чем? я знаю только о поведении реплейса с флагом 'g' и экспериментальном флаге 'y', но у нас тут другая ситуация вроде.
PS. А за что человека-то заминусовали — все верно заметил.
О как.
Могу я попросить ссылку на документацию (вероятно в реализациях браузеров?) об этом факте?
Могу я попросить ссылку на документацию (вероятно в реализациях браузеров?) об этом факте?
Ну, этой книги у меня нет, однако если мы о тупом баге в стеках — то он довольно давно поправлен почти во всех браузерах.
Изменения в спеках и объяснялка на SO.
Я вот знаю про скрытые классы при создании объекта, про преобразования массива если он содержит разные типы данных, про преобразование полиморфных функций, а вот по поводу «скомпилированной сущности» в отношении регулярок — не, не видел. Может лишнего удумали?
Изменения в спеках и объяснялка на SO.
Я вот знаю про скрытые классы при создании объекта, про преобразования массива если он содержит разные типы данных, про преобразование полиморфных функций, а вот по поводу «скомпилированной сущности» в отношении регулярок — не, не видел. Может лишнего удумали?
странно видеть +9 на коментарии о «поиск продолжается с места предыдущего найденного результата». в данном примере регулярка без /g и соответственно, сколько бы раз exec этой регулярки ни вызывали, он будет делать поиск с начала.
а по поводу этой оптимизации: на допотопных движках выигрышь будет существенный, на современных его нет. выигрышь тут в том что js не будет искать по строке есть ли у него уже такая регулярка. а проигрышь в том что надо будет доставать регулярку из следующего скопа в стеке скопов. в принципе и то и другое это 1 поиск в каком-то хеше.
а по поводу этой оптимизации: на допотопных движках выигрышь будет существенный, на современных его нет. выигрышь тут в том что js не будет искать по строке есть ли у него уже такая регулярка. а проигрышь в том что надо будет доставать регулярку из следующего скопа в стеке скопов. в принципе и то и другое это 1 поиск в каком-то хеше.
Это называется пулом (interning). Думаю ради производительности вы так не делаете:
НО, такие вещи хорошо выносить в константы, и вовсе не в целях производительности.
пс. и результат будет совсем другим если использовать new RegExp(reg); jsperf/2
var addX = (function(){
var x = 'x';
return function(str){ return str + 'x' }
}());
НО, такие вещи хорошо выносить в константы, и вовсе не в целях производительности.
пс. и результат будет совсем другим если использовать new RegExp(reg); jsperf/2
Погуглил про interning, выяснил что JS сам интернит строки-как-литерал, а динамически создаваемые — нет.
Однако идеи приведенного примера так и не понял — есть переменная, которая не используется, замыкание по идее возвращающее то же самое — профит-то в чем?
Однако идеи приведенного примера так и не понял — есть переменная, которая не используется, замыкание по идее возвращающее то же самое — профит-то в чем?
А с чего вообще взяли что надо что-то кешировать? Работало недостаточно быстро? Данные провайдера были?
Проверьте с
javascript.ru/basic/regular-expression#statichnye-regekspy
new RegExp()
— он, в отличие от инлайнового синтаксиса, должен создаваться каждый раз.javascript.ru/basic/regular-expression#statichnye-regekspy
по-моему, не то вы оптимизируете.
чаще лучше вообще обойтись без регулярки. и в данном случае тоже.
ведь регулярное выражение поднимает целый конечный автомат, достаточно сложный. иногда слишком сложный для простой вещи.
чаще лучше вообще обойтись без регулярки. и в данном случае тоже.
ведь регулярное выражение поднимает целый конечный автомат, достаточно сложный. иногда слишком сложный для простой вещи.
Ох.
Уж положа руку на сердце по-моему там вообще ничего оптимизировать не надо.
Тем более изобретать велосипедов и «обходится без регулярки».
Регулярные выражения — простой и выразительный способ описания алгоритма обработки грамматики, с первого взгляда объясняющий что, зачем и почему тут происходит.
Более того — я твердо верю что это лучший и безальтернативный способ работы с грамматиками — так что их надо тупо выучить и применять.
Ну и основная идея поста была не в том, что что-то можно оптимизировать, а в том, что это накладно. Я не оперирую терминами «читабельность» и т.д. Тупо цифры: сложность — +столько-то, размер — +столько-то, effort — +столько-то. И в итоге поддержка кода превращается в ад. Как бы так вот.
PS. хм, ну и на что тут будет похож вариант «без регулярок»?
Уж положа руку на сердце по-моему там вообще ничего оптимизировать не надо.
Тем более изобретать велосипедов и «обходится без регулярки».
Регулярные выражения — простой и выразительный способ описания алгоритма обработки грамматики, с первого взгляда объясняющий что, зачем и почему тут происходит.
Более того — я твердо верю что это лучший и безальтернативный способ работы с грамматиками — так что их надо тупо выучить и применять.
Ну и основная идея поста была не в том, что что-то можно оптимизировать, а в том, что это накладно. Я не оперирую терминами «читабельность» и т.д. Тупо цифры: сложность — +столько-то, размер — +столько-то, effort — +столько-то. И в итоге поддержка кода превращается в ад. Как бы так вот.
PS. хм, ну и на что тут будет похож вариант «без регулярок»?
Все зависит от того как вы используете RegExp и насколько он большой. В вашем случае это ничего не дает, но если вы создаете регулярку при каждом выполнении функции (new RegExp), то кеш может значительно ускорить функцию.
В вашем случае гораздо большего выигрыша можно получить изменив само регулярное выражение на
В вашем случае гораздо большего выигрыша можно получить изменив само регулярное выражение на
/_\d+(\d)(?:#\d+(\d))?$/
— и более понятно, и быстрее на ~50%Sign up to leave a comment.
Почем оптимизация или «бесплатных завтраков не бывает»