speedtest.js 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // speedtest
  2. // -------------УСЛОВИЕ-------------
  3. // Написать асинхронную функцию
  4. // async function speedtest(getPromise, count,parallel=1){
  5. // ....
  6. // return {
  7. // duration,
  8. // querySpeed, //средняя скорость одного запроса
  9. // queryDuration, //
  10. // parallelSpeed,
  11. // parallelDuration
  12. // }
  13. // }
  14. // speedtest(() => delay(1000), 10, 10 ).then(result => console.log(result))
  15. // {duration: 10000,
  16. // querySpeed: 0.001, //1 тысячная запроса за миллисекунду
  17. // queryDuration: 1000, //1000 миллисекунд на один реальный запрос в среднем
  18. // parallelSpeed: 0.01 // 100 запросов за 10000 миллисекунд
  19. // parallelDuration: 100 // 100 запросов за 10000 миллисекунд
  20. // speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), 10, 5)
  21. // где:
  22. // count - количество повторов
  23. // parallel - количество одновременных запросов/промисов в одном повторе
  24. // getPromise - функция, которая умеет вернуть нужный Вам промис для тестирования скорости его работы
  25. // которая будет в цикле count раз создавать parallel промисов с помощью переданной функции getPromise,
  26. // дожидаться выполнения всех parallel промисов, после чего цикл повторяется.
  27. // Замерить время общее время выполнения, и вычислить:
  28. // duration, общую длительность работы цикла
  29. // parallelDuration, среднее время обработки запроса параллельно (за какое время исполнилось parallel*count промисов),
  30. // paralledSpeed, скорость в запросах в миллисекунду
  31. // queryDuration, реальное среднее время запроса (отталкиваясь от count и времени работы цикла).
  32. // querySpeed, реальное средняя скорость запроса
  33. // Эти переменные вернуть в одном объекте-результате (см. заготовку выше)
  34. // Для отладки попробуйте на delay(пример выше есть, реальное время будет отличаться на единицы - десятки миллисекунд).
  35. // Потом можете попробовать на swapi.dev. Не создавайте чрезмерно много параллельных запросов.
  36. // -------------РЕШЕНИЕ-------------
  37. speedBtn.onclick = () => {
  38. const delay = ms => new Promise(ok => setTimeout(() => ok(ms), ms))
  39. countInpt.value && (count=countInpt.value)&& (countInpt.value = '');
  40. parallelInpt.value && (parallel = parallelInpt.value) && (parallelInpt.value = '');
  41. async function speedtest(getPromise, count, parallel = 1) {
  42. let [duration, querySpeed, queryDuration, parallelSpeed, parallelDuration] = [0, 0, 0, 0, 0];
  43. const startTimestamp = new Date();
  44. let i = 1;
  45. while (i <= count) {
  46. let j = 1;
  47. const promiseArray = [];
  48. while (j <= parallel) {
  49. promiseArray.push(getPromise());
  50. j++;
  51. }
  52. await Promise.all([...promiseArray]);
  53. i++;
  54. }
  55. const finalTimestamp = new Date();
  56. duration = finalTimestamp - startTimestamp;
  57. querySpeed = Math.round(count / duration*1000)/1000;
  58. queryDuration = Math.round(1 / querySpeed*100)/100;
  59. parallelSpeed =Math.round((parallel*count)/duration*100)/100;
  60. parallelDuration =Math.round( 1 / parallelSpeed*100)/100;
  61. let result = document.createElement('p');
  62. result.innerText=JSON.stringify({duration,
  63. querySpeed,
  64. queryDuration,
  65. parallelSpeed,
  66. parallelDuration
  67. });
  68. rootSpeed.appendChild(result);
  69. return {duration,
  70. querySpeed,
  71. queryDuration,
  72. parallelSpeed,
  73. parallelDuration
  74. };
  75. }
  76. // speedtest(() => delay(1000), 10, 10).then(result => console.log(result));
  77. speedtest(() => fetch('http://swapi.dev/api/people/1').then(res => res.json()), count, parallel);
  78. };