fork(2) download
  1. <?php
  2. /*===================*/
  3. /* Тестовая функция. */
  4. /*===================*/
  5. function test ($a)
  6. {
  7. global $testval1, $testval2;
  8. $l = $testval1 * $a;
  9. for ($i = 0; $i < $l; ++$i)
  10. $testval2 .= 'X';
  11. }
  12. /*==================================*/
  13. /* Хронометраж выполнения операций. */
  14. /* Автор: Игорь Орещенков, 2015. */
  15. /*==================================*/
  16. $testval1 = 32;
  17. $testval2 = '';
  18. $n = 10; // количество опытов
  19. $m = 1000; // количество итераций в одном опыте
  20. $di = 0.02; // инструментальная погрешность измерений
  21. $tan = 2.9; // коэффициент доверия (98%;10)
  22. $tu = array ();
  23. $pu = array ();
  24. for ($u = 1000; $u < 10001; $u += 1000):
  25. do {
  26. $caption = "Testing string building $u x $testval1 chars length (concatenating).";
  27. echo $caption . "\n";
  28. /*-----------------------------*/
  29. /* Основной цикл эксперимента. */
  30. /*-----------------------------*/
  31. $t = array ();
  32. for ($i = 0; $i < $n + 2; ++$i):
  33. $tm1 = microtime_float (); // отметка времени старта
  34. for ($j = 0; $j < $m; ++$j):
  35. $testval2 = '';
  36. test ($u);
  37. endfor;
  38. $tm2 = microtime_float (); // отметка времени финиша
  39. /* Результат хронометража. */
  40. $dt = round ($tm2 - $tm1, 3);
  41. $t[] = $dt;
  42. echo "Experiment N $i\n";
  43. echo "Start: $tm1\n";
  44. echo "Finish: $tm2\n";
  45. echo "Elapsed: $dt\n";
  46. endfor;
  47. /*-------------------------------------------------*/
  48. /* Статистическая обработка результатов измерений. */
  49. /*-------------------------------------------------*/
  50. sort ($t);
  51. for ($i = 0; $i < $n - 1; ++$i)
  52. $t[$i] = $t[$i + 1];
  53. unset ($t[$n + 1]);
  54. unset ($t[$n]);
  55. $tavg = avg ($t); // выборочное среднее
  56. $tsd = stddev ($t, $tavg); // выборочное среднее квадратическое отклонение
  57. /*------------------------------------------------------------------------------*/
  58. /* Оценка минимального и максимального значения с точки зрения критерия Шовене. */
  59. /*------------------------------------------------------------------------------*/
  60. $t1 = $t[0];
  61. $shovz1 = abs ($t1 - $tavg) / $tsd;
  62. $t2 = $t[$n - 1];
  63. $shovz2 = abs ($t2 - $tavg) / $tsd;
  64. $shovm1 = shovene ($shovz1); // значение M для минимального значения
  65. $shovm2 = shovene ($shovz2); // значение M для максимального значения
  66. if ($shovm1 <= $n and $shovm2 <= $n):
  67. /*------------------------------------------------*/
  68. /* Вычисление случайной составляющей погрешности. */
  69. /*------------------------------------------------*/
  70. $tsdavg = $tsd / sqrt ($n); // среднее квадратическое отклонение среднего
  71. $dtrnd = $tan * $tsdavg;
  72. /*---------------------------------*/
  73. /* Вычисление полных погрешностей. */
  74. /*---------------------------------*/
  75. $dtabs = sqrt ($di * $di + $dtrnd * $dtrnd); // абсолютная погрешность
  76. $dtrel = round (($dtabs / $tavg) * 100, 2); // относительная погрешность в процентах
  77. /*-----------------------------------------*/
  78. /* Запись в файл результатов эксперимента. */
  79. /*-----------------------------------------*/
  80. $res = "Количество опытов: $n\r\n";
  81. $res .= "Продолжительность опытов: ";
  82. for ($i = 0; $i < $n - 1; ++$i):
  83. $res .= $t[$i] . ', ';
  84. endfor;
  85. $res .= $t[$n - 1] . "\r\n";
  86. $res .= "Средняя продолжительность: $tavg\r\n";
  87. $res .= "Относительная погрешность: $dtrel%\r\n";
  88. $fname = substr (time (), -7) .'.txt';
  89. $f = fopen ($fname, "w");
  90. if ($f):
  91. fputs ($f, "$caption\r\n");
  92. fputs ($f, "$res\r\n");
  93. fclose ($f);
  94. endif;
  95. $tu[] = $tavg;
  96. $pu[] = $dtrel;
  97. echo "See file $fname for results of the experiment\n";
  98. $crit = true;
  99. else:
  100. echo "Shovene criteria!\n";
  101. $crit = false;
  102. endif;
  103. } while (!$crit);
  104. endfor;
  105. /*----------------------------------------------*/
  106. /* Запись в файл общего протокола эксперимента. */
  107. /*----------------------------------------------*/
  108. $fname = "s" . substr (time (), -7) . '.txt';
  109. $f = fopen ($fname, "w");
  110. if ($f):
  111. fputs ($f, "$caption\r\n");
  112. for ($i = 0; $i < count ($tu); ++$i):
  113. $tu0 = $tu[$i];
  114. $pu0 = $pu[$i];
  115. fputs ($f, "$tu0 ($pu0%)\r\n");
  116. endfor;
  117. fclose ($f);
  118. endif;
  119. /*===========================================*/
  120. /* Вычисление выборочного среднего значения. */
  121. /*===========================================*/
  122. function avg ($a)
  123. {
  124. $n = count ($a);
  125. echo "Debug AVG: n = $n\n";
  126. $sa = 0;
  127. for ($i = 0; $i < $n; ++$i):
  128. $sa += $a[$i];
  129. endfor;
  130. return $sa / $n;
  131. }
  132. /*=================================================*/
  133. /* Вычисление среднего квадратического отклонения. */
  134. /*=================================================*/
  135. function stddev ($a, $aavg)
  136. {
  137. $n = count ($a);
  138. $sa = 0;
  139. for ($i = 0; $i < $n; ++$i):
  140. $d = $a[$i] - $aavg;
  141. $sa += $d * $d;
  142. endfor;
  143. return sqrt ($sa / ($n - 1));
  144. }
  145. /*======================================*/
  146. /* Критерий Шовене для отбора промахов. */
  147. /*======================================*/
  148. function shovene ($z)
  149. {
  150. if ($z < 1):
  151. $m = 1;
  152. elseif ($z <= 1.28):
  153. $m = 2;
  154. elseif ($z <= 1.46):
  155. $m = 3;
  156. elseif ($z <= 1.58):
  157. $m = 4;
  158. elseif ($z <= 1.68):
  159. $m = 5;
  160. elseif ($z <= 1.76):
  161. $m = 6;
  162. elseif ($z <= 1.78):
  163. $m = 7;
  164. elseif ($z <= 1.82):
  165. $m = 8;
  166. elseif ($z <= 1.92):
  167. $m = 9;
  168. elseif ($z <= 1.98):
  169. $m = 10;
  170. elseif ($z <= 2.00):
  171. $m = 11;
  172. elseif ($z <= 2.04):
  173. $m = 12;
  174. elseif ($z <= 2.08):
  175. $m = 13;
  176. elseif ($z <= 2.10):
  177. $m = 14;
  178. elseif ($z <= 2.12):
  179. $m = 15;
  180. elseif ($z <= 2.16):
  181. $m = 16;
  182. elseif ($z <= 2.18):
  183. $m = 17;
  184. elseif ($z <= 2.20):
  185. $m = 18;
  186. elseif ($z <= 2.22):
  187. $m = 19;
  188. elseif ($z <= 2.24):
  189. $m = 20;
  190. elseif ($z <= 2.26):
  191. $m = 21;
  192. elseif ($z <= 2.28):
  193. $m = 22;
  194. elseif ($z <= 2.30):
  195. $m = 23;
  196. elseif ($z <= 2.32):
  197. $m = 25;
  198. elseif ($z <= 2.34):
  199. $m = 26;
  200. elseif ($z <= 2.36):
  201. $m = 27;
  202. elseif ($z <= 2.38):
  203. $m = 29;
  204. elseif ($z <= 2.40):
  205. $m = 30;
  206. else:
  207. $m = 999;
  208. endif;
  209. return $m;
  210. }
  211. /*========================================================*/
  212. /* Получение текущего времени с точностью до микросекунд. */
  213. /*========================================================*/
  214. function microtime_float ()
  215. {
  216. list ($usec, $sec) = explode (' ', microtime ());
  217. return round ((float)$usec + (float)$sec, 3);
  218. }
