Почему расчет sqrt занимает больше времени, чем пифагор? - PullRequest
0 голосов
/ 11 октября 2018

Недавно я попытался сравнить производительность нескольких механизмов JavaScript, чтобы проверить производительность алгоритма сортировки, который я написал.В процессе я наткнулся на поведение, которое я не могу объяснить.В V8 и Spidermonkey функция pythagoras вычисляется в основном за то же время, что и sqrt, иногда даже быстрее!Поскольку sqrt является частью вычисления, я бы предположил, что он должен быть намного медленнее, чем 10000000 итераций ... Кажется, только в чакре пифагор рассчитывается на 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: almsot setRandomLatLon () постоянно занимает около 122 мс (по крайней мере в V8)

1 Ответ

0 голосов
/ 11 октября 2018

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

Основное изменение теперь заключалось в том, чтобы варьировать используемые значения широты и долготы для каждой итерации, используя функцию, которая почти всегда выполняется в одном и том же количестве.времени.

Окончательный код (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>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...