Почему расчет sqrt занимает больше времени, чем пифагор?

1

Недавно я попытался сравнить производительность нескольких движков JavaScript, чтобы проверить производительность алгоритма сортировки, который я написал. В процессе я наткнулся на поведение, которое я не могу объяснить. В V8 и Spidermonkey функция pythagoras вычисляется в основном в то же время, что и sqrt, иногда EVEN FASTER! Поскольку sqrt является частью расчета, я бы предположил, что он должен быть намного медленнее более чем за 10000000 итераций... Кажется, что только в чакре pythagoras подсчитывается примерно на 3-4 секунды медленнее.

компьютер:

  • ОС: Win 10 64 бит
  • Процессор: i5-8250U 4 ядра
  • ОЗУ: 8 ГБ

с последними доступными версиями каждого браузера в это время (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)

  • 2
    Потому что вы не используете квадратный корень для одних и тех же чисел, а вычисления для разных чисел занимают разное время? (28-14) + (24-12) => 14 + 12 => 26, в то время как ваш «чистый» квадратный корень рассчитан на 28.
  • 0
    не должно ли это также вызвать медленное вычисление функции Пифагора? Тем не менее, иногда он рассчитывается быстрее ...
Показать ещё 5 комментариев
Теги:
performance-testing

1 ответ

0
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню