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