#!/bin/sh
# Copyright 2011 The Go Authors.  All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.

case "$1" in
-*)	
	echo 'usage: benchcmp old.txt new.txt' >&2
	echo >&2
	echo 'Each input file should be from:' >&2
	echo '	go test -test.run=NONE -test.bench=. > [old,new].txt' >&2
	echo >&2
	echo 'Benchcmp compares the first and last for each benchmark.' >&2
	echo >&2
	echo 'If -test.benchmem=true is added to the "go test" command' >&2
	echo 'benchcmp will also compare memory allocations.' >&2
	exit 2
esac

awk '
BEGIN {
	n = 0
}

$1 ~ /Benchmark/ && $4 == "ns/op" {
	if(old[$1]) {
		if(!saw[$1]++) {
			name[n++] = $1
			if(length($1) > len)
				len = length($1)
		}
		new[$1] = $3
		if($6 == "MB/s")
			newmb[$1] = $5

		# allocs/op might be at $8 or $10 depending on if
		# SetBytes was used or not.
		# B/op might be at $6 or $8, it should be immediately
		# followed by allocs/op
		if($8 == "allocs/op") {
			newbytes[$1] = $5
			newalloc[$1] = $7
		}
		if($10 == "allocs/op") {
			newbytes[$1] = $7
			newalloc[$1] = $9
		}
	} else {
		old[$1] = $3
		if($6 == "MB/s")
			oldmb[$1] = $5
		if($8 == "allocs/op") {
			oldbytes[$1] = $5
			oldalloc[$1] = $7
		}
		if($10 == "allocs/op") {
			oldbytes[$1] = $7
			oldalloc[$1] = $9
		}
	}
}

END {
	if(n == 0) {
		print "benchcmp: no repeated benchmarks" >"/dev/stderr"
		exit 1
	}

	printf("%-*s %12s %12s  %7s\n", len, "benchmark", "old ns/op", "new ns/op", "delta")

	# print ns/op
	for(i=0; i<n; i++) {
		what = name[i]
		printf("%-*s %12d %12d  %6s%%\n", len, what, old[what], new[what],
			sprintf("%+.2f", 100*new[what]/old[what]-100))
	}

	# print mb/s
	anymb = 0
	for(i=0; i<n; i++) {
		what = name[i]
		if(!(what in newmb))
			continue
		if(anymb++ == 0)
			printf("\n%-*s %12s %12s  %7s\n", len, "benchmark", "old MB/s", "new MB/s", "speedup")
		printf("%-*s %12s %12s  %6sx\n", len, what,
			sprintf("%.2f", oldmb[what]),
			sprintf("%.2f", newmb[what]),
			sprintf("%.2f", newmb[what]/oldmb[what]))
	}

	# print allocs
	anyalloc = 0
	for(i=0; i<n; i++) {
		what = name[i]
		if(!(what in newalloc))
			continue
		if(anyalloc++ == 0)
			printf("\n%-*s %12s %12s  %7s\n", len, "benchmark", "old allocs", "new allocs", "delta")
		if(oldalloc[what] == 0)
			delta="n/a"
		else
			delta=sprintf("%.2f", 100*newalloc[what]/oldalloc[what]-100)
		printf("%-*s %12d %12d  %6s%%\n", len, what,
			oldalloc[what], newalloc[what], delta)
	}

	# print alloc bytes
	anybytes = 0
	for(i=0; i<n; i++) {
		what = name[i]
		if(!(what in newbytes))
			continue
		if(anybytes++ == 0)
			printf("\n%-*s %12s %12s  %7s\n", len, "benchmark", "old bytes", "new bytes", "delta")
		if(oldbytes[what] == 0)
			delta="n/a"
		else
			delta=sprintf("%.2f", 100*newbytes[what]/oldbytes[what]-100)
		printf("%-*s %12d %12d  %6s%%\n", len, what,
			oldbytes[what], newbytes[what], delta)
	}
}
' "$@"
