Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Оптимизация JavaScript в 10-20 раз, фантастика? А вот нет!! (https://javascript.ru/forum/misc/24228-optimizaciya-javascript-v-10-20-raz-fantastika-vot-net.html)

GuardCat 23.12.2011 11:14

Цитата:

Сообщение от melky
проверку на нечётность не напоминает ? таким образом , <число> & 1 эквивалентно проверке числа на нечётность. (<число> % 2)

Особое спасибо за вот этот момент.

melky 23.12.2011 11:17

я опустил такие уточнения, вроде "Boolean(1) будет true". надеюсь, всем будет понятно то, что я описал.

PS. кстати, имя темы говорит об увеличении производительности в 20 раз, а на практике коэффициент меняется от 1.82 (FF) до 2.5 (CH)

nerv_ 23.12.2011 11:37

melky, жаль не могу плюсануть рейтиг за столь исчерпывающий пост, форум не позволяет. Хотел бы кое-что добавить по сдвигам.
alert(16 >> 1); // 16 / 2
alert(16 << 1); // 16 * 2

Насколько мне известно, побитовые сдвиги - одни из самых быстрых операций в компутере ;)
Цитата:

Сообщение от melky
PS. кстати, имя темы говорит об увеличении производительности в 20 раз, а на практике коэффициент меняется от 1.82 (FF) до 2.5 (CH)

Да эт сразу понятно было, что утка.

B@rmaley.e><e 23.12.2011 11:46

Цитата:

Сообщение от melky
похоже на итератор (--,++)

Что? a >> i — деление a на 2^i с отбрасыванием остатка же.

m4gz 23.12.2011 12:21

Да наверно перегнул, посмотрев на их результаты, но в любом случаем чем больше данных обрабатываем тем больше и прирост

GuardCat 23.12.2011 12:38

melky, что ж вы как декремент обидели. Он может быть в 2-2.5 раза быстрее.
function stringFill2(x, n){ 
	var s = x, needLength = x.length * n;
	while(s.length < needLength)
		s += s;
	return s.substr(0,needLength);
}
Хотя это уже и не декремет вовсе получается, блин...
Но этот способ не так сильно отстаёт от побитового.

nerv_ 23.12.2011 12:52

В продолжении темы
Цитата:

Сообщение от melky
операция <число> & 1 будет возвращать 1 для тех чисел, у которых последняя цифра (1 для 5, 0 для 4) совпадает с 1

Думаю, в данном случае, это можно обозвать как "проверка бит по маске", хотя чаще используют их сброс или установку. Не самый удачный пример, но тем не менее :)
// Преобразование строки (lat.) в верхний регистр с помощью побитового оператора и (&), т.е. сброс бит по маске
// ----------------------
// имеем символ "a", код:  01100001 (97)
// сброс бит по маске:     11011111 (223)
// итог - символ "A", код: 01000001 (65)
// ----------------------
var x = prompt("Введите тект английскими буквами в нижнем регистре", "melky")
for(var j = [], i = 0; i < x.length; i++) {
	j[i] = x.charAt(i).charCodeAt(); // получить символ и его код
	j[i] &= 223; // сброс бит по маске 11011111 (двоичное представление числа 223)
	j[i] = String.fromCharCode(j[i]); // получить символ из таблицы Unicode-символов
}
alert(j.join(""));

melky 23.12.2011 18:16

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 145470)
Что? a >> i — деление a на 2^i с отбрасыванием остатка же.

ключевые слова похоже и итератор :)
спасибо. не знал!

m4gz 26.03.2012 12:32

А есть ли возможность перевести поиск по тексту на такой принцип? и будет ли он эффективнее регулярных выражений?

monolithed 26.03.2012 16:19

Цитата:

Сообщение от m4gz
А есть ли возможность перевести поиск по тексту на такой принцип?

Посимвольным считыванием потока данных занимаются конечные автоматы


Часовой пояс GMT +3, время: 09:35.