/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . analyzer Ċ Ċ import Ġorg . jetbrains . report . Benchmark Result Ċ import Ġorg . jetbrains . report . Mean Variance Ċ import Ġorg . jetbrains . report . Mean Variance Benchmark Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . sqrt Ċ Ċ val ĠMean Variance . description : ĠString ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= Ġ{ Ġnumber : ĠDouble Ġ-> Ġnumber . format ( 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"${ format ( mean )} ĠÂ ± Ġ${ format ( variance )}" ĊĠĠĠ Ġ} Ċ Ċ val ĠMean Variance Benchmark . description : ĠString ĊĠĠĠ Ġget () Ġ= Ġ"${ score . format ()} ĠÂ ± Ġ${ variance . format () }" Ċ Ċ // ĠCalculate Ġdifference Ġin Ġpercentage Ġcompare Ġto Ġanother . Ċ fun ĠMean Variance Benchmark . calc Percentage Diff ( other : ĠMean Variance Benchmark ): ĠMean Variance Ġ{ ĊĠĠĠ Ġassert ( other . score Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . variance Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . score Ġ- Ġother . variance Ġ!= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Mean Ġand Ġvariance Ġshould Ġbe Ġpositive Ġand Ġnot Ġequal !" Ġ}) ĊĠĠĠ Ġ// ĠAn alyze Ġintervals . ĠCalculate Ġdifference Ġbetween Ġborder Ġpoints . ĊĠĠĠ Ġval Ġ( big Value , Ġsmall Value ) Ġ= Ġif Ġ( score Ġ> Ġother . score ) ĠPair ( this , Ġother ) Ġelse ĠPair ( other , Ġthis ) ĊĠĠĠ Ġval Ġbig Value Interval Start Ġ= Ġbig Value . score Ġ- Ġbig Value . variance ĊĠĠĠ Ġval Ġbig Value Interval End Ġ= Ġbig Value . score Ġ+ Ġbig Value . variance ĊĠĠĠ Ġval Ġsmall Value Interval Start Ġ= Ġsmall Value . score Ġ- Ġsmall Value . variance ĊĠĠĠ Ġval Ġsmall Value Interval End Ġ= Ġsmall Value . score Ġ+ Ġsmall Value . variance ĊĠĠĠ Ġif Ġ( small Value Interval End Ġ> Ġbig Value Interval Start ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInterval Ġintersect . ĊĠĠĠĠĠĠĠ Ġreturn ĠMean Variance ( 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmean Ġ= Ġ(( small Value Interval End Ġ- Ġbig Value Interval Start ) Ġ/ Ġbig Value Interval Start ) Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( score Ġ> Ġother . score ) Ġ- 1 Ġelse Ġ 1 ) ĊĊĠĠĠ Ġval ĠmaxValue Change Ġ= Ġ(( big Value Interval End Ġ- Ġsmall Value Interval End ) Ġ/ Ġbig Value Interval End ) ĊĠĠĠ Ġval Ġmin Value Change Ġ= Ġ(( big Value Interval Start Ġ- Ġsmall Value Interval Start ) Ġ/ Ġbig Value Interval Start ) ĊĠĠĠ Ġval Ġvariance Ġ= Ġabs ( abs ( mean ) Ġ- Ġmax ( min Value Change , ĠmaxValue Change )) ĊĠĠĠ Ġreturn ĠMean Variance ( mean Ġ* Ġ 1 0 0 , Ġvariance Ġ* Ġ 1 0 0 ) Ċ } Ċ Ċ // ĠCalculate Ġratio Ġvalue Ġcompare Ġto Ġanother . Ċ fun ĠMean Variance Benchmark . calc Ratio ( other : ĠMean Variance Benchmark ): ĠMean Variance Ġ{ ĊĠĠĠ Ġassert ( other . score Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . variance Ġ>= Ġ 0 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġother . score Ġ- Ġother . variance Ġ!= Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ" Mean Ġand Ġvariance Ġshould Ġbe Ġpositive Ġand Ġnot Ġequal !" Ġ}) ĊĠĠĠ Ġval Ġmean Ġ= Ġscore Ġ/ Ġother . score ĊĠĠĠ Ġval Ġmin Ratio Ġ= Ġ( score Ġ- Ġvariance ) Ġ/ Ġ( other . score Ġ+ Ġother . variance ) ĊĠĠĠ Ġval Ġmax Ratio Ġ= Ġ( score Ġ+ Ġvariance ) Ġ/ Ġ( other . score Ġ- Ġother . variance ) ĊĠĠĠ Ġval Ġratio Conf Int Ġ= Ġmin ( abs ( min Ratio Ġ- Ġmean ), Ġabs ( max Ratio Ġ- Ġmean )) ĊĠĠĠ Ġreturn ĠMean Variance ( mean , Ġratio Conf Int ) Ċ } Ċ Ċ fun Ġge ometric Mean ( values : ĠCollection < Double >, Ġtotal Number : ĠInt Ġ= Ġvalues . size ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( values . as Sequence (). filter Ġ{ Ġit Ġ!= Ġ 0 . 0 Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ{ Ġit . pow ( 1 . 0 Ġ/ Ġtotal Number ) Ġ}. reduce Ġ{ Ġa , Ġb Ġ-> Ġa Ġ* Ġb Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ fun Ġcompute Mean Variance ( samples : ĠList < Double >): ĠMean Variance Ġ{ ĊĠĠĠ Ġval Ġremoved Broad Samples Ġ= Ġ 0 . 2 ĊĠĠĠ Ġval Ġz Star Ġ= Ġ 1 . 6 7 ĠĠĠ Ġ// ĠCritical Ġpoint Ġfor Ġ 9 0 % Ġconfidence Ġof Ġnormal Ġdistribution . ĊĠĠĠ Ġ// ĠSkip Ġseveral Ġminimal Ġand Ġmaximum Ġvalues . ĊĠĠĠ Ġval Ġfiltered Samples Ġ= Ġif Ġ( samples . size Ġ>= Ġ 1 / removed Broad Samples ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġsamples . sorted (). sub List (( samples . size Ġ* Ġremoved Broad Samples ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsamples . size Ġ- Ġ( samples . size Ġ* Ġremoved Broad Samples ). toInt ()) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġsamples ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmean Ġ= Ġfiltered Samples . sum () Ġ/ Ġfiltered Samples . size ĊĠĠĠ Ġval Ġvariance Ġ= Ġsamples . indices . sum By Double Ġ{ ĊĠĠĠĠĠĠĠ Ġ( samples [ it ] Ġ- Ġmean ) Ġ* Ġ( samples [ it ] Ġ- Ġmean ) ĊĠĠĠ Ġ} Ġ/ Ġsamples . size ĊĠĠĠ Ġval Ġconfidence Interval Ġ= Ġsqrt ( variance Ġ/ Ġsamples . size ) Ġ* Ġz Star ĊĠĠĠ Ġreturn ĠMean Variance ( mean , Ġconfidence Interval ) Ċ } Ċ Ċ // ĠCalculate Ġaverage Ġresults Ġfor Ġbenchmarks Ġ( each Ġbenchmark Ġcan Ġbe Ġrun Ġseveral Ġtimes ). Ċ fun Ġcollect Mean Results ( benchmarks : ĠMap < String , ĠList < Benchmark Result >> ): ĠB ench marks Table Ġ{ ĊĠĠĠ Ġreturn Ġbenchmarks . map Ġ{ Ġ( name , Ġresults Set ) Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġrepeated Sequence Ġ= ĠInt Array ( results Set . size ) ĊĠĠĠĠĠĠĠ Ġvar Ġmetric Ġ= ĠBenchmark Result . Metric . EXEC UTION _ TIME ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Status Ġ= ĠBenchmark Result . Status . PAS SED ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent W arm up Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠResults Ġcan Ġbe Ġalready Ġprocessed . ĊĠĠĠĠĠĠĠ Ġif Ġ( results Set [ 0 ] Ġis ĠMean Variance Benchmark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( results Set . size Ġ== Ġ 1 ) Ġ{ Ġ" Se veral ĠMean Variance Benchmark Ġinstances ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto Ġresults Set [ 0 ] Ġas ĠMean Variance Benchmark ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCollect Ġcommon Ġbenchmark Ġvalues Ġand Ġcheck Ġthem . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Set . forEach Indexed Ġ{ Ġindex , Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġwas Ġat Ġleast Ġone Ġfailure , Ġsummary Ġis Ġmarked Ġas Ġfailure . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . status Ġ== ĠBenchmark Result . Status . FAILED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Status Ġ= Ġresult . status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrepeated Sequence [ index ] Ġ= Ġresult . repeat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current W arm up Ġ!= Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . warm up Ġ!= Ġcurrent W arm up ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Check Ġdata Ġconsistency . ĠW arm up Ġvalue Ġfor Ġbenchmark Ġ'${ result . name }' Ġdiffers .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent W arm up Ġ= Ġresult . warm up ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetric Ġ= Ġresult . metric ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeated Sequence . sort () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthere Ġare Ġmissed Ġloop Ġduring Ġrunning Ġbenchmarks . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepeated Sequence . forEach Indexed Ġ{ Ġindex , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( element Ġ- Ġrepeated Sequence [ index Ġ- Ġ 1 ]) Ġ!= Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Check Ġdata Ġconsistency . ĠFor Ġbenchmark Ġ'$ name ' Ġthere Ġis Ġno Ġrun " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġbetween Ġ${ repeated Sequence [ index Ġ- Ġ 1 ]} Ġand Ġ$ element .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġmean Ġand Ġvariance Ġbenchmarks Ġresult . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscore Mean Variance Ġ= Ġcompute Mean Variance ( results Set . map Ġ{ Ġit . score Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime In Us Mean Variance Ġ= Ġcompute Mean Variance ( results Set . map Ġ{ Ġit . runtime In Us Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmean Benchmark Ġ= ĠMean Variance Benchmark ( name , Ġcurrent Status , Ġscore Mean Variance . mean , Ġmetric , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġruntime In Us Mean Variance . mean , Ġrepeated Sequence [ results Set . size Ġ- Ġ 1 ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent W arm up , Ġscore Mean Variance . variance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto Ġmean Benchmark ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}. toMap () Ċ } Ċ Ċ fun Ġcollect Bench marks Dur ations ( benchmarks : ĠMap < String , ĠList < Benchmark Result >> ): ĠMap < String , ĠDouble > Ġ= ĊĠĠĠĠĠĠĠ Ġbenchmarks . map Ġ{ Ġ( name , Ġresults Set ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto Ġresults Set . sum By Double Ġ{ Ġit . runtime In Us Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toMap ()