System.nanoTime() による高精度タイミングサポート。
その MM/Memo で書いたコメントに言及されたというのは、
ナノ秒の取得とナノ秒待機その弐
という keisuken さんのエントリでした。
・ 719さんのメモ RSS - [Programming] [プログラミング] [Java] [ナノ秒] [nanoTime] 『[Java] ナノ秒の取得とナノ秒待機』 そもそもWindowsにしろUnix/Linuxにしろ、プラットフォームの時刻精度がそれ程高 くないのに、そんなに高精度な時刻の制御ができるものなのか?? それは違いますぜダンナ.いやごめんなさい.
と、思いっきり突っ込まれてしまいました。
`719さんのメモ' というのが、実は私の MM/Memo で、まだ日の浅い、タイトルさせ変えていなかった (昨日変えたんですが) メモです。
この MM/Memo なんですが、まだ余り使い方がこなれてなくて、かなり脊髄反射なメモの取り方になっているのは否めないのです。つまり、「後で読むぞ」という意思表示で、メモを取った時点では、内容を殆ど読んでないんですね。申し訳ないです。
が、そんなメモを取った翌日に、そのコメントに言及されることがあろうとは夢にも思っていなかったのでした。
で言及された内容ですが、なるほど、そもそも元の記事には、「時刻として使えるものではなくて,単位時間を計る時に使用するものです」と書いてあるじゃないですか。それに「比較的精度の高い経過時間が欲しいわけです」とも。(強調は引用者による)
J2EE 5.0 のドキュメントにも、
高精度タイミングのサポート メソッド System.nanoTime() が追加され、相対時間測定でナノ秒精度の時間ソース へアクセスできるようになりました。System.nanoTime() が返す時間値の実際の精 度は、プラットフォームによって異なります。
と、相対時間測定とあるし、
public static long nanoTime() 利用可能でもっとも正確なシステムタイマーの現在の値をナノ秒単位で返します。 このメソッドは、経過時間を測定するためだけに使用できます。システムのほかの 概念や壁時計の時刻に関連していません。返される値は、ある決まった任意の時刻 (将来の時間、負の値もあり得る)からのナノ秒単位の時間を表します。このメソ ッドは、ナノ秒単位の精度を提供しますが、必ずしもナノ秒の正確度ではありませ ん。どの程度値が変化するかは保証されません。約 292 年 (2^63 ナノ秒 ) を超え る連続した呼び出しの差異では、数値のオーバーフローにより経過時間が正しく計 算されません。
と、経過時間の測定のためだけに使用できると制限付きです。
特に、
ナノ秒単位の精度を提供しますが、必ずしもナノ秒の正確度ではありません。
とまで書いてありました。これはイベント発生の順序性はナノ秒単位の精度で保証されるが、時刻としての正確さは保証されないということかと思います。(違うかな?)
で、keisuken さんのエントリには、
一番大きいのは時間の正確さもさることながら,有効数字です.
とあり、ナノ秒単位の有効桁を持つ値を使って経過時間を刻むことで、高精度なタイミングを制御できる様になりますということなんですね。納得です。
keisuken さん、解説、ありがとうございました。
で、ふと思いました。
MM/Memo で生半可なコメントをしたせいで、有意義な技術情報を教えて貰え、新たな糧を得ることができた (いや、正しく理解できているかどうかは自信ありませんけど) んだなあと。
それをとても嬉しく、また有難いことだと感謝すると共に、ネットワーク上に散在するサービスの有機的とも言えるかの様な繋がりを体感し、感じ入った次第です。(多分に自分勝手な話かもしれませんが)