@@ -10,38 +10,54 @@ import scala.annotation.internal.sharable
10
10
* number of compilers and run each (sequentially) a given number of times
11
11
* on the same sources.
12
12
*/
13
- object Bench extends Driver {
13
+ object Bench extends Driver :
14
14
15
15
@ sharable private var numRuns = 1
16
16
17
17
private def ntimes (n : Int )(op : => Reporter ): Reporter =
18
18
(0 until n).foldLeft(emptyReporter)((_, _) => op)
19
19
20
+ @ sharable private var times : Array [Int ] = _
21
+
20
22
override def doCompile (compiler : Compiler , fileNames : List [String ])(using Context ): Reporter =
21
- ntimes(numRuns) {
23
+ times = new Array [Int ](numRuns)
24
+ var reporter : Reporter = emptyReporter
25
+ for i <- 0 until numRuns do
22
26
val start = System .nanoTime()
23
- val r = super .doCompile(compiler, fileNames)
24
- println(s " time elapsed: ${(System .nanoTime - start) / 1000000 }ms " )
25
- if (ctx.settings.Xprompt .value) {
27
+ reporter = super .doCompile(compiler, fileNames)
28
+ times(i) = ((System .nanoTime - start) / 1000000 ).toInt
29
+ println(s " time elapsed: ${times(i)}ms " )
30
+ if ctx.settings.Xprompt .value then
26
31
print(" hit <return> to continue >" )
27
32
System .in.read()
28
33
println()
29
- }
30
- r
31
- }
34
+ reporter
32
35
33
36
def extractNumArg (args : Array [String ], name : String , default : Int = 1 ): (Int , Array [String ]) = {
34
37
val pos = args indexOf name
35
38
if (pos < 0 ) (default, args)
36
39
else (args(pos + 1 ).toInt, (args take pos) ++ (args drop (pos + 2 )))
37
40
}
38
41
39
- override def process (args : Array [String ], rootCtx : Context ): Reporter = {
42
+ def reportTimes () =
43
+ val best = times.sorted
44
+ val measured = numRuns / 3
45
+ val avgBest = best.take(measured).sum / measured
46
+ val avgLast = times.reverse.take(measured).sum / measured
47
+ println(s " best out of $numRuns runs: ${best(0 )}" )
48
+ println(s " average out of best $measured: $avgBest" )
49
+ println(s " average out of last $measured: $avgLast" )
50
+
51
+ override def process (args : Array [String ], rootCtx : Context ): Reporter =
40
52
val (numCompilers, args1) = extractNumArg(args, " #compilers" )
41
53
val (numRuns, args2) = extractNumArg(args1, " #runs" )
42
54
this .numRuns = numRuns
43
- ntimes(numCompilers)(super .process(args2, rootCtx))
44
- }
45
- }
55
+ var reporter : Reporter = emptyReporter
56
+ for i <- 0 until numCompilers do
57
+ reporter = super .process(args2, rootCtx)
58
+ reportTimes()
59
+ reporter
60
+
61
+ end Bench
46
62
47
63
0 commit comments