// speedtest // -------------УСЛОВИЕ------------- // Написать асинхронную функцию // async function speedtest(getPromise, count,parallel=1){ // .... // return { // duration, // querySpeed, //средняя скорость одного запроса // queryDuration, // // parallelSpeed, // parallelDuration // } // } // speedtest(() => delay(1000), 10, 10 ).then(result => console.log(result)) // {duration: 10000, // querySpeed: 0.001, //1 тысячная запроса за миллисекунду // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд // parallelDuration: 100 // 100 запросов за 10000 миллисекунд // speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5) // где: // count - количество повторов // parallel - количество одновременных запросов/промисов в одном повторе // getPromise - функция, которая умеет вернуть нужный Вам промис для тестирования скорости его работы // которая будет в цикле count раз создавать parallel промисов с помощью переданной функции getPromise, // дожидаться выполнения всех parallel промисов, после чего цикл повторяется. // Замерить время общее время выполнения, и вычислить: // duration, общую длительность работы цикла // parallelDuration, среднее время обработки запроса параллельно (за какое время исполнилось parallel*count промисов), // paralledSpeed, скорость в запросах в миллисекунду // queryDuration, реальное среднее время запроса (отталкиваясь от count и времени работы цикла). // querySpeed, реальное средняя скорость запроса // Эти переменные вернуть в одном объекте-результате (см. заготовку выше) // Для отладки попробуйте на delay(пример выше есть, реальное время будет отличаться на единицы - десятки миллисекунд). // Потом можете попробовать на swapi.dev. Не создавайте чрезмерно много параллельных запросов. // -------------РЕШЕНИЕ------------- speedBtn.onclick = () => { const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms)) countInpt.value && (count=countInpt.value)&& (countInpt.value = ''); parallelInpt.value && (parallel = parallelInpt.value) && (parallelInpt.value = ''); async function speedtest(getPromise, count, parallel = 1) { let [duration, querySpeed, queryDuration, parallelSpeed, parallelDuration] = [0, 0, 0, 0, 0]; const startTimestamp = new Date(); let i = 1; while (i <= count) { let j = 1; const promiseArray = []; while (j <= parallel) { promiseArray.push(getPromise()); j++; } await Promise.all([...promiseArray]); i++; } const finalTimestamp = new Date(); duration = finalTimestamp - startTimestamp; querySpeed = Math.round(count / duration*1000)/1000; queryDuration = Math.round(1 / querySpeed*100)/100; parallelSpeed =Math.round((parallel*count)/duration*100)/100; parallelDuration =Math.round( 1 / parallelSpeed*100)/100; let result = document.createElement('p'); result.innerText=JSON.stringify({duration, querySpeed, queryDuration, parallelSpeed, parallelDuration }); rootSpeed.appendChild(result); return {duration, querySpeed, queryDuration, parallelSpeed, parallelDuration }; } // speedtest(() => delay(1000), 10, 10).then(result => console.log(result)); speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), count, parallel); };