Недавно я попытался сравнить производительность нескольких движков JavaScript, чтобы проверить производительность алгоритма сортировки, который я написал. В процессе я наткнулся на поведение, которое я не могу объяснить. В V8 и Spidermonkey функция pythagoras вычисляется в основном в то же время, что и sqrt, иногда EVEN FASTER! Поскольку sqrt является частью расчета, я бы предположил, что он должен быть намного медленнее более чем за 10000000 итераций... Кажется, что только в чакре pythagoras подсчитывается примерно на 3-4 секунды медленнее.
компьютер:
с последними доступными версиями каждого браузера в это время (Chrome, Firefox и Edge)
Вот мой тестовый сценарий:
var out = document.getElementById("output")
var start, temp,
lat1 = 14, lat2 = 28, lon1 = 12, lon2 = 24,
steps = 10000000
start = Date.now()
for(var i = 0; i < steps; i++) {
temp = Math.sqrt(lat2)
}
out.innerHTML += '<div> sqrt : ' + (Date.now() - start) + '</div>'
// pythagoras
start = Date.now();
for(var i = 0; i < steps; i++) {
temp = Math.sqrt(Math.pow(lat2 - lat1, 2) + Math.pow(lon2 - lon1, 2))
}
out.innerHTML += '<div> pythagoras : ' + (Date.now() - start) + '</div>'
PS: setRandomLatLon() almsot последовательно занимает около 122 мс (по крайней мере, в V8)
Спасибо за предлагаемые решения. Теперь тестовый пример работает правильно (учитывая, что он дает ожидаемые результаты).
Основное изменение теперь заключалось в том, чтобы варьировать используемые значения lat, lon с каждой итерацией, используя функцию, которая почти всегда выполняется за такое же количество времени.
Конечный код (setRandomLatLon принимает в V8 около 120 мс за 10000000 итераций):
var out = document.getElementById("output")
var start, temp,
lat1, lat2, lon1, lon2,
steps = 10000000
function setRandomLatLon(){
rand = Math.floor(Math.random()*12);
lat1 = rand + 2
lat2 = rand + 12
lon1 = rand + 4
lon2 = rand + 14
}
// pythagoras
start = Date.now()
for(var i = 0; i < steps; i++) {
setRandomLatLon()
temp = Math.sqrt(lat2)
}
out.innerHTML += '<div> sqrt : ' + (Date.now() - start) + '</div>'
// pythagoras
start = Date.now();
for(var i = 0; i < steps; i++) {
setRandomLatLon()
temp = Math.sqrt(Math.pow(lat2 - lat1, 2) + Math.pow(lon2 - lon1, 2))
}
out.innerHTML += '<div> pythagoras : ' + (Date.now() - start) + '</div>'