Как именно V8 оптимизирует / встраивает?

Мне интересно, можно ли узнать, как именно V8 оптимизирует и встраивает вещи.

Я создал три простых тестовых функции , которые вычисляют синус угла в градусах. Я поместил их все в закрытие, чтобы V8 мог встроить локальные переменные.


1. Используя предварительно вычисленную константу Math.PI / 180 , а затем выполните Math.sin (x * constant) .

Я использовал этот код:

var test1 = (function() {
  var constant = Math.PI / 180; // only calculate the constant once

  return function(x) {
    return Math.sin(x * constant);
  };
})();

2. Расчет константы на лету.

var test2 = (function() {
  var pi = Math.PI; // so that the compiler knows pi cannot change
                    // and it can inline it (Math.PI could change
                    // at any time, but pi cannot)

  return function(x) {
    return Math.sin(x * pi / 180);
  };
})();

3. Использование буквальных чисел и вычисление константы на лету.

var test3 = (function() {
  return function(x) {
    return Math.sin(x * 3.141592653589793 / 180);
  };
})();

На удивление, результаты были следующими:

test1 - 25,090,305 ops/sec
test2 - 16,919,787 ops/sec
test3 - 16,919,787 ops/sec

Похоже, pi действительно был встроен в test2 как test2 и test3 ] приводят к точно такому же количеству операций в секунду.

С другой стороны, разделение не кажется оптимизированным (т. Е. Предварительно вычисленным), поскольку test1 выполняется значительно быстрее.

  • Почему константа не вычисляется заранее, если в этом случае вы не делаете этого вручную?
  • Можно ли увидеть, как V8 точно оптимизирует функции на определенной веб-странице?

19
задан pimvdb 7 November 2011 в 18:16
поделиться