teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤記訂正

2017/06/25 00:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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

2017/06/25 00:26

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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
- 9435.000000 micro second
27
+ 9.435000 micro second
28
28
  $ ./a.out 10
29
- 9090.000000 micro second
29
+ 9.090000 micro second
30
30
  $ ./a.out 20
31
- 9980.000000 micro second
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
+ 時間精度は言語やライブラリーの仕様だけでなく、プラットフォームに依存するようですね。