From 495522043e1072b01e4a1f98754dcc0d6135b854 Mon Sep 17 00:00:00 2001 From: fennecdjay Date: Sun, 10 Nov 2019 23:40:31 +0100 Subject: [PATCH] :book: Update --- benchmark/binary-trees-gc.wren | 55 +++++++++++++ benchmark/binary-trees.dart | 56 +++++++++++++ benchmark/binary-trees.gw | 51 ++++++++++++ benchmark/binary-trees.lua | 50 ++++++++++++ benchmark/binary-trees.py | 44 +++++++++++ benchmark/binary-trees.rb | 49 ++++++++++++ benchmark/binary-trees.wren | 51 ++++++++++++ benchmark/fib-recurs.ck | 10 +++ benchmark/fib-recurs.gw | 8 ++ benchmark/fib-recurs.hs | 6 ++ benchmark/fib-recurs.lua | 6 ++ benchmark/fib-recurs.pl | 9 +++ benchmark/fib-recurs.py | 7 ++ benchmark/fib-recurs.rb | 5 ++ benchmark/fib-recurs.wren | 8 ++ benchmark/fib.dart | 10 +++ benchmark/fib.gw | 8 ++ benchmark/fib.lua | 8 ++ benchmark/fib.py | 8 ++ benchmark/fib.rb | 11 +++ benchmark/fib.wren | 10 +++ benchmark/for.dart | 10 +++ benchmark/for.gw | 10 +++ benchmark/for.lua | 10 +++ benchmark/for.py | 16 ++++ benchmark/for.rb | 6 ++ benchmark/for.wren | 8 ++ benchmark/method-call.ck | 58 ++++++++++++++ benchmark/method-call.dart | 78 ++++++++++++++++++ benchmark/method-call.gw | 58 ++++++++++++++ benchmark/method-call.lua | 92 ++++++++++++++++++++++ benchmark/method-call.py | 72 +++++++++++++++++ benchmark/method-call.rb | 79 +++++++++++++++++++ benchmark/method-call.wren | 68 ++++++++++++++++ benchmark/results/binary-trees.dat | 3 + benchmark/results/binary-trees.png | Bin 0 -> 10673 bytes benchmark/results/fib-recurs.dat | 3 + benchmark/results/fib-recurs.png | Bin 0 -> 9980 bytes benchmark/results/fib.dat | 3 + benchmark/results/fib.png | Bin 0 -> 8684 bytes benchmark/results/for.dat | 3 + benchmark/results/for.png | Bin 0 -> 11560 bytes benchmark/results/method-call.dat | 3 + benchmark/results/method-call.png | Bin 0 -> 9975 bytes benchmark/results/string-equals.dat | 2 + benchmark/results/string-equals.png | Bin 0 -> 12250 bytes benchmark/string-equals.gw | 21 +++++ benchmark/string-equals.py | 35 ++++++++ benchmark/string-equals.wren | 24 ++++++ docs/Benchmarks.mdr | 88 +-------------------- docs/assets/benchmark/Makefile.dat | 0 docs/assets/benchmark/bench.plot.dat | 0 docs/assets/benchmark/benchmark.sh.dat | 0 docs/assets/benchmark/book.toml.dat | 0 docs/assets/benchmark/custom.css.dat | 0 docs/assets/benchmark/docs.dat | 0 docs/assets/benchmark/forloop0.gw.dat | 0 docs/assets/benchmark/forloop2.gw.dat | 0 docs/assets/benchmark/forloop3.gw.dat | 0 docs/assets/benchmark/forloop4.gw.dat | 0 docs/assets/benchmark/forloop5.gw.dat | 0 docs/assets/benchmark/function0.gw.dat | 0 docs/assets/benchmark/helloworld.gw.dat | 0 docs/assets/benchmark/lambda_args0.gw.dat | 0 docs/assets/benchmark/lambda_call0.gw.dat | 0 docs/assets/benchmark/lambda_fptr0.gw.dat | 0 docs/assets/benchmark/log.dat | 0 docs/assets/benchmark/repeat.gw.dat | 0 docs/assets/benchmark/repeat2.gw.dat | 0 docs/assets/benchmark/scripts.dat | 0 docs/assets/benchmark/src.dat | 0 docs/assets/benchmark/variadic.gw.dat | 0 docs/assets/benchmark/while0.gw.dat | 0 docs/assets/benchmark/while1.gw.dat | 0 docs/custom.css | 10 --- scripts/bench.plot | 26 ++++++ scripts/benchmark.sh | 36 +++++++++ scripts/ensure.sh | 9 ++- scripts/test.sh | 2 +- 79 files changed, 1202 insertions(+), 101 deletions(-) create mode 100644 benchmark/binary-trees-gc.wren create mode 100644 benchmark/binary-trees.dart create mode 100644 benchmark/binary-trees.gw create mode 100644 benchmark/binary-trees.lua create mode 100644 benchmark/binary-trees.py create mode 100644 benchmark/binary-trees.rb create mode 100644 benchmark/binary-trees.wren create mode 100644 benchmark/fib-recurs.ck create mode 100644 benchmark/fib-recurs.gw create mode 100644 benchmark/fib-recurs.hs create mode 100644 benchmark/fib-recurs.lua create mode 100644 benchmark/fib-recurs.pl create mode 100644 benchmark/fib-recurs.py create mode 100644 benchmark/fib-recurs.rb create mode 100644 benchmark/fib-recurs.wren create mode 100644 benchmark/fib.dart create mode 100644 benchmark/fib.gw create mode 100644 benchmark/fib.lua create mode 100644 benchmark/fib.py create mode 100644 benchmark/fib.rb create mode 100644 benchmark/fib.wren create mode 100644 benchmark/for.dart create mode 100644 benchmark/for.gw create mode 100644 benchmark/for.lua create mode 100644 benchmark/for.py create mode 100644 benchmark/for.rb create mode 100644 benchmark/for.wren create mode 100644 benchmark/method-call.ck create mode 100644 benchmark/method-call.dart create mode 100644 benchmark/method-call.gw create mode 100644 benchmark/method-call.lua create mode 100644 benchmark/method-call.py create mode 100644 benchmark/method-call.rb create mode 100644 benchmark/method-call.wren create mode 100644 benchmark/results/binary-trees.dat create mode 100644 benchmark/results/binary-trees.png create mode 100644 benchmark/results/fib-recurs.dat create mode 100644 benchmark/results/fib-recurs.png create mode 100644 benchmark/results/fib.dat create mode 100644 benchmark/results/fib.png create mode 100644 benchmark/results/for.dat create mode 100644 benchmark/results/for.png create mode 100644 benchmark/results/method-call.dat create mode 100644 benchmark/results/method-call.png create mode 100644 benchmark/results/string-equals.dat create mode 100644 benchmark/results/string-equals.png create mode 100644 benchmark/string-equals.gw create mode 100644 benchmark/string-equals.py create mode 100644 benchmark/string-equals.wren delete mode 100644 docs/assets/benchmark/Makefile.dat delete mode 100644 docs/assets/benchmark/bench.plot.dat delete mode 100644 docs/assets/benchmark/benchmark.sh.dat delete mode 100644 docs/assets/benchmark/book.toml.dat delete mode 100644 docs/assets/benchmark/custom.css.dat delete mode 100644 docs/assets/benchmark/docs.dat delete mode 100644 docs/assets/benchmark/forloop0.gw.dat delete mode 100644 docs/assets/benchmark/forloop2.gw.dat delete mode 100644 docs/assets/benchmark/forloop3.gw.dat delete mode 100644 docs/assets/benchmark/forloop4.gw.dat delete mode 100644 docs/assets/benchmark/forloop5.gw.dat delete mode 100644 docs/assets/benchmark/function0.gw.dat delete mode 100644 docs/assets/benchmark/helloworld.gw.dat delete mode 100644 docs/assets/benchmark/lambda_args0.gw.dat delete mode 100644 docs/assets/benchmark/lambda_call0.gw.dat delete mode 100644 docs/assets/benchmark/lambda_fptr0.gw.dat delete mode 100644 docs/assets/benchmark/log.dat delete mode 100644 docs/assets/benchmark/repeat.gw.dat delete mode 100644 docs/assets/benchmark/repeat2.gw.dat delete mode 100644 docs/assets/benchmark/scripts.dat delete mode 100644 docs/assets/benchmark/src.dat delete mode 100644 docs/assets/benchmark/variadic.gw.dat delete mode 100644 docs/assets/benchmark/while0.gw.dat delete mode 100644 docs/assets/benchmark/while1.gw.dat delete mode 100644 docs/custom.css create mode 100644 scripts/bench.plot create mode 100644 scripts/benchmark.sh diff --git a/benchmark/binary-trees-gc.wren b/benchmark/binary-trees-gc.wren new file mode 100644 index 00000000..803202ec --- /dev/null +++ b/benchmark/binary-trees-gc.wren @@ -0,0 +1,55 @@ +// Ported from the Python version. + +class Tree { + construct new(item, depth) { + _item = item + if (depth > 0) { + var item2 = item + item + depth = depth - 1 + _left = Tree.new(item2 - 1, depth) + _right = Tree.new(item2, depth) + } + } + + check { + if (_left == null) { + return _item + } + + return _item + _left.check - _right.check + } +} + +var minDepth = 4 +var maxDepth = 12 +var stretchDepth = maxDepth + 1 + +System.print("stretch tree of depth %(stretchDepth) check: " + + "%(Tree.new(0, stretchDepth).check)") +for (i in 1...1000) System.gc() + +var longLivedTree = Tree.new(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 + for (i in 1..iterations) { + check = check + Tree.new(i, depth).check + Tree.new(-i, depth).check + } + + System.print("%(iterations * 2) trees of depth %(depth) check: %(check)") + for (i in 1...1000) System.gc() + + iterations = iterations / 4 + depth = depth + 2 +} + +System.print( + "long lived tree of depth %(maxDepth) check: %(longLivedTree.check)") +for (i in 1...1000) System.gc() diff --git a/benchmark/binary-trees.dart b/benchmark/binary-trees.dart new file mode 100644 index 00000000..f7d52d5f --- /dev/null +++ b/benchmark/binary-trees.dart @@ -0,0 +1,56 @@ +// Ported from the Wren version. + +class Tree { + var _item; + var _left; + var _right; + + Tree(item, depth) { + _item = item; + if (depth > 0) { + var item2 = item + item; + depth--; + _left = new Tree(item2 - 1, depth); + _right = new Tree(item2, depth); + } + } + + get check { + if (_left == null) { + return _item; + } + + return _item + _left.check - _right.check; + } +} + +main() { + var minDepth = 4; + var maxDepth = 12; + var stretchDepth = maxDepth + 1; + + print("stretch tree of depth ${stretchDepth} check: " + "${new Tree(0, stretchDepth).check}"); + + var longLivedTree = new Tree(0, maxDepth); + + // iterations = 2 ** maxDepth + var iterations = 1; + for (var d = 0; d < maxDepth; d++) { + iterations = iterations * 2; + } + + var depth = minDepth; + while (depth < stretchDepth) { + var check = 0; + for (var i = 1; i <= iterations; i++) { + check += new Tree(i, depth).check + new Tree(-i, depth).check; + } + + print("${iterations * 2} trees of depth ${depth} check: ${check}"); + iterations ~/= 4; + depth += 2; + } + + print("long lived tree of depth ${maxDepth} check: ${longLivedTree.check}"); +} diff --git a/benchmark/binary-trees.gw b/benchmark/binary-trees.gw new file mode 100644 index 00000000..af3486c1 --- /dev/null +++ b/benchmark/binary-trees.gw @@ -0,0 +1,51 @@ +#! Ported from the Wren version. + +class Tree { + int item; + Tree @left, right; + + fun static Tree new_Tree(int it, int depth) { + Tree t; + it => t.item; + if (depth > 0) { + it + it => int item2; + --depth; + Tree.new_Tree(item2 - 1, depth) @=> t.left; + Tree.new_Tree(item2, depth) @=> t.right; + } + return t; + } + + fun int check() { + if (!left) + return item; + return item + left.check() - right.check(); + } +} + +4 => int minDepth; +12 => int maxDepth; +maxDepth + 1 => int stretchDepth; + +<<< "stretch tree of depth ", stretchDepth, " check: ", + Tree.new_Tree(0, stretchDepth).check() >>>; + +Tree.new_Tree(0, maxDepth) @=> Tree@ longLivedTree; + +#! iterations = 2 ** maxDepth +1 => int iterations; +for (int d; d < maxDepth; ++d) + 2 *=> iterations; + +minDepth => int depth; +while (depth < stretchDepth) { + int check; + for (int i; i < iterations; ++i) + Tree.new_Tree(i, depth).check() + Tree.new_Tree(-i, depth).check() +=> check; + + <<< iterations * 2, " trees of depth ", depth, " check: ", check >>>; + 4 /=> iterations; + 2 +=> depth; +} + +<<< "long lived tree of depth ", maxDepth, " check: ", longLivedTree.check() >>>; diff --git a/benchmark/binary-trees.lua b/benchmark/binary-trees.lua new file mode 100644 index 00000000..e690c270 --- /dev/null +++ b/benchmark/binary-trees.lua @@ -0,0 +1,50 @@ +-- The Computer Language Benchmarks Game +-- http://shootout.alioth.debian.org/ +-- contributed by Mike Pall + +local function BottomUpTree(item, depth) + if depth > 0 then + local i = item + item + depth = depth - 1 + local left, right = BottomUpTree(i-1, depth), BottomUpTree(i, depth) + return { item, left, right } + else + return { item } + end +end + +local function ItemCheck(tree) + if tree[2] then + return tree[1] + ItemCheck(tree[2]) - ItemCheck(tree[3]) + else + return tree[1] + end +end + +local N = 12 +local mindepth = 4 +local maxdepth = mindepth + 2 +if maxdepth < N then maxdepth = N end + +do + local stretchdepth = maxdepth + 1 + local stretchtree = BottomUpTree(0, stretchdepth) + io.write(string.format("stretch tree of depth %d check: %d\n", + stretchdepth, ItemCheck(stretchtree))) +end + +local longlivedtree = BottomUpTree(0, maxdepth) + +for depth=mindepth,maxdepth,2 do + local iterations = 2 ^ (maxdepth - depth + mindepth) + local check = 0 + for i=1,iterations do + check = check + ItemCheck(BottomUpTree(1, depth)) + + ItemCheck(BottomUpTree(-1, depth)) + end + io.write(string.format("%d trees of depth %d check: %d\n", + iterations*2, depth, check)) +end + +io.write(string.format("long lived tree of depth %d check: %d\n", + maxdepth, ItemCheck(longlivedtree))) diff --git a/benchmark/binary-trees.py b/benchmark/binary-trees.py new file mode 100644 index 00000000..b08adf3b --- /dev/null +++ b/benchmark/binary-trees.py @@ -0,0 +1,44 @@ +# The Computer Language Benchmarks Game +# http://shootout.alioth.debian.org/ +# +# contributed by Antoine Pitrou +# modified by Dominique Wahli +# modified by Heinrich Acker +from __future__ import print_function + +# Map "range" to an efficient range in both Python 2 and 3. +try: + range = xrange +except NameError: + pass + +def make_tree(item, depth): + if not depth: return item, None, None + item2 = item + item + depth -= 1 + return item, make_tree(item2 - 1, depth), make_tree(item2, depth) + +def check_tree(node): + item, left, right = node + if not left: return item + return item + check_tree(left) - check_tree(right) + +min_depth = 4 +max_depth = 12 +stretch_depth = max_depth + 1 + +print("stretch tree of depth %d check:" % stretch_depth, check_tree(make_tree(0, stretch_depth))) + +long_lived_tree = make_tree(0, max_depth) + +iterations = 2 ** max_depth +for depth in range(min_depth, stretch_depth, 2): + + check = 0 + for i in range(1, iterations + 1): + check += check_tree(make_tree(i, depth)) + check_tree(make_tree(-i, depth)) + + print("%d trees of depth %d check:" % (iterations * 2, depth), check) + iterations //= 4 + +print("long lived tree of depth %d check:" % max_depth, check_tree(long_lived_tree)) diff --git a/benchmark/binary-trees.rb b/benchmark/binary-trees.rb new file mode 100644 index 00000000..2118083c --- /dev/null +++ b/benchmark/binary-trees.rb @@ -0,0 +1,49 @@ +# The Computer Language Shootout Benchmarks +# http://shootout.alioth.debian.org +# +# contributed by Jesse Millikan +# Modified by Wesley Moxam + + +def item_check(left, item, right) + return item if left.nil? + item + item_check(*left) - item_check(*right) +end + +def bottom_up_tree(item, depth) + return [nil, item, nil] unless depth > 0 + item_item = 2 * item + depth -= 1 + [bottom_up_tree(item_item - 1, depth), item, bottom_up_tree(item_item, depth)] +end + +max_depth = 12 +min_depth = 4 + +max_depth = min_depth + 2 if min_depth + 2 > max_depth + +stretch_depth = max_depth + 1 +stretch_tree = bottom_up_tree(0, stretch_depth) + +puts "stretch tree of depth #{stretch_depth} check: #{item_check(*stretch_tree)}" +stretch_tree = nil + +long_lived_tree = bottom_up_tree(0, max_depth) + +min_depth.step(max_depth + 1, 2) do |depth| + iterations = 2**(max_depth - depth + min_depth) + + check = 0 + + for i in 1..iterations + temp_tree = bottom_up_tree(i, depth) + check += item_check(*temp_tree) + + temp_tree = bottom_up_tree(-i, depth) + check += item_check(*temp_tree) + end + + puts "#{iterations * 2} trees of depth #{depth} check: #{check}" +end + +puts "long lived tree of depth #{max_depth} check: #{item_check(*long_lived_tree)}" diff --git a/benchmark/binary-trees.wren b/benchmark/binary-trees.wren new file mode 100644 index 00000000..2393462b --- /dev/null +++ b/benchmark/binary-trees.wren @@ -0,0 +1,51 @@ +// Ported from the Python version. + +class Tree { + construct new(item, depth) { + _item = item + if (depth > 0) { + var item2 = item + item + depth = depth - 1 + _left = Tree.new(item2 - 1, depth) + _right = Tree.new(item2, depth) + } + } + + check { + if (_left == null) { + return _item + } + + return _item + _left.check - _right.check + } +} + +var minDepth = 4 +var maxDepth = 12 +var stretchDepth = maxDepth + 1 + +System.print("stretch tree of depth %(stretchDepth) check: " + + "%(Tree.new(0, stretchDepth).check)") + +var longLivedTree = Tree.new(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 + for (i in 1..iterations) { + check = check + Tree.new(i, depth).check + Tree.new(-i, depth).check + } + + System.print("%(iterations * 2) trees of depth %(depth) check: %(check)") + iterations = iterations / 4 + depth = depth + 2 +} + +System.print( + "long lived tree of depth %(maxDepth) check: %(longLivedTree.check)") diff --git a/benchmark/fib-recurs.ck b/benchmark/fib-recurs.ck new file mode 100644 index 00000000..c0026c47 --- /dev/null +++ b/benchmark/fib-recurs.ck @@ -0,0 +1,10 @@ +//int count = 0; +fun int recursive_fib(int n) +{ +// ++count; + if (n < 2) + return n; + else + return recursive_fib(n - 2) + recursive_fib(n - 1); +} +<<>>; diff --git a/benchmark/fib-recurs.gw b/benchmark/fib-recurs.gw new file mode 100644 index 00000000..be2c4ab7 --- /dev/null +++ b/benchmark/fib-recurs.gw @@ -0,0 +1,8 @@ +fun int recursive_fib(int n) { + if (n < 2) + return n; + else + return recursive_fib(n - 2) + recursive_fib(n - 1); +} +#!<<< 5 => recursive_fib >>>; +<<< 40 => recursive_fib >>>; diff --git a/benchmark/fib-recurs.hs b/benchmark/fib-recurs.hs new file mode 100644 index 00000000..6929769e --- /dev/null +++ b/benchmark/fib-recurs.hs @@ -0,0 +1,6 @@ +fib :: Int -> Int +fib n + | n < 2 = n + | otherwise = (fib (n-2)) + (fib (n-1)) + +main = print $ fib 40 diff --git a/benchmark/fib-recurs.lua b/benchmark/fib-recurs.lua new file mode 100644 index 00000000..3b84ea32 --- /dev/null +++ b/benchmark/fib-recurs.lua @@ -0,0 +1,6 @@ +local function fib(n) + if n <= 2 then return 1 end + return fib(n - 1) + fib(n - 2) +end + +print(fib(40)) diff --git a/benchmark/fib-recurs.pl b/benchmark/fib-recurs.pl new file mode 100644 index 00000000..55092d23 --- /dev/null +++ b/benchmark/fib-recurs.pl @@ -0,0 +1,9 @@ +sub fibonacci_recurs { + my ($number) = @_; + if ($number < 2) { # base case + return $number; + } + return fibonacci_recurs($number-1) + fibonacci_recurs($number-2); +} + +print fibonacci_recurs(40) , "\n"; diff --git a/benchmark/fib-recurs.py b/benchmark/fib-recurs.py new file mode 100644 index 00000000..672317f8 --- /dev/null +++ b/benchmark/fib-recurs.py @@ -0,0 +1,7 @@ +def fibonacci_recurs(n): + if n < 2: + return n; + else: + return (fibonacci_recurs(n-1) + fibonacci_recurs(n-2)) + +print(fibonacci_recurs(40)) diff --git a/benchmark/fib-recurs.rb b/benchmark/fib-recurs.rb new file mode 100644 index 00000000..00f33f13 --- /dev/null +++ b/benchmark/fib-recurs.rb @@ -0,0 +1,5 @@ +def fibonacci_recurs( n ) + if n < 2 then return n end + return ( fibonacci_recurs( n - 1 ) + fibonacci_recurs( n - 2 ) ) +end +puts fibonacci_recurs(40) diff --git a/benchmark/fib-recurs.wren b/benchmark/fib-recurs.wren new file mode 100644 index 00000000..db980c49 --- /dev/null +++ b/benchmark/fib-recurs.wren @@ -0,0 +1,8 @@ +class Fib { + static get(n) { + if (n < 2) return n + return get(n - 1) + get(n - 2) + } +} + +System.print(Fib.get(40)) diff --git a/benchmark/fib.dart b/benchmark/fib.dart new file mode 100644 index 00000000..3ffa670b --- /dev/null +++ b/benchmark/fib.dart @@ -0,0 +1,10 @@ +fib(n) { + if (n < 2) return n; + return fib(n - 1) + fib(n - 2); +} + +main() { + for (var i = 0; i < 5; i++) { + print(fib(28)); + } +} diff --git a/benchmark/fib.gw b/benchmark/fib.gw new file mode 100644 index 00000000..19f56b93 --- /dev/null +++ b/benchmark/fib.gw @@ -0,0 +1,8 @@ +class Fib { + fun static int get(int n) { + if (n < 2) return n; + return get(n - 1) + get(n - 2); + } +} +repeat(5) + <<< Fib.get(28) >>>; diff --git a/benchmark/fib.lua b/benchmark/fib.lua new file mode 100644 index 00000000..a4f06e7c --- /dev/null +++ b/benchmark/fib.lua @@ -0,0 +1,8 @@ +function fib(n) + if n < 2 then return n end + return fib(n - 2) + fib(n - 1) +end + +for i = 1, 5 do + io.write(fib(28) .. "\n") +end diff --git a/benchmark/fib.py b/benchmark/fib.py new file mode 100644 index 00000000..c2f3ba4d --- /dev/null +++ b/benchmark/fib.py @@ -0,0 +1,8 @@ +from __future__ import print_function + +def fib(n): + if n < 2: return n + return fib(n - 1) + fib(n - 2) + +for i in range(0, 5): + print(fib(28)) diff --git a/benchmark/fib.rb b/benchmark/fib.rb new file mode 100644 index 00000000..c496913b --- /dev/null +++ b/benchmark/fib.rb @@ -0,0 +1,11 @@ +def fib(n) + if n < 2 then + n + else + fib(n - 1) + fib(n - 2) + end +end + +for i in 0...5 + puts fib(28) +end diff --git a/benchmark/fib.wren b/benchmark/fib.wren new file mode 100644 index 00000000..441a7e69 --- /dev/null +++ b/benchmark/fib.wren @@ -0,0 +1,10 @@ +class Fib { + static get(n) { + if (n < 2) return n + return get(n - 1) + get(n - 2) + } +} + +for (i in 1..5) { + System.print(Fib.get(28)) +} diff --git a/benchmark/for.dart b/benchmark/for.dart new file mode 100644 index 00000000..14aadbd4 --- /dev/null +++ b/benchmark/for.dart @@ -0,0 +1,10 @@ +main() { + var list = []; + + for (var i = 0; i < 1000000; i++) list.add(i); + + var sum = 0; + for (i in list) sum += i; + + print(sum); +} diff --git a/benchmark/for.gw b/benchmark/for.gw new file mode 100644 index 00000000..6ec6aaa6 --- /dev/null +++ b/benchmark/for.gw @@ -0,0 +1,10 @@ +int list[0]; + +for (int i; i < 1000000; ++i) + list << i; + +int sum; +for(auto i : list) + i +=> sum; + +<<< sum >>>; diff --git a/benchmark/for.lua b/benchmark/for.lua new file mode 100644 index 00000000..b03654b3 --- /dev/null +++ b/benchmark/for.lua @@ -0,0 +1,10 @@ +local list = {} +for i = 0, 999999 do + list[i] = i +end + +local sum = 0 +for k, i in pairs(list) do + sum = sum + i +end +io.write(sum .. "\n") diff --git a/benchmark/for.py b/benchmark/for.py new file mode 100644 index 00000000..cf31ddab --- /dev/null +++ b/benchmark/for.py @@ -0,0 +1,16 @@ +from __future__ import print_function + +# Map "range" to an efficient range in both Python 2 and 3. +try: + range = xrange +except NameError: + pass + +list = [] +for i in range(0, 1000000): + list.append(i) + +sum = 0 +for i in list: + sum += i +print(sum) diff --git a/benchmark/for.rb b/benchmark/for.rb new file mode 100644 index 00000000..87b9d79d --- /dev/null +++ b/benchmark/for.rb @@ -0,0 +1,6 @@ +list = [] +1000000.times {|i| list << i} + +sum = 0 +list.each {|i| sum += i} +puts sum diff --git a/benchmark/for.wren b/benchmark/for.wren new file mode 100644 index 00000000..ef259783 --- /dev/null +++ b/benchmark/for.wren @@ -0,0 +1,8 @@ +var list = [] + +for (i in 0...1000000) list.add(i) + +var sum = 0 +for (i in list) sum = sum + i + +System.print(sum) diff --git a/benchmark/method-call.ck b/benchmark/method-call.ck new file mode 100644 index 00000000..5e09599e --- /dev/null +++ b/benchmark/method-call.ck @@ -0,0 +1,58 @@ +class Toggle { + int state; + fun int value() { return state; } + fun Toggle activate() { + !state => state; + return this; + } +} + +class NthToggle extends Toggle { + int count, countMax; + fun Toggle activate() { + if(++count >= countMax) { + (this $ Toggle).activate(); + 0 => count; + } + return this; + } +} + +100000 => int n; + +Toggle toggle; +true => int val => toggle.state; + +repeat(n) { + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; +} + +<<< toggle.value() >>>; + +NthToggle ntoggle; +true => val => ntoggle.state; +3 => ntoggle.countMax; + +repeat(n) { + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; +} + +<<< ntoggle.value() >>>; diff --git a/benchmark/method-call.dart b/benchmark/method-call.dart new file mode 100644 index 00000000..540a8266 --- /dev/null +++ b/benchmark/method-call.dart @@ -0,0 +1,78 @@ +class Toggle { + var _state; + + Toggle(startState) { + _state = startState; + } + + get value => _state; + + activate() { + _state = !_state; + return this; + } +} + +class NthToggle extends Toggle { + var _count; + var _countMax; + + NthToggle(startState, maxCounter) + : super(startState) { + _countMax = maxCounter; + _count = 0; + } + + activate() { + _count = _count + 1; + if (_count >= _countMax) { + super.activate(); + _count = 0; + } + + return this; + } +} + +main() { + Stopwatch watch = new Stopwatch(); + watch.start(); + + var n = 100000; + var val = true; + var toggle = new Toggle(val); + + for (var i = 0; i < n; i++) { + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + val = toggle.activate().value; + } + + print(toggle.value); + + val = true; + var ntoggle = new NthToggle(val, 3); + + for (var i = 0; i < n; i++) { + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + val = ntoggle.activate().value; + } + + print(ntoggle.value); + print("elapsed: ${watch.elapsedMilliseconds / 1000}"); +} diff --git a/benchmark/method-call.gw b/benchmark/method-call.gw new file mode 100644 index 00000000..5a17f900 --- /dev/null +++ b/benchmark/method-call.gw @@ -0,0 +1,58 @@ +class Toggle { + bool state; + fun bool value() { return state; } + fun Toggle activate() { + !state => state; + return this; + } +} + +class NthToggle extends Toggle { + int count, countMax; + fun Toggle activate() { + if(++count >= countMax) { + (this $ Toggle).activate(); + 0 => count; + } + return this; + } +} + +100000 => int n; + +Toggle toggle; +true => bool val => toggle.state; + +repeat(n) { + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; + toggle.activate().value() => val; +} + +<<< toggle.value() >>>; + +NthToggle ntoggle; +true => val => ntoggle.state; +3 => ntoggle.countMax; + +repeat(n) { + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; + ntoggle.activate().value() => val; +} + +<<< ntoggle.value() >>>; diff --git a/benchmark/method-call.lua b/benchmark/method-call.lua new file mode 100644 index 00000000..20a6d6ac --- /dev/null +++ b/benchmark/method-call.lua @@ -0,0 +1,92 @@ +-- $Id: methcall.lua,v 1.2 2004-06-12 16:19:43 bfulgham Exp $ +-- http://shootout.alioth.debian.org +-- contributed by Roberto Ierusalimschy + +-------------------------------------------------------------- +-- Toggle class +-------------------------------------------------------------- + +Toggle = {} + +function Toggle:value () + return self.state +end + +function Toggle:activate () + self.state = not self.state + return self +end + +function Toggle:new (start_state) + local o = {state = start_state} + self.__index =self + setmetatable(o, self) + return o +end + + +-------------------------------------------------------------- +-- NthToggle class +-------------------------------------------------------------- + +NthToggle = Toggle:new() + +function NthToggle:activate () + self.counter = self.counter + 1 + if self.counter >= self.count_max then + Toggle.activate(self) + self.counter = 0 + end + return self +end + +function NthToggle:new (start_state, max_counter) + local o = Toggle.new(self, start_state) + o.count_max = max_counter + o.counter = 0 + return o +end + + +----------------------------------------------------------- +-- main +----------------------------------------------------------- + +function main () + local N = 100000 + + local val = 1 + local toggle = Toggle:new(val) + for i=1,N do + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + val = toggle:activate():value() + end + print(val and "true" or "false") + + val = 1 + local ntoggle = NthToggle:new(val, 3) + for i=1,N do + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + val = ntoggle:activate():value() + end + print(val and "true" or "false") +end + +main() + diff --git a/benchmark/method-call.py b/benchmark/method-call.py new file mode 100644 index 00000000..c307a899 --- /dev/null +++ b/benchmark/method-call.py @@ -0,0 +1,72 @@ +#!/usr/bin/python +# http://www.bagley.org/~doug/shootout/ +from __future__ import print_function + +# Map "range" to an efficient range in both Python 2 and 3. +try: + range = xrange +except NameError: + pass + +class Toggle(object): + def __init__(self, start_state): + self.bool = start_state + def value(self): + return(self.bool) + def activate(self): + self.bool = not self.bool + return(self) + +class NthToggle(Toggle): + def __init__(self, start_state, max_counter): + Toggle.__init__(self, start_state) + self.count_max = max_counter + self.counter = 0 + def activate(self): + self.counter += 1 + if (self.counter >= self.count_max): + super(NthToggle, self).activate() + self.counter = 0 + return(self) + + +def main(): + NUM = 100000 + + val = 1 + toggle = Toggle(val) + for i in range(0,NUM): + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + if val: + print("true") + else: + print("false") + + val = 1 + ntoggle = NthToggle(val, 3) + for i in range(0,NUM): + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + if val: + print("true") + else: + print("false") + +main() diff --git a/benchmark/method-call.rb b/benchmark/method-call.rb new file mode 100644 index 00000000..40611589 --- /dev/null +++ b/benchmark/method-call.rb @@ -0,0 +1,79 @@ +#!/usr/bin/ruby +# -*- mode: ruby -*- +# $Id: methcall.ruby,v 1.1 2004-05-19 18:10:41 bfulgham Exp $ +# http://www.bagley.org/~doug/shootout/ +# with help from Aristarkh Zagorodnikov + +class Toggle + def initialize(start_state) + @bool = start_state + end + + def value + @bool + end + + def activate + @bool = !@bool + self + end +end + +class NthToggle < Toggle + def initialize(start_state, max_counter) + super start_state + @count_max = max_counter + @counter = 0 + end + + def activate + @counter += 1 + if @counter >= @count_max + super + @counter = 0 + end + self + end +end + +def main() + start = Time.now + + n = 100000 + + val = 1 + toggle = Toggle.new(val) + n.times do + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + val = toggle.activate().value() + end + if val then puts "true" else puts "false" end + + val = 1 + ntoggle = NthToggle.new(val, 3) + n.times do + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + val = ntoggle.activate().value() + end + if val then puts "true" else puts "false" end + + puts "elapsed: " + (Time.now - start).to_s +end + +main() diff --git a/benchmark/method-call.wren b/benchmark/method-call.wren new file mode 100644 index 00000000..93367cb7 --- /dev/null +++ b/benchmark/method-call.wren @@ -0,0 +1,68 @@ +class Toggle { + construct new(startState) { + _state = startState + } + + value { _state } + activate { + _state = !_state + return this + } +} + +class NthToggle is Toggle { + construct new(startState, maxCounter) { + super(startState) + _countMax = maxCounter + _count = 0 + } + + activate { + _count = _count + 1 + if (_count >= _countMax) { + super.activate + _count = 0 + } + + return this + } +} + +var start = System.clock +var n = 100000 +var val = true +var toggle = Toggle.new(val) + +for (i in 0...n) { + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value + val = toggle.activate.value +} + +System.print(toggle.value) + +val = true +var ntoggle = NthToggle.new(val, 3) + +for (i in 0...n) { + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value + val = ntoggle.activate.value +} + +System.print(ntoggle.value) +System.print("elapsed: %(System.clock - start)") diff --git a/benchmark/results/binary-trees.dat b/benchmark/results/binary-trees.dat new file mode 100644 index 00000000..de0dc5d6 --- /dev/null +++ b/benchmark/results/binary-trees.dat @@ -0,0 +1,3 @@ +gwion Fichier binaire (entrée standard) correspondant +wren 0.205150 0.31 +lua 0.29314 0.64 diff --git a/benchmark/results/binary-trees.png b/benchmark/results/binary-trees.png new file mode 100644 index 0000000000000000000000000000000000000000..423552ec96706b09c138e9323d3a186c258cc5a1 GIT binary patch literal 10673 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 kP=81c*yR6yGa^m>Vwhst9@XexfmuoMAAk4RJ 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 C>3nAZ literal 0 HcmV?d00001 diff --git a/benchmark/results/fib.dat b/benchmark/results/fib.dat new file mode 100644 index 00000000..f99749f9 --- /dev/null +++ b/benchmark/results/fib.dat @@ -0,0 +1,3 @@ +gwion 0.089472 0.30 +wren 0.207495 0.23 +lua 0.20757 0.52 diff --git a/benchmark/results/fib.png b/benchmark/results/fib.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9827f84b4d976c57b4abfdbe5d68a7a8f5b31b GIT binary patch literal 8684 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 ZE=|8BCEd;2*$9ExWp%wv1sAOD{SSXGpxFQb literal 0 HcmV?d00001 diff --git a/benchmark/results/for.dat b/benchmark/results/for.dat new file mode 100644 index 00000000..231d793a --- /dev/null +++ b/benchmark/results/for.dat @@ -0,0 +1,3 @@ +gwion 0.037553 0.50 +wren 0.079285 0.47 +lua 0.049167 0.47 diff --git a/benchmark/results/for.png b/benchmark/results/for.png new file mode 100644 index 0000000000000000000000000000000000000000..3d5bc346eeb8ac08e566f6b959cb542f1c2acfef GIT binary patch literal 11560 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 k(qseNpeIuNw?KN6w%Jd?dH?L>>; diff --git a/benchmark/string-equals.py b/benchmark/string-equals.py new file mode 100644 index 00000000..8829b5c2 --- /dev/null +++ b/benchmark/string-equals.py @@ -0,0 +1,35 @@ +from __future__ import print_function + +import time +start = time.clock() + +count = 0 +for i in range(0, 1000000): + if "abc" == "abc": + count = count + 1 + if "a slightly longer string" == \ + "a slightly longer string": + count = count + 1 + if "a significantly longer string but still not overwhelmingly long string" == \ + "a significantly longer string but still not overwhelmingly long string": + count = count + 1 + + if "" == "abc": + count = count + 1 + if "abc" == "abcd": + count = count + 1 + if "changed one character" == "changed !ne character": + count = count + 1 + if "123" == 123: count = count + 1 + if "a slightly longer string" == \ + "a slightly longer string!": + count = count + 1 + if "a slightly longer string" == \ + "a slightly longer strinh": + count = count + 1 + if "a significantly longer string but still not overwhelmingly long string" == \ + "another": + count = count + 1 + +print(count) +print("elapsed: " + str(time.clock() - start)) diff --git a/benchmark/string-equals.wren b/benchmark/string-equals.wren new file mode 100644 index 00000000..0c87bcc2 --- /dev/null +++ b/benchmark/string-equals.wren @@ -0,0 +1,24 @@ +var start = System.clock + +var count = 0 +for (i in 1..1000000) { + if ("abc" == "abc") count = count + 1 + if ("a slightly longer string" == + "a slightly longer string") count = count + 1 + if ("a significantly longer string but still not overwhelmingly long string" == + "a significantly longer string but still not overwhelmingly long string") count = count + 1 + + if ("" == "abc") count = count + 1 + if ("abc" == "abcd") count = count + 1 + if ("changed one character" == "changed !ne character") count = count + 1 + if ("123" == 123) count = count + 1 + if ("a slightly longer string" == + "a slightly longer string!") count = count + 1 + if ("a slightly longer string" == + "a slightly longer strinh") count = count + 1 + if ("a significantly longer string but still not overwhelmingly long string" == + "another") count = count + 1 +} + +System.print(count) +System.print("elapsed: %(System.clock - start)") diff --git a/docs/Benchmarks.mdr b/docs/Benchmarks.mdr index 34a60725..39a2e8cf 100644 --- a/docs/Benchmarks.mdr +++ b/docs/Benchmarks.mdr @@ -1,89 +1,3 @@ # Benchmarks -We'll need a bash script - - - -### and a gnuplot script - - - -## Show the results -Then just run it -@exec bash benchmark.sh; rm bench.plot benchmark.sh +@exec for a in benchmark_results/*.png; do echo "![${a:-4}]($a \"${a:-4}\")"; done diff --git a/docs/assets/benchmark/Makefile.dat b/docs/assets/benchmark/Makefile.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/bench.plot.dat b/docs/assets/benchmark/bench.plot.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/benchmark.sh.dat b/docs/assets/benchmark/benchmark.sh.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/book.toml.dat b/docs/assets/benchmark/book.toml.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/custom.css.dat b/docs/assets/benchmark/custom.css.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/docs.dat b/docs/assets/benchmark/docs.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/forloop0.gw.dat b/docs/assets/benchmark/forloop0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/forloop2.gw.dat b/docs/assets/benchmark/forloop2.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/forloop3.gw.dat b/docs/assets/benchmark/forloop3.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/forloop4.gw.dat b/docs/assets/benchmark/forloop4.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/forloop5.gw.dat b/docs/assets/benchmark/forloop5.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/function0.gw.dat b/docs/assets/benchmark/function0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/helloworld.gw.dat b/docs/assets/benchmark/helloworld.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/lambda_args0.gw.dat b/docs/assets/benchmark/lambda_args0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/lambda_call0.gw.dat b/docs/assets/benchmark/lambda_call0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/lambda_fptr0.gw.dat b/docs/assets/benchmark/lambda_fptr0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/log.dat b/docs/assets/benchmark/log.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/repeat.gw.dat b/docs/assets/benchmark/repeat.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/repeat2.gw.dat b/docs/assets/benchmark/repeat2.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/scripts.dat b/docs/assets/benchmark/scripts.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/src.dat b/docs/assets/benchmark/src.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/variadic.gw.dat b/docs/assets/benchmark/variadic.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/while0.gw.dat b/docs/assets/benchmark/while0.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/assets/benchmark/while1.gw.dat b/docs/assets/benchmark/while1.gw.dat deleted file mode 100644 index e69de29b..00000000 diff --git a/docs/custom.css b/docs/custom.css deleted file mode 100644 index c143cd46..00000000 --- a/docs/custom.css +++ /dev/null @@ -1,10 +0,0 @@ -.mdr { - - -} - -footer { - text-align: center; - font-size: small; - font-style: italic; -} diff --git a/scripts/bench.plot b/scripts/bench.plot new file mode 100644 index 00000000..8c812718 --- /dev/null +++ b/scripts/bench.plot @@ -0,0 +1,26 @@ +set terminal png truecolor + +#if (!exists("bench")) +# bench = 'bench' +if (!exists("test_dir")) + test_dir = 'tests/benchmark' + +dat_name = sprintf("benchmark/results/%s.dat", bench) + +stats dat_name using 0:2 noout +max = STATS_max_y+(0.1*STATS_max_y) + +set title bench +set output sprintf("benchmark/results/%s.png", bench) +set xrange [-0.5:((ceil(STATS_max_x))+0.5)] +set yrange [0:max] +set boxwidth 0.50 +set nokey +set xtics nomirror +set ytics nomirror + +set style fill transparent solid 0.25 # partial transparency +set style fill noborder # no separate top/bottom lines + +plot dat_name using 0:2:($2*($3/100.0)):xtic(2) with boxerrorbar lc "blue" notitle, \ + '' using 0:(max-(0.05*max)):1 with labels diff --git a/scripts/benchmark.sh b/scripts/benchmark.sh new file mode 100644 index 00000000..4a13391e --- /dev/null +++ b/scripts/benchmark.sh @@ -0,0 +1,36 @@ +#!/bin/sh +language=("gwion" "wren" "lua") +extension=("gw" "wren" "lua") +test_dir="benchmark" +plot_script="scripts/bench.plot" +: "${repeats:=10}" + +run() { + perf stat -r"$repeats" "$1" "$test_dir/$3.$2" 2>&1 | grep "time elapsed" | + sed 's/ *\([0-9]*\),\([0-9]*\) .* seconds time elapsed *( +- *\([0-9]*\),\([0-9]*\)% )/\1.\2 \3.\4/' +} + +get_list() { + for file in $test_dir/*.gw + do basename "$file" .gw + done +} + +get_test() { + for (( i=0; i<=$(( ${#language[@]} -1 )); i++ )) + do + if [ -f "$test_dir/$1.${extension[$i]}" ] + then echo "${language[$i]} $(run "${language[$i]}" "${extension[$i]}" "$1")" + fi + done > "benchmark/results/$1.dat" +} + +plot() { + gnuplot -e "bench='$1'" "$plot_script" +} + +for bench in $(get_list) +do + get_test "$bench" + plot "$bench" +done diff --git a/scripts/ensure.sh b/scripts/ensure.sh index 461e5f80..f935c4f3 100644 --- a/scripts/ensure.sh +++ b/scripts/ensure.sh @@ -34,10 +34,13 @@ footer { } EOF } -[ -d src ] || sh scripts/mdr2mdbook.sh - -[ -f src/SUMMARY.md ] || sh scripts/summary.sh > src/SUMMARY.md [ -f book.toml ] || toml [ -f custom.css ] || css + +[ -d src ] || sh scripts/mdr2mdbook.sh + +[ -f src/SUMMARY.md ] || sh scripts/summary.sh > src/SUMMARY.md + +[ -d src/assets ] || cp -r assets src diff --git a/scripts/test.sh b/scripts/test.sh index 7c92514d..28b75977 100644 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -17,7 +17,7 @@ interm() { noterm() { echo '

' - cat log + sed 's/$/<\/br>/' log echo "
" check $@ && printf "${NOTERM_OK}\n" || printf "${NOTERM_NOT_OK}\n" echo '

' -- 2.43.0