package Ġcom . so y wiz . k lock . benchmark Ċ Ċ import Ġcom . so y wiz . k lock .* Ċ import Ġkotlin . jvm . Jvm Name Ċ import Ġkotlin . math . pow Ċ Ċ data Ġclass ĠBenchmark Result ( ĊĠĠĠ Ġval Ġtime Per Call Nan oseconds : ĠLong , ĊĠĠĠ Ġval Ġmax De viation Nan oseconds : ĠLong , ĊĠĠĠ Ġval Ġpartial Results : ĠList < Partial Result >, ĊĠĠĠ Ġval Ġdummy Result : ĠDouble Ċ ) Ġ{ ĊĠĠĠ Ġdata Ġclass ĠPartial Result ( val Ġnan os : ĠLong , Ġval Ġit ers : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnan os Per Iter Ġget () Ġ= Ġnan os . toDouble () Ġ/ Ġit ers . toDouble () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Partial Result ( nan os Per Iter =$ nan os Per Iter , Ġnan os =$ nan os , Ġit ers =$ iters )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtime Per Call Micro seconds : ĠDouble Ġget () Ġ= Ġtime Per Call Nan oseconds Ġ/ Ġ 1 0 0 0 . 0 ĊĠĠĠ Ġval Ġmax De viation Micro seconds : ĠDouble Ġget () Ġ= Ġmax De viation Nan oseconds Ġ/ Ġ 1 0 0 0 . 0 ĊĊĠĠĠ Ġval Ġtime Per Call Ġget () Ġ= Ġtime Per Call Nan oseconds . nan oseconds ĊĠĠĠ Ġval Ġmax De viation Ġget () Ġ= Ġmax De viation Nan oseconds . nan oseconds ĊĊĠĠĠ Ġprivate Ġfun Ġrounded ( value : ĠDouble ) Ġ= Ġ( value Ġ* Ġ 1 0 0 0 0 ). to Long () Ġ/ Ġ 1 0 0 0 0 . 0 ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ"${ rounded ( time Per Call Micro seconds )} ĠÂ µ s ĠÂ ± Ġ${ rounded ( max De viation Micro seconds )} ĠÂ µ s " Ċ } Ċ Ċ @ Jvm Name (" Benchmark Generic ") Ċ inline Ġfun Ġ< re ified ĠT > Ġbenchmark ( no inline Ġblock : Ġ() Ġ-> ĠT ): ĠBenchmark Result Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( T :: class ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUnit :: class Ġ-> Ġbenchmark Ġ{ Ġ 1 . 0 . also Ġ{ Ġblock () Ġ} Ġ} ĊĠĠĠĠĠĠĠ ĠInt :: class Ġ-> Ġbenchmark Ġ{ Ġ( block () Ġas ĠInt ). toDouble () Ġ} ĊĠĠĠĠĠĠĠ ĠLong :: class Ġ-> Ġbenchmark Ġ{ Ġ( block () Ġas ĠLong ). toDouble () Ġ} ĊĠĠĠĠĠĠĠ ĠDouble :: class Ġ-> Ġbenchmark Ġ{ Ġblock () Ġas ĠDouble Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbenchmark Ġ{ Ġ 1 . 0 . also Ġ{ Ġblock () Ġ} Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmeasure Scale ( block : Ġ() Ġ-> ĠDouble ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġsum Ġ= Ġ 0 . 0 ĊĠĠĠ Ġsum Ġ+= Ġblock () ĊĠĠĠ Ġfor Ġ( scale Ġin Ġ 0 .. 9 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġit ers Ġ= Ġ 1 0 . 0 . pow ( scale ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġmeasure Time Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġit ers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġblock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsum Ġ*= Ġ 0 . 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( time Ġ>= Ġ 1 0 . milliseconds ) Ġreturn Ġit ers Ġ+ Ġ( sum Ġ* Ġ 0 . 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Ġ* Ġ 0 . 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Ġ* Ġ 0 . 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Ġ* Ġ 0 . 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ). toInt () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠInt . MAX _ VALUE Ċ } Ċ Ċ fun Ġbenchmark ( block : Ġ() Ġ-> ĠDouble ): ĠBenchmark Result Ġ{ ĊĠĠĠ Ġval Ġstop watch Ġ= ĠStop watch () ĊĠĠĠ Ġvar Ġdummy Sum Ġ= Ġ 0 . 0 ĊĠĠĠ Ġdummy Sum Ġ+= Ġmeasure Scale ( block ) ĊĠĠĠ Ġval Ġit ers To Get At Least 1 0 Ms Ġ= Ġmeasure Scale ( block ) ĊĠĠĠ Ġ// println (" SCALE : Ġ$ iters To Get At Least 1 0 Ms ") ĊĊĠĠĠ Ġval Ġall Results Ġ= ĠArrayList < Benchmark Result . Partial Result >() ĊĊĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstop watch . start () ĊĠĠĠĠĠĠĠ Ġfor Ġ( m Ġin Ġ 0 Ġuntil Ġit ers To Get At Least 1 0 Ms ) Ġdummy Sum Ġ+= Ġblock () ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġstop watch . elapsed Nan oseconds ĊĠĠĠĠĠĠĠ Ġall Results Ġ+= ĠBenchmark Result . Partial Result ( time . to Long (), Ġ( iters To Get At Least 1 0 Ms ). to Long ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġresults Ġ= Ġall Results . drop ( all Results . size Ġ/ Ġ 2 ) ĊĊĠĠĠ Ġval Ġf total Nan oseconds Ġ= Ġresults . map Ġ{ Ġit . nan os Ġ}. sum (). toDouble () ĊĠĠĠ Ġval Ġf total Iter s Ġ= Ġresults . map Ġ{ Ġit . iters Ġ}. sum (). toDouble () ĊĠĠĠ Ġval Ġf min Nan oseconds Ġ= Ġresults . map Ġ{ Ġit . nan os Per Iter Ġ}. min OrNull () !! ĊĠĠĠ Ġval Ġf max Nan oseconds Ġ= Ġresults . map Ġ{ Ġit . nan os Per Iter Ġ}. max OrNull () !! ĊĠĠĠ Ġ// for Ġ( res Ġin Ġresults ) Ġprintln (" res : Ġ$ res ") ĊĊĠĠĠ Ġreturn ĠBenchmark Result ( ĊĠĠĠĠĠĠĠ Ġ( ft otal Nan oseconds Ġ/ Ġf total Iter s ). to Long (), ĊĠĠĠĠĠĠĠ Ġ( f max Nan oseconds Ġ- Ġf min Nan oseconds ). to Long (), ĊĠĠĠĠĠĠĠ Ġresults , ĊĠĠĠĠĠĠĠ Ġdummy Sum ĊĠĠĠ Ġ) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT > Ġprint Benchmark ( name : ĠString , Ġfull : ĠBoolean Ġ= Ġfalse , Ġno inline Ġblock : Ġ() Ġ-> ĠT ) Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġbenchmark ( block ) ĊĠĠĠ Ġprintln (" Benchmark Ġ'$ name ' Ġ: Ġ$ result ") ĊĠĠĠ Ġif Ġ( full ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( r Ġin Ġresult . partial Results ) Ġprintln (" Ġ- Ġ$ r ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ@ TODO : ĠShow Ġrat ios Ċ fun Ġprint Bench marks ( var arg Ġbenchmarks : ĠPair < String , Ġ() Ġ-> ĠDouble >, Ġfull : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġfor Ġ(( name , Ġblock ) Ġin Ġbenchmarks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprint Benchmark ( name , Ġfull , Ġblock ) ĊĠĠĠ Ġ} Ċ } Ċ