回答編集履歴
2
誤記訂正
answer
CHANGED
@@ -60,6 +60,6 @@
|
|
60
60
|
$ java IntervalTest 2000000
|
61
61
|
2,313,371.724000 nano secound
|
62
62
|
```
|
63
|
-
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒
|
63
|
+
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒程度での精度しかサポートされていないようです。
|
64
64
|
|
65
65
|
時間精度は言語やライブラリーの仕様だけでなく、プラットフォームに依存するようですね。
|
1
javaの例を追記
answer
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
例えばCの標準ライブラリー(というよりUnix系OSの機能といった方がよいのかも知れませんが・・・)にはマイクロ秒単位でsleepする関数usleepがあります。
|
1
|
+
例えばCの標準ライブラリー(というよりUnix系OSの機能といった方がよいのかも知れませんが・・・)にはマイクロ秒(10の-6乗秒)単位でsleepする関数usleepがあります。(最初のコードは結果が分かりにくかったので1回当たりの経過時間を表示するように直しました)
|
2
2
|
|
3
3
|
```C
|
4
4
|
#include <stdio.h>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
usleep(interval);
|
16
16
|
}
|
17
17
|
clock_t t1 = clock();
|
18
|
-
printf("%f micro second\n", (double)(t1-t0) * 1E6 /CLOCKS_PER_SEC);
|
18
|
+
printf("%f micro second\n", (double)(t1-t0) * 1E6 / CLOCKS_PER_SEC / N);
|
19
19
|
return 0;
|
20
20
|
}
|
21
21
|
```
|
@@ -24,11 +24,42 @@
|
|
24
24
|
|
25
25
|
```
|
26
26
|
$ ./a.out 1
|
27
|
-
|
27
|
+
9.435000 micro second
|
28
28
|
$ ./a.out 10
|
29
|
-
|
29
|
+
9.090000 micro second
|
30
30
|
$ ./a.out 20
|
31
|
-
|
31
|
+
9.980000 micro second
|
32
32
|
```
|
33
33
|
|
34
|
-
チャチなパソコンでやっているせいか、OSの制約のせいかわかりませんが、10マイクロ秒以下のインターバルの精度で処理することは実際には難しそうです。
|
34
|
+
チャチなパソコンでやっているせいか、OSの制約のせいかわかりませんが、10マイクロ秒以下のインターバルの精度で処理することは実際には難しそうです。
|
35
|
+
|
36
|
+
---
|
37
|
+
蛇足:ライブラリーの仕様としてはJavaの標準ライブラリーにはナノ秒(10の-9乗秒)まで指定してsleepするメソッドが存在します。それを使って上記と同じUbuntu上のopenjdk 1.8.0_131でやってみますと・・・
|
38
|
+
```java
|
39
|
+
public class IntervalTest {
|
40
|
+
static final int N = 1000;
|
41
|
+
|
42
|
+
public static void main(String[] args) throws InterruptedException {
|
43
|
+
long interval = Long.parseLong(args[0]);
|
44
|
+
long ms = interval / 1_000_000;
|
45
|
+
int ns = (int)(interval % 1_000_000);
|
46
|
+
long t0 = System.nanoTime();
|
47
|
+
for (int i = 0; i < N; i++) {
|
48
|
+
Thread.sleep(ms, ns);
|
49
|
+
}
|
50
|
+
long t1 = System.nanoTime();
|
51
|
+
System.out.format("%,f nano secound%n", (double)(t1 - t0) / N);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
|
55
|
+
結果==>
|
56
|
+
$ java IntervalTest 1
|
57
|
+
1,303,507.728000 nano secound
|
58
|
+
$ java IntervalTest 1000000
|
59
|
+
1,291,129.922000 nano secound
|
60
|
+
$ java IntervalTest 2000000
|
61
|
+
2,313,371.724000 nano secound
|
62
|
+
```
|
63
|
+
どうやら自分が使っているバージョンのopenjdkのjvmは1ミリ秒単位での精度しかサポートされていないようです。
|
64
|
+
|
65
|
+
時間精度は言語やライブラリーの仕様だけでなく、プラットフォームに依存するようですね。
|