// ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC . ĠAll Ġrights Ġreserved . Ċ // ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠBSD - style Ġlicense Ġthat Ġcan Ġbe Ċ // Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ċ package Ġcom . dam owm ow . gc Ċ Ċ import Ġandroidx . annotation . NonNull Ċ import Ġio . flutter . embedding . android . Flutter Activity Ċ import Ġio . flutter . embedding . engine . Flutter Engine Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . reflect .* Ċ import Ġandroid . view . WindowManager Ċ Ċ const Ġval Ġmax Duration : ĠLong Ġ= Ġ 3 0 L Ġ* Ġ 6 0 L Ġ* Ġ 1 0 0 0 0 0 0 0 0 0 L Ġ// Ġ 3 0 Ġminutes Ġin Ġnan oseconds Ċ // const Ġval Ġmax Duration : ĠLong Ġ= Ġ 3 0 L Ġ* Ġ 1 0 0 0 0 0 0 0 0 0 L Ġ// Ġ 3 0 Ġseconds Ġin Ġnan oseconds Ċ Ċ class ĠMainActivity : ĠFlutter Activity () Ġ{ ĊĠ Ġoverride Ġfun Ġconfigure Flutter Engine (@ NonNull Ġflutter Engine : ĠFlutter Engine ) Ġ{ ĊĠĠĠ Ġsuper . configure Flutter Engine ( flutter Engine ) ĊĠĠĠ Ġregister Benchmark ( flutter Engine , Ġ" kotlin . n og c ", ĠNo G CK otlin Benchmark ()) ĊĠĠĠ Ġregister Benchmark ( flutter Engine , Ġ" kotlin . immutable ", ĠImmutable Kotlin Benchmark ()) ĊĠĠĠ Ġwindow . add Flags ( WindowManager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ) ĊĠĠĠ Ġwindow . set S ust ained Performance Mode ( true ); ĊĠĠĠ Ġval Ġbackground Thread Ġ= Ġobject : ĠThread (" background ") Ġ{ ĊĠĠĠĠĠ Ġ// Ġ" set S ust ained Performance Mode " Ġis Ġapparently Ġnot Ġenough Ġto Ġguarantee Ġthat Ġwe Ġare ĊĠĠĠĠĠ Ġ// Ġin Ġs ust ained Ġperformance Ġmode ; Ġwe Ġalso Ġneed Ġa Ġsecond Ġthread Ġto Ġbe Ġrunning Ġso Ġthat ĊĠĠĠĠĠ Ġ// Ġwe Ġcount Ġas Ġmult ith readed Ġor Ġsome Ġsuch . Ġ( This Ġis Ġbased Ġon Ġcomments Ġin Ġthe ĠJet Pack ĊĠĠĠĠĠ Ġ// Ġbenchmark ing Ġlibrary ; ĠI Ġcouldn 't Ġfind Ġany Ġdocumentation .) ĊĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġandroid . os . Process . set Thread Priority ( android . os . Process . THREAD _ PRIORITY _ LOW EST ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġnop ... Ġ( ho pe fully Ġthe Ġcompiler Ġdoesn 't Ġoptimize Ġthis Ġtoo Ġmuch ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġbackground Thread . start () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġregister Benchmark ( flutter Engine : ĠFlutter Engine , Ġname : ĠString , Ġbenchmark : ĠBenchmark ) Ġ{ ĊĠĠĠ ĠMethod Channel ( flutter Engine . dart Executor . binary Messenger , Ġ" gc . dam owm ow . com /$ name "). set MethodCall Handler Ġ{ ĊĠĠĠĠĠ Ġcall , Ġresult Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( call . method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" setup " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbenchmark !!. setup () ĊĠĠĠĠĠĠĠĠĠ Ġresult . success ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" loop " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġcount : ĠLong ĊĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġbenchmark !!. loop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ const Ġval Ġk Array Size : ĠInt Ġ= Ġ 1 0 0 0 0 0 0 Ċ const Ġval Ġk T ight Loop : ĠInt Ġ= Ġ 1 0 0 0 0 Ċ Ċ class ĠInt Box ( val Ġvalue : ĠInt ) Ċ Ċ abstract Ġclass ĠBenchmark Ġ{ ĊĠ Ġopen Ġfun Ġsetup () Ġ{ Ġ} ĊĠ Ġabstract Ġsuspend Ġfun Ġloop (): ĠLong Ċ } Ċ Ċ class ĠImmutable Kotlin Benchmark : ĠBenchmark () Ġ{ ĊĠ Ġprivate Ġvar Ġarray : ĠMutable List < Int Box >? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġrandom : ĠRandom Ġ= ĠRandom ( 0 ); ĊĊĠ Ġoverride Ġfun Ġsetup () Ġ{ ĊĠĠĠ Ġarray Ġ= ĠMutable List ( k Array Size ) Ġ{ ĠInt Box ( random . nextInt ( k Array Size )) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġloop (): ĠLong Ġ{ ĊĠĠĠ Ġvar Ġcount : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġval ĠendTime : ĠLong Ġ= ĠSystem . nano Time () Ġ+ Ġmax Duration ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( step Ġin Ġ 0 Ġuntil Ġk T ight Loop ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt Ġ= Ġarray ! ![ ( count Ġ% Ġk Array Size ). toInt ()]. value Ġ+ Ġstep ; ĊĠĠĠĠĠĠĠ Ġarray ! ![ index Ġ% Ġk Array Size ] Ġ= ĠInt Box (( count Ġ% Ġk Array Size ). toInt ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġyield (); ĊĠĠĠ Ġ} Ġwhile Ġ( System . nano Time () Ġ< ĠendTime ) ĊĠĠĠ Ġreturn Ġcount ĊĠ Ġ} Ċ } Ċ Ċ class ĠNo G CK otlin Benchmark : ĠBenchmark () Ġ{ ĊĠ Ġprivate Ġvar Ġarray : ĠMutable List < Int Box >? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġbackup : ĠMutable List < Int Box >? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġrandom : ĠRandom Ġ= ĠRandom ( 0 ); ĊĊĠ Ġoverride Ġfun Ġsetup () Ġ{ ĊĠĠĠ Ġarray Ġ= ĠMutable List ( k Array Size ) Ġ{ ĠInt Box ( random . nextInt ( k Array Size )) Ġ} ĊĠĠĠ Ġbackup Ġ= Ġarray !!. to Mutable List () ĊĠ Ġ} ĊĊĠ Ġfun Ġcopy ( index : ĠInt ): ĠInt Box Ġ{ ĊĠĠĠ Ġreturn Ġbackup ! ![ index ] ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġloop (): ĠLong Ġ{ ĊĠĠĠ Ġvar Ġcount : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġval ĠendTime : ĠLong Ġ= ĠSystem . nano Time () Ġ+ Ġmax Duration ĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( step Ġin Ġ 0 Ġuntil Ġk T ight Loop ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcount Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt Ġ= Ġarray ! ![ ( count Ġ% Ġk Array Size ). toInt ()]. value Ġ+ Ġstep ; ĊĠĠĠĠĠĠĠ Ġarray ! ![ index Ġ% Ġk Array Size ] Ġ= Ġcopy (( count Ġ% Ġk Array Size ). toInt ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġyield (); ĊĠĠĠ Ġ} Ġwhile Ġ( System . nano Time () Ġ< ĠendTime ) ĊĠĠĠ Ġreturn Ġcount ĊĠ Ġ} Ċ } ĊĊ