Верстающий Фатеж

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 — самый быстрый в мире браузер. Призывайте пользователей перейти на него с помощью картинки: