回答編集履歴
2
誤記訂正
test
CHANGED
@@ -122,7 +122,7 @@
|
|
122
122
|
|
123
123
|
```
|
124
124
|
|
125
|
-
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒
|
125
|
+
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒程度での精度しかサポートされていないようです。
|
126
126
|
|
127
127
|
|
128
128
|
|
1
javaの例を追記
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
例えばCの標準ライブラリー(というよりUnix系OSの機能といった方がよいのかも知れませんが・・・)にはマイクロ秒単位でsleepする関数usleepがあります。
|
1
|
+
例えばCの標準ライブラリー(というよりUnix系OSの機能といった方がよいのかも知れませんが・・・)にはマイクロ秒(10の-6乗秒)単位でsleepする関数usleepがあります。(最初のコードは結果が分かりにくかったので1回当たりの経過時間を表示するように直しました)
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -32,7 +32,7 @@
|
|
32
32
|
|
33
33
|
clock_t t1 = clock();
|
34
34
|
|
35
|
-
printf("%f micro second\n", (double)(t1-t0) * 1E6 /CLOCKS_PER_SEC);
|
35
|
+
printf("%f micro second\n", (double)(t1-t0) * 1E6 / CLOCKS_PER_SEC / N);
|
36
36
|
|
37
37
|
return 0;
|
38
38
|
|
@@ -50,18 +50,82 @@
|
|
50
50
|
|
51
51
|
$ ./a.out 1
|
52
52
|
|
53
|
-
9435
|
53
|
+
9.435000 micro second
|
54
54
|
|
55
55
|
$ ./a.out 10
|
56
56
|
|
57
|
-
9090
|
57
|
+
9.090000 micro second
|
58
58
|
|
59
59
|
$ ./a.out 20
|
60
60
|
|
61
|
-
9980
|
61
|
+
9.980000 micro second
|
62
62
|
|
63
63
|
```
|
64
64
|
|
65
65
|
|
66
66
|
|
67
67
|
チャチなパソコンでやっているせいか、OSの制約のせいかわかりませんが、10マイクロ秒以下のインターバルの精度で処理することは実際には難しそうです。
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
---
|
72
|
+
|
73
|
+
蛇足:ライブラリーの仕様としてはJavaの標準ライブラリーにはナノ秒(10の-9乗秒)まで指定してsleepするメソッドが存在します。それを使って上記と同じUbuntu上のopenjdk 1.8.0_131でやってみますと・・・
|
74
|
+
|
75
|
+
```java
|
76
|
+
|
77
|
+
public class IntervalTest {
|
78
|
+
|
79
|
+
static final int N = 1000;
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
public static void main(String[] args) throws InterruptedException {
|
84
|
+
|
85
|
+
long interval = Long.parseLong(args[0]);
|
86
|
+
|
87
|
+
long ms = interval / 1_000_000;
|
88
|
+
|
89
|
+
int ns = (int)(interval % 1_000_000);
|
90
|
+
|
91
|
+
long t0 = System.nanoTime();
|
92
|
+
|
93
|
+
for (int i = 0; i < N; i++) {
|
94
|
+
|
95
|
+
Thread.sleep(ms, ns);
|
96
|
+
|
97
|
+
}
|
98
|
+
|
99
|
+
long t1 = System.nanoTime();
|
100
|
+
|
101
|
+
System.out.format("%,f nano secound%n", (double)(t1 - t0) / N);
|
102
|
+
|
103
|
+
}
|
104
|
+
|
105
|
+
}
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
結果==>
|
110
|
+
|
111
|
+
$ java IntervalTest 1
|
112
|
+
|
113
|
+
1,303,507.728000 nano secound
|
114
|
+
|
115
|
+
$ java IntervalTest 1000000
|
116
|
+
|
117
|
+
1,291,129.922000 nano secound
|
118
|
+
|
119
|
+
$ java IntervalTest 2000000
|
120
|
+
|
121
|
+
2,313,371.724000 nano secound
|
122
|
+
|
123
|
+
```
|
124
|
+
|
125
|
+
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒単位での精度しかサポートされていないようです。
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
時間精度は言語やライブラリーの仕様だけでなく、プラットフォームに依存するようですね。
|
130
|
+
|
131
|
+
|