1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // 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);
- };
|