Get a basic benchmark runner going.

This commit is contained in:
Bob Nystrom
2013-11-22 08:55:22 -08:00
parent d19f9f1b9b
commit b30c30e1e3
7 changed files with 112 additions and 7 deletions
+6 -1
View File
@@ -3,4 +3,9 @@ function fib(n)
return fib(n - 2) + fib(n - 1)
end
io.write(fib(35) .. "\n")
local start = os.clock()
for i = 1, 5 do
io.write(fib(30) .. "\n")
end
local elapsed = os.clock() - start
io.write(string.format("elapsed: %.8f\n", elapsed))
+6 -1
View File
@@ -1,5 +1,10 @@
import time
def fib(n):
if n < 2: return n
return fib(n - 1) + fib(n - 2)
print fib(35)
start = time.clock()
for i in range(0, 5):
print(fib(30))
print("elapsed: " + str(time.clock() - start))
+13
View File
@@ -0,0 +1,13 @@
def fib(n)
if n < 2 then
n
else
fib(n - 1) + fib(n - 2)
end
end
start = Time.now
for i in 0...5
puts fib(30)
end
puts "elapsed: " + (Time.now - start).to_s
+7 -1
View File
@@ -6,4 +6,10 @@ var fib = fn(n) {
}
}
io.write(fib.call(35))
var start = OS.clock
var i = 0
while (i < 5) {
io.write(fib.call(30))
i = i + 1
}
io.write("elapsed: " + (OS.clock - start).toString)
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/python
import math
import re
import subprocess
import sys
FIB_OUTPUT_PATTERN = re.compile(r"""832040
832040
832040
832040
832040
elapsed: (\d+\.\d+)""", re.MULTILINE)
BENCHMARKS = [
("fib", FIB_OUTPUT_PATTERN)
]
LANGUAGES = [
("wren", "../build/Release/wren", ".wren"),
("lua", "lua", ".lua"),
("python", "python", ".py"),
("ruby", "ruby", ".rb")
]
def calc_stats(nums):
"""Calculates the mean, median, and std deviation of a list of numbers."""
mean = sum(nums) / len(nums)
nums.sort()
median = nums[(len(nums) - 1) / 2]
diffs = ((n - mean) * (n - mean) for n in nums)
std_dev = math.sqrt(sum(diffs) / len(nums))
return [mean, median, std_dev]
def run_benchmark_once(benchmark, language):
args = [language[1], benchmark[0] + language[2]]
out = subprocess.check_output(args, universal_newlines=True)
match = benchmark[1].match(out)
if match:
return float(match.group(1))
else:
return None
def run_benchmark(benchmark, language):
print "{0} - {1:10s}".format(benchmark[0], language[0]),
times = []
for i in range(0, 7):
times.append(run_benchmark_once(benchmark, language))
sys.stdout.write(".")
if None in times:
print "error"
return
times.sort()
stats = calc_stats(times)
print " mean: {0:.4f} median: {1:.4f} std_dev: {2:.4f}".format(
stats[0], stats[1], stats[2])
for benchmark in BENCHMARKS:
for language in LANGUAGES:
run_benchmark(benchmark, language)