shithub: mc

Download patch

ref: 19d7fac9e6210af527ee1e72de4878d3951c41f6
parent: 16aa8c14d53c4d2e55651d64de26c68f23f21824
author: Ori Bernstein <ori@eigenstate.org>
date: Tue Sep 22 10:39:09 EDT 2015

Start moving benchmark runner code to Myrddin.

--- a/.gitignore
+++ b/.gitignore
@@ -27,8 +27,5 @@
 6/6m
 muse/muse
 myrbuild/myrbuild
-bench/*
-!bench/Makefile
-!bench/*.myr
 *~
 tags
--- a/bench/Makefile
+++ b/bench/Makefile
@@ -1,6 +1,6 @@
 BIN=runner
 OBJ=runner.o
-BENCHSRC=intsort.myr \
+BENCHSRC= intsort.myr \
 	 copious-allocs.myr \
 	 sha1-compute.myr \
 	 bigfactorial.myr \
--- /dev/null
+++ b/bench/bld.sub
@@ -1,0 +1,17 @@
+bin intsort = intsort.myr ;;
+bin copious-allocs = copious-allocs.myr ;;
+bin sha1-compute = sha1-compute.myr ;;
+bin bigfactorial = bigfactorial.myr ;;
+bin mandelbrot = mandelbrot.myr ;;
+bin regex-match = regex-match.myr ;;
+bin runbench = runbench.myr ;;
+
+cmd benchit =
+	./runbench
+		intsort
+		copious-allocs 
+		sha1-compute
+		bigfactorial
+		mandelbrot
+		regex-match
+;;
--- a/bench/copious-allocs.myr
+++ b/bench/copious-allocs.myr
@@ -43,7 +43,7 @@
 
 	rng = std.mksrng(123)
 	for i = 0; i < a.len - 1; i++
-		j = std.rand(rng, i, a.len)
+		j = std.rngrand(rng, i, a.len)
 		t = a[j]
 		a[j] = a[i]
 		a[i] = t
--- /dev/null
+++ b/bench/runbench.myr
@@ -1,0 +1,68 @@
+use std
+
+const Nsamp = 10
+
+const main = {args : byte[:][:]
+	var tot : flt64
+
+	std.put("Running benchmarks: {} samples per binary\n", Nsamp);
+	tot = 0.0;
+	for arg in args
+		tot = tot + timeit(arg)
+	;;
+	std.put("total:\t{}s\n", tot);
+}
+
+
+generic perror = {a : @a::(numeric,integral), msg : byte[:] -> @a
+	if a < 0
+		std.fatal("{}", msg)
+	else
+		-> a
+	;;
+}
+
+const timeit = {prog -> flt64
+	var avg, m, d, x, n : flt64
+
+	avg = 0.0;
+	m = 0.0;
+	n = 0.0;
+	for var i = 0; i < Nsamp; i++
+		n = n + 1.0;
+		x = run(prog);
+		d = (x - avg);
+		avg = avg + d/n;
+		m = m + d*(x - avg);
+	;;
+	std.put("{}:\t{}s (σ^2: {})\n", prog, avg, m/(n-1.0));
+	-> avg;
+}
+
+const run = {prog -> flt64
+	var infd, outfd
+	var pid
+	var tm
+
+	tm = std.now()
+	pid = std.fork();
+	if pid < 0
+		std.fatal("Could not fork\n");
+	elif pid == 0
+		infd = perror(std.open("/dev/zero", std.Ordonly), "could not open /dev/zero")
+		outfd = perror(std.open("/dev/null", std.Owronly), "could not open /dev/null")
+		perror(std.dup2(infd, 0), "could not redirect stdin")
+		perror(std.dup2(outfd, 1), "could not redirect stdout")
+		std.execv(prog, [prog][:])
+		std.fatal("Failed to exec\n")
+	else
+		match std.wait(pid)
+		| `std.Wfailure:	std.fatal("could not wait\n")
+		| `std.Waiterror:	std.fatal("running benchmark failed\n")
+		| `std.Wsignalled:	std.fatal("running benchmark failed\n")
+		| `std.Wsuccess:	/* nothing */
+		;;
+	;;
+	-> (std.now() - tm castto(flt64)) / 1_000_000.0
+}
+
--- a/bld.proj
+++ b/bld.proj
@@ -2,5 +2,6 @@
 	mbld
 	lib
 	test
+	bench
 ;;