Kotlin Stdlib Duration and time measurement API
一言で表すと
時間計測いろいろ辛いからkotlinの時間計測は使いやすくした
概要
Durationクラスが文字通り時間の経過時間を表すようにした
measureTime, measureTimedValueでコードブロックの実行時間を計測できる
計測対象(元?)を定義するTimeSourceinterfaceを用意した
概要2
kotlin.stdlibで既に提供されていたmeasureTimeMillisとmeasureNanoTimeだが実装の問題でみんなmeasureTimeMillsしか使ってなかったので見直した(正確性やmillisecondsが欲しいという理由、timeはclock, nanoTimeはmonotonicで実装されている)
コードブロックと計測結果の両方を取得するinterfaceが提供されてなかった
整理して使いやすい(開発者が良く使うユースケースに沿った)API仕様にした
登場人物
Duration : 経過時間の実態
Longのラッパークラス
Comparableが実装されてるのでoperator functionで比較や足し引きが行なえる
constructorはprivateになっているので生成するにはNumber.toDuration()を行なう
1.daysみたいな拡張関数も生えてる
DurationUnit : 経過時間の単位
TimeMark : 時間計測しているときのある時点での経過時間(内部でDurationを返却するメソッドがある)
TimeSource : 計測対象(元?)を定義する
TimeMarkを生成する
使い方
code:kotlin
val timeout: Duration = 5.minutes
// timeSource.makrNow()でTimeMark == duration(経過時間)が取得できる
val expirationMark = timeSource.markNow() + timeout
// later
if (expirationMark.hasPassedNow()) {
// cached data are expired now
}
似ているAPI
java.time.Duration
.NET TimeSpan
Klock TimeSpan
Components関数
Durationをprintや変換する際に便利なdecompile関数
ex. 決められたフォーマットで何度も表示する
👉今までならそれ用の関数を作っていたがシュッとかけるよう
code:kotlin
val duration = 15.days
// transform
println(duration.toComponents { hours, minutes, _, _ -> "${hours}h:${minutes}m" })
ex. 別の時間系クラスに変換する
👉今までだったらnanosecを取り出してそれを変換して・・・とやっていたが
code:kotlin
val duration = 10.days
val yearMonth = duration.toComponents { days
// ここでjava.time系のクラスに変換するなど
}
Monotonic TimeSourceの各Platform実装
Kotlin/JVM: System.nanoTime()
Kotlin/JS (Node.js): process.hrtime()
Kotlin/JS (Browser): window.performance.now() or Date.now()
Kotlin/Native: std::chrono::high_resolution_clock, falling back to std::chrono::steady_clock in case if the high resolution clock is not steady.
androidはSystem.nanoTime()で計測してしまうと端末のsleepなどが影響してしまうのでSystemClock.elapsedRealtimeNanosかandroid ktxで提供されている計測手法を用いたほうがよい
気になるポイント
kmmで使うにはexpect/actualが必要になってしまう・・・
メモ
コメント