val newMonitor = () => {
new Monitor[TaskStats] with MemUsage with TimeUsage {
val sampleRate = 50L
}
}
val (warmups,runs) = (1,2)
val (start,end) = (1,5000000)
val sum = (a: Int, b: Int) => a + b
@scala.annotation.tailrec def loopWithTailrec(start: Int, end: Int, sum: Int): Int = {
if (start <= end) loopWithTailrec(start + 1, end, sum + start)
else sum
}
val rangeTasks = List(
task[Id,TaskStats](id="range+sum",
fn=() => (start to end).sum) _,
task[Id,TaskStats](id="range+foldLeft",
fn=() => (start to end).foldLeft(0)(sum)) _,
task[Id,TaskStats](id="range+foldRight",
fn=() => (start to end).foldRight(0)(sum)) _
)
val listTasks = List(
task[Id,TaskStats](id="list+sum",
fn=() => List.range(start,end).sum) _,
task[Id,TaskStats](id="list+foldLeft",
fn=() => List.range(start,end).foldLeft(0)(sum)) _,
task[Id,TaskStats](id="list+foldRight",
fn=() => List.range(start,end).foldRight(0)(sum)) _
)
val vectorTasks = List(
task[Id,TaskStats](id="vector+sum",
fn=() => Vector.range(start,end).sum) _,
task[Id,TaskStats](id="vector+foldLeft",
fn=() => Vector.range(start,end).foldLeft(0)(sum)) _,
task[Id,TaskStats](id="vector+foldRight",
fn=() => Vector.range(start,end).foldRight(0)(sum)) _
)
val arrayTasks = List(
task[Id,TaskStats](id="array+sum",
fn=() => Array.range(start,end).sum) _,
task[Id,TaskStats](id="array+foldLeft",
fn=() => Array.range(start,end).foldLeft(0)(sum)) _,
task[Id,TaskStats](id="array+foldRight",
fn=() => Array.range(start,end).foldRight(0)(sum)) _
)
val streamTasks = List(
task[Id,TaskStats](id="stream+sum",
fn=() => Stream.range(start,end).sum) _,
task[Id,TaskStats](id="stream+foldLeft",
fn=() => Stream.range(start,end).foldLeft(0)(sum)) _,
task[Id,TaskStats](id="stream+foldRight",
fn=() => Stream.range(start,end).foldRight(0)(sum)) _
)
val itrTasks = List(
task[Id,TaskStats](id="list+itr+foldRight",
fn=() => List.range(start,end).iterator.foldRight(0)(sum)) _,
task[Id,TaskStats](id="stream+itr+sum",
fn=() => Stream.range(start,end).iterator.sum) _,
task[Id,TaskStats](id="stream+itr+foldRight",
fn=() => Stream.range(start,end).iterator.foldRight(0)(sum)) _
)
val loopTasks = List(
task[Id,TaskStats](id="loop+for",
fn=() => {
var sum = 0
for (i <- start to end) {
sum = sum + i
}
sum
}) _,
task[Id,TaskStats](id="loop+while",
fn=() => {
var sum = 0
var i = start
while (i <= end) {
sum = sum + i
i = i + 1
}
sum
}) _,
task[Id,TaskStats](id="loop+tailrec",
fn=() => {
loopWithTailrec(start, end, 0)
}) _
)
val benchs = (
rangeTasks ++ listTasks ++ vectorTasks ++ arrayTasks ++
streamTasks ++ itrTasks ++ loopTasks
).map(
task => benchmark(task)(runs=runs,warmups=warmups)(newMonitor)(warmupReport,runReport) _
)
batch[Id,TaskStats](benchs)(benchReport)(batchReport)