package Ġorg . map db . benchmark Ċ Ċ import Ġjava . io .* Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠBenchmark Ġutilities Ċ Ġ*/ Ċ object ĠB ench { ĊĊĠĠĠ Ġval Ġprop File Ġ= ĠFile (" target / benchmark . properties ") ĊĊĠĠĠ Ġfun Ġbench ( bench Name : String = caller Name (), Ġbody : ()-> Long ){ ĊĠĠĠĠĠĠĠ Ġval Ġmany Ġ= Ġtest Scale ()> 0 ; ĊĠĠĠĠĠĠĠ Ġval Ġmetric Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! many ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// run Ġmany Ġtimes Ġand Ġdo Ġaverage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġt = 0 L ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt Ġ+= Ġbody () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt / 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġform ated Metrics Ġ= ĠString . format ("% 1 2 s ", ĠString . format ("% , d ", Ġmetric )) ĊĠĠĠĠĠĠĠ Ġprintln (" BENCH : Ġ$ form ated Metrics Ġ- Ġ$ bench Name Ġ Ġ") ĊĊĠĠĠĠĠĠĠ Ġ// load , Ġupdate Ġand Ġsave Ġproperty Ġfile Ġwith Ġresults ĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= Ġobject Ġ: ĠProperties (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// save Ġkeys Ġin Ġsorted Ġorder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġkeys (): ĠEnumeration < Any >? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCollections . enumeration ( Tree Set ( keys )); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif ( prop File . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprops . load ( prop File . inputStream (). buffered ()) ĊĠĠĠĠĠĠĠ Ġprops . put ( bench Name , Ġmetric . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġprop File . output Stream () ĊĠĠĠĠĠĠĠ Ġval Ġout 2 Ġ= Ġout . buffered () ĊĠĠĠĠĠĠĠ Ġprops . store ( out 2 ," map db Ġbenchmark ") ĊĠĠĠĠĠĠĠ Ġout 2 . flush () ĊĠĠĠĠĠĠĠ Ġout . close () ĊĊĊĠĠĠĠĠĠĠ Ġ// remove Ġall Ġtemp Ġdirs ĊĠĠĠĠĠĠĠ Ġtemp Dirs . forEach Ġ{ Ġtemp Delete Recur ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġtemp Dirs . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop watch ( body : ()-> Unit ): Long { ĊĠĠĠĠĠĠĠ Ġval Ġstart Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġreturn ĠSystem . currentTimeMillis () Ġ- Ġstart ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġreturns Ġclass Ġname Ġand Ġmethod Ġname Ġof Ġcaller Ġfrom Ġprevious Ġstack Ġtrace Ġframe Ġ*/ ĊĠĠĠ Ġinline Ġfun Ġcaller Name (): String { ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠThread . currentThread (). stack Trace ĊĠĠĠĠĠĠĠ Ġval Ġt 0 Ġ= Ġt [ 2 ] ĊĠĠĠĠĠĠĠ Ġreturn Ġt 0 . className +". "+ t 0 . methodName ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġtest Scale (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprop Ġ= ĠSystem . getProperty (" test Long ") ? :" 0 " ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInteger . valueOf ( prop ); ĊĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : Number FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtemp Dir Ġ= ĠSystem . getProperty (" java . io . tmpdir "); ĊĊĠĠĠ Ġprivate Ġval Ġtemp Dirs Ġ= ĠHashSet < File >() ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠCreate Ġtemporary Ġdirectory Ġin Ġtemp Ġfolder . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static Ġfun Ġtemp Dir (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstack Trace Ġ= ĠThread . currentThread (). stack Trace ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelem Ġ= Ġstack Trace [ 2 ]; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= Ġ" map db Test _"+ elem . className +" # "+ elem . methodName + ":" + elem . line Number +" _" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile ( true ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( temp Dir +"/ "+ prefix + System . currentTimeMillis ()+" _"+ Math . random ()); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( dir . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Dirs += dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOError ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġtemp File (): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile ( temp Dir (), Ġ" bench File ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġtemp Delete ( file : ĠFile ){ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġfile . getName () ĊĠĠĠĠĠĠĠ Ġfor Ġ( f 2 Ġin Ġfile . getParent File (). list Files () !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( f 2 . name . startsWith ( name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Delete Recur ( f 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtemp Delete Recur ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static Ġfun Ġtemp Delete Recur ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( file . isDirectory ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( child Ġin Ġfile . list Files ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Delete Recur ( child ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠ Ġ} Ċ Ċ } Ċ