Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package benchmarks
import org.openjdk.jmh.annotations._
@State(Scope.Benchmark)
class SumBenchmark:
val bigArray: Array[Int] = (1 to 10000).toArray
val bigList: List[Int] = (1 to 10000).toList
@Benchmark
def arrayMethod =
bigArray.sum
@Benchmark
def arrayWhileLoopIndex(): Int =
val length = bigArray.length
var i = 0
var sum = 0
while i < length do
sum += bigArray(i)
i = i + 1
sum
@Benchmark
def arrayForLoopIndex(): Int =
var sum = 0
for i <- 0 until bigArray.length do sum += bigArray(i)
sum
final class OptimizedRange(from: Int, to: Int):
inline def foreach(inline f: Int => Unit): Unit =
var i = from
while i < to do
f(i)
i = i + 1
@Benchmark
def arrayInlinedForLoopIndex() =
var sum = 0
for i <- OptimizedRange(0, bigArray.length) do sum += bigArray(i)
sum
@Benchmark
def arrayForLoop() =
var sum = 0
for n <- bigArray do sum += n
sum
extension (array: Array[Int])
inline def optimizedForeach(inline f: Int => Unit): Unit =
val to = array.length
var i = 0
while i < to do
f(i)
i = i + 1
@Benchmark
def arrayOptimizedForeach() =
var sum = 0
bigArray.optimizedForeach(sum += _)
sum
@Benchmark
def listMethod =
bigList.sum
@Benchmark
def listForLoopIndex(): Int =
var sum = 0
for i <- 0 until bigList.length do sum += bigList(i)
sum
@Benchmark
def listForLoop() =
var sum = 0
for n <- bigList do sum += n
sum
extension (list: List[Int])
inline def optimizedForeach(inline f: Int => Unit): Unit =
var curr = list
while curr != Nil do
f(curr.head)
curr = curr.tail
@Benchmark
def listOptimizedForeach() =
var sum = 0
bigList.optimizedForeach(sum += _)
sum