Мне интересно, возможно ли получить знания о том, как именно 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 точно оптимизирует функции на определенной веб-странице?