Среднее время выполнения функции, запущенной n-раз с интервалом k
Используя наработки в предыдущей моей теме:
"Самый быстрый и короткий способ получить текст до первого пробела", решил сделать функцию вычисления среднего времени запуска тестовой функции n-раз с паузой между запусками k, но не получилось: var arr = [], // массив времен выполнения i = 0, n = 10, // запустить тестовую функцию 10 раз k = 2000, // интервал запуска p = performance, // штуковина для точного измерения времени? result, // сюда сохраним среднее значений массива 'arr' timerId, t0, t1; // соответственно, моменты запуска и завершения тест. функции function test(){ 'lorem'.repeat(10000) // повторяем и соединяем строку 'lorem' } timerId = setTimeout(function run(){ t0 = p.now(); // время запуска test(); // тестовая функция t1 = p.now(); // время завершения arr.push(t1 - t0); // время выполнения if (i < n){ // проверяем сколько раз запустили тестовую функцию i++ } else { clearTimeout(timerId); // сброс result = (arr.reduce((a,b)=>a+b,0))/arr.length // вычисляем среднее времен выполнения }; setTimeout(run, k); }, k); alert(result); // undefined -> расстроен (( Запускать функцию хочу как тут: https://learn.javascript.ru/settimeout-setinterval Цитата: "Рекурсивный setTimeout гарантирует паузу между вызовами, setInterval – нет" Цель: :-E -> :dance: |
ждать долго не надо
10 раз для точного определения мало. Посмотрите как работают существующие сервисы, они крутят функцию по цепочке определенное количество времени и считают итерации. |
Что-то мне подсказывает, что код функции, считающий время, в таких сервисах будет огромным.
Так часто бывает, хочешь узнать как что-либо работает, надеешься, что все решается в пару строк, а там такое, что хочется все бросить )) В связи с этим, я подумал, что быстрее самому изобрести, заодно и "полоска" опыта прибавится! |
Teamur,
почему 29 строка не в начале 25? |
Прежде чем писать свой бенчмарк js рекомендую почитать на эту темы статьи (благо копий сломано достаточно на это тему). Есть даже видеодоклады с конференций на русском на тему бенчмаркинга js.
Например если вы не используете результаты выполнения функции то компилятор js может вообще ее не вызвать и вы будете мерить вызов Date.now() и Date.now() - start. К тому же любую вашу функцию js движок пытается оптимизировать в процессе работы, и поэтому она может работать быстрее через n вызовов (а может и медленнее) |
Цитата:
Для этого сохранил его в переменной result. |
EmperioAf,
было такое, когда я обновлял страничку с открытой консолью, время выполнения бывало сильно отличалось раз от раза. Насчет Бенчмарков я, конечно почитаю, но я думал что это задача реально решается в пару строчек кода, десяток строк. |
Rise,
спасибо, пригодится, но я не очень люблю подключать громоздкие библиотеки ради простых операций, нап. подключать jQuery ради удобного назначения обработчиков событий: $(elem).on('click',fn). Цитата:
наверное как в паттерне: var totalTime; var start = new Date; var iterations = 6; while (iterations--) { // Code snippet goes here. } // `totalTime` is the number of milliseconds it took to execute the code snippet 6 times. totalTime = new Date - start; |
Rise,
function sample1() { var str = '1 2 3 4 5 6 7 8 9 10'; str.substring(0, str.indexOf(' ')); } function sample2() { '1 2 3 4 5 6 7 8 9 10'.split(' ')[0]; } console.log(bench(1000, sample1) + '\n' + bench(1000, sample2)); поправлю себя, действительно бенчит этот код |
Всем спасибо за ответы и советы! Всего доброго!
|
Часовой пояс GMT +3, время: 22:08. |