Time limit exceeded #stdin #stdout #stderr 15s 33632KB
stdin
Standard input is empty
stdout
Testing string building 1000 x 32 chars length (concatenating).
Experiment N 0
Start:   1420739922.056
Finish:  1420739922.463
Elapsed: 0.407
Experiment N 1
Start:   1420739922.463
Finish:  1420739922.87
Elapsed: 0.407
Experiment N 2
Start:   1420739922.87
Finish:  1420739923.278
Elapsed: 0.408
Experiment N 3
Start:   1420739923.278
Finish:  1420739923.686
Elapsed: 0.408
Experiment N 4
Start:   1420739923.686
Finish:  1420739924.084
Elapsed: 0.398
Experiment N 5
Start:   1420739924.084
Finish:  1420739924.492
Elapsed: 0.408
Experiment N 6
Start:   1420739924.492
Finish:  1420739924.893
Elapsed: 0.401
Experiment N 7
Start:   1420739924.893
Finish:  1420739925.301
Elapsed: 0.408
Experiment N 8
Start:   1420739925.301
Finish:  1420739925.702
Elapsed: 0.401
Experiment N 9
Start:   1420739925.702
Finish:  1420739926.109
Elapsed: 0.407
Experiment N 10
Start:   1420739926.109
Finish:  1420739926.513
Elapsed: 0.404
Experiment N 11
Start:   1420739926.513
Finish:  1420739926.919
Elapsed: 0.406
Debug AVG: n = 10
See file 0739926.txt for results of the experiment
Testing string building 2000 x 32 chars length (concatenating).
Experiment N 0
Start:   1420739926.92
Finish:  1420739927.728
Elapsed: 0.808
Experiment N 1
Start:   1420739927.728
Finish:  1420739928.551
Elapsed: 0.823
Experiment N 2
Start:   1420739928.551
Finish:  1420739929.374
Elapsed: 0.823
Experiment N 3
Start:   1420739929.374
Finish:  1420739930.197
Elapsed: 0.823
Experiment N 4
Start:   1420739930.197
Finish:  1420739931.012
Elapsed: 0.815
Experiment N 5
Start:   1420739931.012
Finish:  1420739931.835
Elapsed: 0.823
Experiment N 6
Start:   1420739931.835
Finish:  1420739932.657
Elapsed: 0.822
Experiment N 7
Start:   1420739932.657
Finish:  1420739933.469
Elapsed: 0.812
Experiment N 8
Start:   1420739933.469
Finish:  1420739934.293
Elapsed: 0.824
Experiment N 9
Start:   1420739934.293
Finish:  1420739935.113
Elapsed: 0.82
Experiment N 10
Start:   1420739935.113
Finish:  1420739935.931
Elapsed: 0.818
Experiment N 11
Start:   1420739935.931
Finish:  1420739936.742
Elapsed: 0.811
Debug AVG: n = 10
See file 0739936.txt for results of the experiment
Testing string building 3000 x 32 chars length (concatenating).
stderr
PHP Warning:  fopen(0739926.txt): failed to open stream: Permission denied in /home/ZN3VPq/prog.php on line 89
PHP Warning:  fopen(0739936.txt): failed to open stream: Permission denied in /home/ZN3VPq/prog.php on line 89