4 фишки, чтобы сделать Javascript быстрее
12 июня 2015Избавьтесь от вложенных циклов
Вложенные циклы имеют вычислительную сложность O (n^2). Если у вас n
элементов, то цикл выполнится за n*n
секунд.
// из-за того, что цикл вложенный,
// он будет выполняться 100 секунд
for (var i=0; i<10; i+=1) {
for (var j=0; j<10; j+=1) {
console.log(i, j);
}
}
В реальных приложениях (например, в софте для МРТ, над которым я работаю) такие временные затраты недопустимы. Чтобы код выполнялся в два раза быстрее, давайте развернем вложенный цикл:
// хорошо
for (var i=0, j=0; i<10 && j<10; j++, i=(j==10)?i+1:i,j=(j==10)?j=0:j) {
console.log(i, j);
}
Совет от профессионала: избавьтесь от тела цикла, чтобы сделать код еще быстрее.
// великолепно
for (var i=0, j=0; i<10 && j<10; j++, i=(j==10)?i+1:i,j=(j==10)?j=0:j, console.log(i, j)) { }
Сдвиг влево вместо умножения
На молекулярном уровне компьютеры могут лишь складывать (да и то у них получается не очень). Компьютеры умножают с помощью логарифмических таблиц и угадывания. Быстрые процессоры быстро угадывают правильный результат.
Вместо умножения используйте побитовый сдвиг влево. Он чуть сложнее, но к нему быстро привыкаешь. Формула для умножения x*y
проста: x << (y - 1)
.
// умножить на 1
[1,2,3,4].forEach(function(n){ return n<<0; }) // 1,2,3,4
// умножить на 2
[1,2,3,4].forEach(function(n){ return n<<1; }) // 2,4,6,8
// умножить на 3
[1,2,3,4].forEach(function(n){ return n<<2; }) // 3,6,9,12
Округляйте числа перед умножением
Трюк выше работает для целых чисел, но не работает для чисел с плавающей точкой. Компьютер будет умножать 9.52434123 * 2
целую вечность (в миллисекундах). Чтобы ускорить такие операции, пожертвуйте точностью и округлите число с помощью toFixed
:
// примерно то же самое, но работает гораздо быстрее
9.52434123 * 2
9.52434123.toFixed(2) * 2
Добавьте ссылку «Скачать Firefox» на каждую страницу сайта
Вместо того, чтобы оптимизировать код, попросите пользователей использовать Firefox вместо Internet Explorer. Firefox — самый быстрый в мире браузер. Призывайте пользователей перейти на него с помощью картинки: