Дебажил свой код, в итоге обнаружил следующее: Thread.sleep(Timeout) выполняется с низкой точностью (и решил поделиться с общественностью). Для проверки точности измерений Thread.sleep(Timeout) был написан вот этот кусок кода: | Код | timer = System.currentTimeMillis();// замеряем текущее время.
Thread.sleep(Timeout);// спим %Timeout% ms.
diff = (System.currentTimeMillis() - timer); // считаем сколько // реально // проспали.
|
Затем оно прогонялся поочерёдно для Timeout= 1, 2, 3, ... Как показал тест под Windows: Thread.sleep(Timeout); проспит С БОЛЬШОЙ ВЕРОЯТНОСТЬЮ (больше 90%) заданное время (Timeout) если заданное время кратно 15 миллисекундам, либо больше 100 миллисекунд. Весь код: | Код | package test;
public class Msec {
/** * @param args * @throws InterruptedException */
static long timer; static long Timeout; static long diff; static int Measurements = 100; static double average = 0; static long max = 0; static long maxdiff = 0; private static double v;
public static void main(String[] args) throws InterruptedException {
System.out.println("measurements: " + (Measurements) + ""); // количество // замеров System.out.println();
for (int j = 1; j < 10000; j = j + 1) { Timeout = j; // Выбираем таймаут для тестирования
max = 0; maxdiff = 0; for (int k = 0; k < Measurements; k++)// выполняем %Measurements% // замеров { System.gc(); // Чистим память.
timer = System.currentTimeMillis();// замеряем текущее время.
Thread.sleep(Timeout);// спим %Timeout% ms.
diff = (System.currentTimeMillis() - timer); // считаем сколько // реально // проспали.
if (Math.abs(diff - Timeout) > Math.abs(max)) { max = (diff - Timeout); // Регистрируем максимальное // отклонение maxdiff = diff; // Регистрируем значение дающее максимальное // отклонение }
average = average + Math.abs(diff - Timeout); // накапливаем // отклонения }
average = average / Measurements; // Итого. Считаем среднее // отклонение.
//printFullStats(); //Печатаем подробную статистику printShortStats(); //Печатаем только качество для заданного таймаута
} }
private static void printFullStats() { System.out .println("--------------------------------------------------"); System.out.println("tested timeout = [" + Timeout + "] ms "); // TODO Auto-generated method stub System.out.println(" max bad value: " + (maxdiff) + "ms"); // значение // дающее // максимальное // отклонение
System.out.println(" max difference: " + (max) + "ms"); // максимальное // отклонение
System.out.println(" %: " + ((int) (10000 * (max) / Timeout) / 100.0)); // максимальное // отклонение // %
System.out.println(" average diff: " + (((int) (100 * average)) / 100.0) + "ms"); // среднее // отклонение
System.out.println(" %: " + ((int) (10000 * (average) / Timeout) / 100.0)); // среднее // отклонение // %
}
private static void printShortStats() throws InterruptedException { v = ((int) (10000 * (average) / Timeout) / 100.0); if (v >= 10) { System.out .println("--------------------------------------------------"); System.out.println("tested timeout = [" + Timeout + "] ms "); System.out.println(" quailty %: " + v); } else { System.err .println("--------------------------------------------------"); System.err.println("tested timeout = [" + Timeout + "] ms "); System.err.println(" quailty %: " + v); Thread.sleep(100); }
} }
|
Лог: | Код | measurements: 100
-------------------------------------------------- tested timout = [1] ms quailty %: 304.0 -------------------------------------------------- tested timout = [2] ms quailty %: 194.52 -------------------------------------------------- tested timout = [3] ms quailty %: 188.63 -------------------------------------------------- tested timout = [4] ms quailty %: 163.91 -------------------------------------------------- tested timout = [5] ms quailty %: 164.11 -------------------------------------------------- tested timout = [6] ms quailty %: 129.2 -------------------------------------------------- tested timout = [7] ms quailty %: 113.25 -------------------------------------------------- tested timout = [8] ms quailty %: 98.11 -------------------------------------------------- tested timout = [9] ms quailty %: 82.42 -------------------------------------------------- tested timout = [10] ms quailty %: 73.54 -------------------------------------------------- tested timout = [11] ms quailty %: 59.03 -------------------------------------------------- tested timout = [12] ms quailty %: 41.79 -------------------------------------------------- tested timout = [13] ms quailty %: 32.0 -------------------------------------------------- tested timout = [14] ms quailty %: 19.72 -------------------------------------------------- tested timout = [15] ms quailty %: 4.51 -------------------------------------------------- tested timout = [16] ms quailty %: 12.6 -------------------------------------------------- tested timout = [17] ms quailty %: 18.0 -------------------------------------------------- tested timout = [18] ms quailty %: 26.0 -------------------------------------------------- tested timout = [19] ms quailty %: 30.77 -------------------------------------------------- tested timout = [20] ms quailty %: 29.09 -------------------------------------------------- tested timout = [21] ms quailty %: 34.51 -------------------------------------------------- tested timout = [22] ms quailty %: 34.96 -------------------------------------------------- tested timout = [23] ms quailty %: 34.29 -------------------------------------------------- tested timout = [24] ms quailty %: 32.32 -------------------------------------------------- tested timout = [25] ms quailty %: 37.27 -------------------------------------------------- tested timout = [26] ms quailty %: 26.12 -------------------------------------------------- tested timout = [27] ms quailty %: 22.06 -------------------------------------------------- tested timout = [28] ms quailty %: 15.74 -------------------------------------------------- tested timout = [29] ms quailty %: 12.6 -------------------------------------------------- tested timout = [30] ms quailty %: 6.78 -------------------------------------------------- tested timout = [31] ms quailty %: 1.87 -------------------------------------------------- tested timout = [32] ms quailty %: 5.08 -------------------------------------------------- tested timout = [33] ms quailty %: 9.71 -------------------------------------------------- tested timout = [34] ms quailty %: 13.27 -------------------------------------------------- tested timout = [35] ms quailty %: 17.3 -------------------------------------------------- tested timout = [36] ms quailty %: 17.86 -------------------------------------------------- tested timout = [37] ms quailty %: 20.2 -------------------------------------------------- tested timout = [38] ms quailty %: 20.35 -------------------------------------------------- tested timout = [39] ms quailty %: 19.96 -------------------------------------------------- tested timout = [40] ms quailty %: 19.54 -------------------------------------------------- tested timout = [41] ms quailty %: 17.82 -------------------------------------------------- tested timout = [42] ms quailty %: 15.07 -------------------------------------------------- tested timout = [43] ms quailty %: 14.47 -------------------------------------------------- tested timout = [44] ms quailty %: 9.59 -------------------------------------------------- tested timout = [45] ms quailty %: 6.49 -------------------------------------------------- tested timout = [46] ms quailty %: 1.97 -------------------------------------------------- tested timout = [47] ms quailty %: 5.21 -------------------------------------------------- tested timout = [48] ms quailty %: 5.96 -------------------------------------------------- tested timout = [49] ms quailty %: 9.54 -------------------------------------------------- tested timout = [50] ms quailty %: 11.39 -------------------------------------------------- tested timout = [51] ms quailty %: 11.38 -------------------------------------------------- tested timout = [52] ms quailty %: 13.93 -------------------------------------------------- tested timout = [53] ms quailty %: 14.53 -------------------------------------------------- tested timout = [54] ms quailty %: 14.53 -------------------------------------------------- tested timout = [55] ms quailty %: 14.34 -------------------------------------------------- tested timout = [56] ms quailty %: 13.71 -------------------------------------------------- tested timout = [57] ms quailty %: 11.85 -------------------------------------------------- tested timout = [58] ms quailty %: 9.96 -------------------------------------------------- tested timout = [59] ms quailty %: 8.92 -------------------------------------------------- tested timout = [60] ms quailty %: 6.12 -------------------------------------------------- tested timout = [61] ms quailty %: 3.71 -------------------------------------------------- tested timout = [62] ms quailty %: 0.9 -------------------------------------------------- tested timout = [63] ms quailty %: 2.12 -------------------------------------------------- tested timout = [64] ms quailty %: 4.0 -------------------------------------------------- tested timout = [65] ms quailty %: 7.77 -------------------------------------------------- tested timout = [66] ms quailty %: 9.06 -------------------------------------------------- tested timout = [67] ms quailty %: 9.7 -------------------------------------------------- tested timout = [68] ms quailty %: 10.86 -------------------------------------------------- tested timout = [69] ms quailty %: 11.17 -------------------------------------------------- tested timout = [70] ms quailty %: 11.16 -------------------------------------------------- tested timout = [71] ms quailty %: 10.87 -------------------------------------------------- tested timout = [72] ms quailty %: 10.75 -------------------------------------------------- tested timout = [73] ms quailty %: 10.51 -------------------------------------------------- tested timout = [74] ms quailty %: 8.68 -------------------------------------------------- tested timout = [75] ms quailty %: 7.2 -------------------------------------------------- tested timout = [76] ms quailty %: 4.66 -------------------------------------------------- tested timout = [77] ms quailty %: 2.69 -------------------------------------------------- tested timout = [78] ms quailty %: 0.19 -------------------------------------------------- tested timout = [79] ms quailty %: 2.21 -------------------------------------------------- tested timout = [80] ms quailty %: 4.42 -------------------------------------------------- tested timout = [81] ms quailty %: 5.67 -------------------------------------------------- tested timout = [82] ms quailty %: 8.28 -------------------------------------------------- tested timout = [83] ms quailty %: 8.75 -------------------------------------------------- tested timout = [84] ms quailty %: 8.97 -------------------------------------------------- tested timout = [85] ms quailty %: 9.25 -------------------------------------------------- tested timout = [86] ms quailty %: 9.18 -------------------------------------------------- tested timout = [87] ms quailty %: 8.65 -------------------------------------------------- tested timout = [88] ms quailty %: 7.98 -------------------------------------------------- tested timout = [89] ms quailty %: 6.5 -------------------------------------------------- tested timout = [90] ms quailty %: 5.86 -------------------------------------------------- tested timout = [91] ms quailty %: 4.65 -------------------------------------------------- tested timout = [92] ms quailty %: 2.98 -------------------------------------------------- tested timout = [93] ms quailty %: 1.18 -------------------------------------------------- tested timout = [94] ms quailty %: 1.71 -------------------------------------------------- tested timout = [95] ms quailty %: 2.97 -------------------------------------------------- tested timout = [96] ms quailty %: 5.25 -------------------------------------------------- tested timout = [97] ms quailty %: 6.52 -------------------------------------------------- tested timout = [98] ms quailty %: 6.81 -------------------------------------------------- tested timout = [99] ms quailty %: 7.43 -------------------------------------------------- tested timout = [100] ms quailty %: 7.73 -------------------------------------------------- tested timout = [101] ms quailty %: 7.72 -------------------------------------------------- tested timout = [102] ms quailty %: 7.68 -------------------------------------------------- tested timout = [103] ms quailty %: 7.25 -------------------------------------------------- tested timout = [104] ms quailty %: 6.41 -------------------------------------------------- tested timout = [105] ms quailty %: 5.65 -------------------------------------------------- tested timout = [106] ms quailty %: 4.75 -------------------------------------------------- tested timout = [107] ms quailty %: 3.49 -------------------------------------------------- tested timout = [108] ms quailty %: 2.03 -------------------------------------------------- tested timout = [109] ms quailty %: 0.36 -------------------------------------------------- tested timout = [110] ms quailty %: 1.49 -------------------------------------------------- tested timout = [111] ms quailty %: 2.67 -------------------------------------------------- tested timout = [112] ms quailty %: 4.22 -------------------------------------------------- tested timout = [113] ms quailty %: 5.05 -------------------------------------------------- tested timout = [114] ms quailty %: 5.41 -------------------------------------------------- tested timout = [115] ms quailty %: 6.26 -------------------------------------------------- tested timout = [116] ms quailty %: 6.66 -------------------------------------------------- tested timout = [117] ms quailty %: 6.76 -------------------------------------------------- tested timout = [118] ms quailty %: 6.53 -------------------------------------------------- tested timout = [119] ms quailty %: 6.39 -------------------------------------------------- tested timout = [120] ms quailty %: 5.48 -------------------------------------------------- tested timout = [121] ms quailty %: 4.78 -------------------------------------------------- tested timout = [122] ms quailty %: 3.76 -------------------------------------------------- tested timout = [123] ms quailty %: 3.0 -------------------------------------------------- tested timout = [124] ms quailty %: 1.82 -------------------------------------------------- tested timout = [125] ms quailty %: 0.14 -------------------------------------------------- tested timout = [126] ms quailty %: 2.2 -------------------------------------------------- tested timout = [127] ms quailty %: 3.24 -------------------------------------------------- tested timout = [128] ms quailty %: 5.28 -------------------------------------------------- tested timout = [129] ms quailty %: 5.7 -------------------------------------------------- tested timout = [130] ms quailty %: 5.52 -------------------------------------------------- tested timout = [131] ms quailty %: 5.86 -------------------------------------------------- tested timout = [132] ms quailty %: 6.02 -------------------------------------------------- tested timout = [133] ms quailty %: 5.91 -------------------------------------------------- tested timout = [134] ms quailty %: 5.56 -------------------------------------------------- tested timout = [135] ms quailty %: 5.29 -------------------------------------------------- tested timout = [136] ms quailty %: 4.69 -------------------------------------------------- tested timout = [137] ms quailty %: 3.42 -------------------------------------------------- tested timout = [138] ms quailty %: 2.89 -------------------------------------------------- tested timout = [139] ms quailty %: 1.66 -------------------------------------------------- tested timout = [140] ms quailty %: 0.43 -------------------------------------------------- tested timout = [141] ms quailty %: 1.23 -------------------------------------------------- tested timout = [142] ms quailty %: 2.51 -------------------------------------------------- tested timout = [143] ms quailty %: 2.62
|
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор.
|