Часть 1 (Введение)

Долгое время я тщательно изучал движок V8 и понял, как создать свой код, чтобы он работал максимально быстро. Глубокое изучение производительности для этих микросекунд / миллисекунд было поездкой.

Во-первых, V8 компилируется JIT, а горячий код оптимизируется более тщательно, чем код, запускаемый несколько раз («холодный» код).

Это означает, что синтетические тесты должны быть деоптимизированы, чтобы получить полную картину. К счастью, добавление пустого выражения «eval» приведет к тому, что V8 не будет оптимизировать эту функцию, поэтому синтетические тесты, такие как Measurethat.net, будут работать.

Однако при работе с такими высокоточными измерениями механизм бенчмаркинга может даже иметь недостатки, и в большинстве случаев у нас нет времени проверить правильность кода. С точки зрения бизнеса нам, очевидно, необходимо создать свои собственные инструменты сравнительного анализа, и это может быть или не быть жизнеспособным в зависимости от того, в какой ситуации вы находитесь.

В любом случае, вот несколько интересных оптимизаций, которые мы нашли, и некоторые из них могут быть или не быть избыточными в зависимости от текущей версии V8. Также важно помнить, что код следует оптимизировать только в том случае, если это действительно горячий код, а микрооптимизация может вообще не иметь значения.

let array = [1, 2, 3];
for (let i = array.length; i--;) {
     console.log(array[i]);
};
//reverse for loops seem to be the fastest for performance
let array = [1, 2, 3];
for (let i = array.length, tmp; i--;) {
      console.log(tmp = array[i]);
      console.log(tmp);
      console.log(tmp);
};
//cache the array access in case you use the output more times, this is a primitive example

Вот один совет, который мы нашли: избегайте объектов, поскольку V8 должен будет создавать для них формы, поэтому вам следует найти способы обойти использование объектов или использование ненужных объектов. Помните, что «object.a» всегда будет медленнее, чем просто «a» в качестве локальной переменной.

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

const { log } = console;
//call log a million times...
log("test");

//will be faster than:
console.log("test");
//a million times

Просто чистое предположение, это может быть связано с тем, что движку JS может потребоваться искать области за пределами локальной области, чтобы найти то, что он ищет, поскольку именно так осуществляется управление доступом к переменным в V8.

Это первые странные примеры, которые мы нашли, я опубликую еще несколько в будущем.