回答編集履歴

2

誤記訂正

2017/06/25 00:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

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の例を追記

2017/06/25 00:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18394

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.000000 micro second
53
+ 9.435000 micro second
54
54
 
55
55
  $ ./a.out 10
56
56
 
57
- 9090.000000 micro second
57
+ 9.090000 micro second
58
58
 
59
59
  $ ./a.out 20
60
60
 
61
- 9980.000000 micro second
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
+