forked from Mirror/wren
Added ".." and "..." infix operators. Num implements them to
return Range objects. Those in turn implement the iterator
protocol, so now numeric for loops are easy:
for (i in 1..10) { ... }
I also cleaned up the Wren benchmarks to use this.
In the process, I discovered the method_call benchmark really
just showed loop peformance, so I unrolled the loops in all of
the languages to stress method calls.
59 lines
1.2 KiB
Plaintext
59 lines
1.2 KiB
Plaintext
// Ported from the Python version.
|
|
|
|
class Tree {
|
|
new(item, depth) {
|
|
_item = item
|
|
if (depth > 0) {
|
|
var item2 = item + item
|
|
depth = depth - 1
|
|
_left = new Tree(item2 - 1, depth)
|
|
_right = new Tree(item2, depth)
|
|
}
|
|
}
|
|
|
|
check {
|
|
if (_left == null) {
|
|
return _item
|
|
}
|
|
|
|
return _item + _left.check - _right.check
|
|
}
|
|
}
|
|
|
|
var minDepth = 4
|
|
var maxDepth = 12
|
|
var stretchDepth = maxDepth + 1
|
|
|
|
var start = OS.clock
|
|
|
|
IO.write("stretch tree of depth " + stretchDepth.toString + " check: " +
|
|
new Tree(0, stretchDepth).check.toString)
|
|
|
|
var longLivedTree = new Tree(0, maxDepth)
|
|
|
|
// iterations = 2 ** maxDepth
|
|
var iterations = 1
|
|
for (d in 0...maxDepth) {
|
|
iterations = iterations * 2
|
|
}
|
|
|
|
var depth = minDepth
|
|
while (depth < stretchDepth) {
|
|
var check = 0
|
|
var i = 1
|
|
while (i < iterations + 1) {
|
|
check = check + new Tree(i, depth).check + new Tree(-i, depth).check
|
|
i = i + 1
|
|
}
|
|
|
|
IO.write((iterations * 2).toString + " trees of depth " + depth.toString +
|
|
" check: " + check.toString)
|
|
iterations = iterations / 4
|
|
depth = depth + 2
|
|
}
|
|
|
|
IO.write("long lived tree of depth " + maxDepth.toString + " check: " +
|
|
longLivedTree.check.toString)
|
|
|
|
IO.write("elapsed: " + (OS.clock - start).toString)
|