У меня есть список некоторых функций, выполняющий математические операции. Мне нужно замерить время их выполнения в наносекундах, с учётом того, что аргумент - случайное число. Проблема в том, что когда я несколько раз выполняю измерение, то это время слишком сильно различается.
Рассмотрим на конкретной функции:
var func = function(x) {
return x*x
}
Она возводит число в квадрат
Теперь кажется очевидным, что скорость нужно измерить таким образом
var func = function(x) {
return x*x
}
var s_time = performance.now()
func(Math.random())
var dur = performance.now() - s_time
console.log(dur)
Но во-первых, эта функция слишком быстро выполняется, чтобы её можно измерить выполнив один раз (возведение в квадрат это несколько десятков наносекунд, а не микросекунд (я так думал...))
Во-вторых, если несколько раз запускать, то значения сильно разнятся от 0.005 до 0.04 ms
Поэтому выполним сразу достаточно большое число итераций, а время просто разделим на это кол-во итераций.
var func = function(x) {
return x*x
}
var iterations = 1000000
var s_time = performance.now()
for (var i=0; i < iterations; i++) { func(Math.random()) }
var dur = (performance.now() - s_time)/iterations*1000*1000
document.write(iterations + " итераций: "+ dur.toFixed(4)+' ns/итерация<br>')
Я решил проверить на нескольких итерациях
Чем больше использовать итераций, тем быстрее каждая операция просчитывается. Я думал грубо говоря, что 100 раз возвести в квадрат в 10 раз медленее, чем возвести в квадрат 10 раз. Но судя по результатам этой программы, это не так. Только на последних двух записях примерно равно время выполнения одной операции.
Вопрос в том, какая из полученных скоростей правильная? И можно ли как-то быстрее это измерять? Запускать 1 миллиард и даже 100 миллионов раз операцию может оказаться слишком долго