| #!/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 go test -test.run=NONE -test.bench=. > [old,new].txt' >&2 |
| echo 'Benchcmp compares the first and last for each benchmark.' >&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 |
| } else { |
| old[$1] = $3 |
| if($6 = "MB/s") |
| oldmb[$1] = $5 |
| } |
| } |
| |
| 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])) |
| } |
| } |
| ' "$@" |