|
@@ -0,0 +1,98 @@
|
|
|
+// 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);
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|