diff --git a/cmd/benchdiff/internal/benchdiff.go b/cmd/benchdiff/internal/benchdiff.go
index 13f4305..f9de83c 100644
--- a/cmd/benchdiff/internal/benchdiff.go
+++ b/cmd/benchdiff/internal/benchdiff.go
@@ -46,21 +46,6 @@ func fileExists(path string) bool {
return true
}
-func (c *Benchdiff) gitRunner() *gitRunner {
- return &gitRunner{
- gitExecutable: c.GitCmd,
- repoPath: c.Path,
- }
-}
-
-func (c *Benchdiff) baseRefRunner() *refRunner {
- gr := c.gitRunner()
- return &refRunner{
- ref: c.BaseRef,
- gitRunner: *gr,
- }
-}
-
func (c *Benchdiff) cacheKey() string {
var b []byte
b = append(b, []byte(c.BenchCmd)...)
@@ -70,6 +55,11 @@ func (c *Benchdiff) cacheKey() string {
}
func (c *Benchdiff) runBenchmarks() (result *runBenchmarksResults, err error) {
+ gitCmd := c.GitCmd
+ if gitCmd == "" {
+ gitCmd = "git"
+ }
+
result = new(runBenchmarksResults)
worktreeFilename := filepath.Join(c.ResultsDir, "benchdiff-worktree.out")
worktreeFile, err := os.Create(worktreeFilename)
@@ -91,19 +81,21 @@ func (c *Benchdiff) runBenchmarks() (result *runBenchmarksResults, err error) {
return nil, err
}
- headSHA, err := c.gitRunner().getRefSha("HEAD")
+ headSHA, err := runGitCmd(gitCmd, c.Path, "rev-parse", "HEAD")
if err != nil {
return nil, err
}
- baseSHA, err := c.gitRunner().getRefSha(c.BaseRef)
+ result.headSHA = strings.TrimSpace(string(headSHA))
+
+ baseSHA, err := runGitCmd(gitCmd, c.Path, "rev-parse", c.BaseRef)
if err != nil {
return nil, err
}
+ result.baseSHA = strings.TrimSpace(string(baseSHA))
baseFilename := fmt.Sprintf("benchdiff-%s-%s.out", baseSHA, c.cacheKey())
baseFilename = filepath.Join(c.ResultsDir, baseFilename)
- result.headSHA = headSHA
- result.baseSHA = baseSHA
+
result.baseOutputFile = baseFilename
result.worktreeOutputFile = worktreeFilename
@@ -126,7 +118,7 @@ func (c *Benchdiff) runBenchmarks() (result *runBenchmarksResults, err error) {
baseCmd.Stdout = baseFile
var baseCmdErr error
- err = c.baseRefRunner().run(func() {
+ err = runAtGitRef(gitCmd, c.Path, c.BaseRef, func() {
baseCmdErr = baseCmd.Run()
})
if err != nil {
diff --git a/cmd/benchdiff/internal/benchdiff_test.go b/cmd/benchdiff/internal/benchdiff_test.go
index ac80ef8..fa1246e 100644
--- a/cmd/benchdiff/internal/benchdiff_test.go
+++ b/cmd/benchdiff/internal/benchdiff_test.go
@@ -40,11 +40,12 @@ func testInDir(t *testing.T, dir string) {
})
}
-func TestBenchstat_Run(t *testing.T) {
+func TestBenchdiff_Run(t *testing.T) {
dir := tmpDir(t)
setupTestRepo(t, dir)
testInDir(t, dir)
differ := Benchdiff{
+ GitCmd: "git",
BenchCmd: "go",
BenchArgs: "test -bench . -benchmem -count 10 -benchtime 10x .",
ResultsDir: "./tmp",
diff --git a/cmd/benchdiff/internal/gitrunner.go b/cmd/benchdiff/internal/gitrunner.go
index 2b054fb..9bd4981 100644
--- a/cmd/benchdiff/internal/gitrunner.go
+++ b/cmd/benchdiff/internal/gitrunner.go
@@ -7,28 +7,10 @@ import (
"path/filepath"
)
-type gitRunner struct {
- repoPath string
- gitExecutable string
-}
-
-func (r *gitRunner) getRefSha(ref string) (string, error) {
- b, err := r.run("rev-parse", ref)
- if err != nil {
- return "", err
- }
- b = bytes.TrimSpace(b)
- return string(b), nil
-}
-
-func (r *gitRunner) run(args ...string) ([]byte, error) {
- executable := "git"
- if r.gitExecutable != "" {
- executable = r.gitExecutable
- }
- cmd := exec.Command(executable, args...) //nolint:gosec // this is fine
+func runGitCmd(gitCmd, repoPath string, args ...string) ([]byte, error) {
+ cmd := exec.Command(gitCmd, args...) //nolint:gosec // this is fine
var err error
- cmd.Dir, err = filepath.Abs(r.repoPath)
+ cmd.Dir, err = filepath.Abs(repoPath)
if err != nil {
return nil, err
}
@@ -37,43 +19,39 @@ func (r *gitRunner) run(args ...string) ([]byte, error) {
if exitErr, ok := err.(*exec.ExitError); ok {
err = fmt.Errorf("error running git command: %s", string(exitErr.Stderr))
}
+ b = bytes.TrimSpace(b)
return b, err
}
-type refRunner struct {
- gitRunner gitRunner
- ref string
-}
-
-func (r *refRunner) stashAndReset() (revert func() error, err error) {
+func stashAndReset(gitCmd, repoPath string) (revert func() error, err error) {
revert = func() error {
return nil
}
- stash, err := r.gitRunner.run("stash", "create", "--quiet")
+ stash, err := runGitCmd(gitCmd, repoPath, "stash", "create", "--quiet")
if err != nil {
return nil, err
}
stash = bytes.TrimSpace(stash)
if len(stash) > 0 {
revert = func() error {
- _, revertErr := r.gitRunner.run("stash", "apply", "--quiet", string(stash))
+ _, revertErr := runGitCmd(gitCmd, repoPath, "stash", "apply", "--quiet", string(stash))
return revertErr
}
}
- _, err = r.gitRunner.run("reset", "--hard", "--quiet")
+ _, err = runGitCmd(gitCmd, repoPath, "reset", "--hard", "--quiet")
if err != nil {
return nil, err
}
return revert, nil
}
-func (r *refRunner) run(fn func()) error {
- origRef, err := r.gitRunner.run("rev-parse", "--abbrev-ref", "HEAD")
+func runAtGitRef(gitCmd, repoPath, ref string, fn func()) error {
+ origRef, err := runGitCmd(gitCmd, repoPath, "rev-parse", "--abbrev-ref", "HEAD")
if err != nil {
return err
}
origRef = bytes.TrimSpace(origRef)
- unstash, err := r.stashAndReset()
+ unstash, err := stashAndReset(gitCmd, repoPath)
if err != nil {
return err
}
@@ -83,12 +61,12 @@ func (r *refRunner) run(fn func()) error {
panic(unstashErr)
}
}()
- _, err = r.gitRunner.run("checkout", "--quiet", r.ref)
+ _, err = runGitCmd(gitCmd, repoPath, "checkout", "--quiet", ref)
if err != nil {
return err
}
defer func() {
- _, cerr := r.gitRunner.run("checkout", "--quiet", string(origRef))
+ _, cerr := runGitCmd(gitCmd, repoPath, "checkout", "--quiet", string(origRef))
if cerr != nil {
if exitErr, ok := cerr.(*exec.ExitError); ok {
fmt.Println(string(exitErr.Stderr))
diff --git a/cmd/benchdiff/internal/gitrunner_test.go b/cmd/benchdiff/internal/gitrunner_test.go
index 079145c..42374fb 100644
--- a/cmd/benchdiff/internal/gitrunner_test.go
+++ b/cmd/benchdiff/internal/gitrunner_test.go
@@ -8,7 +8,7 @@ import (
"github.com/stretchr/testify/require"
)
-func Test_refRunner_run(t *testing.T) {
+func Test_runAtGitRef(t *testing.T) {
dir := tmpDir(t)
fooPath := filepath.Join(dir, "foo")
err := ioutil.WriteFile(fooPath, []byte("OG content"), 0o600)
@@ -30,13 +30,7 @@ func Test_refRunner_run(t *testing.T) {
require.NoError(t, err)
require.Equal(t, "OG content", string(got))
}
- runner := &refRunner{
- ref: "HEAD",
- gitRunner: gitRunner{
- repoPath: dir,
- },
- }
- err = runner.run(fn)
+ err = runAtGitRef("git", dir, "HEAD", fn)
require.NoError(t, err)
got, err := ioutil.ReadFile(fooPath)
require.NoError(t, err)
diff --git a/cmd/benchdiff/internal/testutil_test.go b/cmd/benchdiff/internal/testutil_test.go
index da30deb..2298efd 100644
--- a/cmd/benchdiff/internal/testutil_test.go
+++ b/cmd/benchdiff/internal/testutil_test.go
@@ -29,21 +29,22 @@ func tmpDir(t *testing.T) string {
return tmpdir
}
-func mustSetEnv(t *testing.T, key, value string) {
+func mustSetEnv(t *testing.T, env map[string]string) {
t.Helper()
- assert.NoError(t, os.Setenv(key, value))
+ for k, v := range env {
+ assert.NoError(t, os.Setenv(k, v))
+ }
}
func mustGit(t *testing.T, repoPath string, args ...string) []byte {
t.Helper()
- mustSetEnv(t, "GIT_AUTHOR_NAME", "author")
- mustSetEnv(t, "GIT_AUTHOR_EMAIL", "author@localhost")
- mustSetEnv(t, "GIT_COMMITTER_NAME", "committer")
- mustSetEnv(t, "GIT_COMMITTER_EMAIL", "committer@localhost")
- runner := &gitRunner{
- repoPath: repoPath,
- }
- got, err := runner.run(args...)
+ mustSetEnv(t, map[string]string{
+ "GIT_AUTHOR_NAME": "author",
+ "GIT_AUTHOR_EMAIL": "author@localhost",
+ "GIT_COMMITTER_NAME": "committer",
+ "GIT_COMMITTER_EMAIL": "committer@localhost",
+ })
+ got, err := runGitCmd("git", repoPath, args...)
assert.NoErrorf(t, err, "error running git:\noutput: %v", string(got))
return got
}
diff --git a/go.sum b/go.sum
index 4419d43..6f8d534 100644
--- a/go.sum
+++ b/go.sum
@@ -33,6 +33,7 @@ golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAG
golang.org/x/perf v0.0.0-20201207232921-bdcc6220ee90 h1:P+M61+mQKVHzooHFlNUTNBfj+TqHiQOGgx2kKL7mHbA=
golang.org/x/perf v0.0.0-20201207232921-bdcc6220ee90/go.mod h1:KRSrLY7jerMEa0Ih7gBheQ3FYDiSx6liMnniX1o3j2g=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/api v0.0.0-20170206182103-3d017632ea10/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
diff --git a/pkg/benchstatter/benchstat.go b/pkg/benchstatter/benchstat.go
index a808ccf..c6f1aec 100644
--- a/pkg/benchstatter/benchstat.go
+++ b/pkg/benchstatter/benchstat.go
@@ -147,8 +147,12 @@ func HTMLFormatter(opts *HTMLFormatterOptions) OutputFormatter {
}
var buf bytes.Buffer
benchstat.FormatHTML(&buf, tables)
+ _, err := w.Write(buf.Bytes())
+ if err != nil {
+ return err
+ }
if footer != "" {
- _, err := w.Write([]byte(footer))
+ _, err = w.Write([]byte(footer))
if err != nil {
return err
}
diff --git a/pkg/benchstatter/benchstat_test.go b/pkg/benchstatter/benchstat_test.go
index a4e4ef5..a0b3842 100644
--- a/pkg/benchstatter/benchstat_test.go
+++ b/pkg/benchstatter/benchstat_test.go
@@ -2,30 +2,151 @@ package benchstatter
import (
"bytes"
- "path/filepath"
+ "io/ioutil"
+ "os"
"testing"
"github.com/stretchr/testify/require"
+ "golang.org/x/perf/benchstat"
)
func TestBenchstat_Run(t *testing.T) {
- worktreeFile := filepath.FromSlash("./testdata/outputs/benchdiff-worktree.out")
- baseFile := filepath.FromSlash("./testdata/outputs/benchdiff-1.out")
- var buf bytes.Buffer
- bs := &Benchstat{}
- collection, err := bs.Run(worktreeFile, baseFile)
+ pwd, err := os.Getwd()
require.NoError(t, err)
- err = bs.OutputTables(&buf, collection.Tables())
- require.NoError(t, err)
-
- want := `name old time/op new time/op delta
-DoNothing-8 1.31ms ±13% 10.89ms ± 7% +728.87% (p=0.000 n=10+10)
-
-name old alloc/op new alloc/op delta
-DoNothing-8 32.2B ± 2% 11.4B ± 5% -64.48% (p=0.000 n=9+9)
-
-name old allocs/op new allocs/op delta
-DoNothing-8 0.00 0.00 ~ (all equal)
-`
- require.Equal(t, want, buf.String())
+ require.NoError(t, os.Chdir("testdata"))
+ t.Cleanup(func() {
+ t.Helper()
+ require.NoError(t, os.Chdir(pwd))
+ })
+ for _, td := range []struct {
+ golden string
+ base string
+ head string
+ b *Benchstat
+ }{
+ {
+ golden: "example",
+ base: "exampleold.txt",
+ head: "examplenew.txt",
+ b: new(Benchstat),
+ },
+ {
+ golden: "examplehtml",
+ base: "exampleold.txt",
+ head: "examplenew.txt",
+ b: &Benchstat{
+ OutputFormatter: HTMLFormatter(nil),
+ },
+ },
+ {
+ golden: "examplecsv",
+ base: "exampleold.txt",
+ head: "examplenew.txt",
+ b: &Benchstat{
+ OutputFormatter: CSVFormatter(nil),
+ },
+ },
+ {
+ golden: "oldnew",
+ base: "old.txt",
+ head: "new.txt",
+ b: new(Benchstat),
+ },
+ {
+ golden: "oldnewgeo",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ AddGeoMean: true,
+ },
+ },
+ {
+ golden: "new4",
+ base: "new.txt",
+ head: "slashslash4.txt",
+ b: new(Benchstat),
+ },
+ {
+ golden: "oldnewhtml",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ OutputFormatter: HTMLFormatter(nil),
+ },
+ },
+ {
+ golden: "oldnewcsv",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ OutputFormatter: CSVFormatter(nil),
+ },
+ },
+ {
+ golden: "oldnewttest",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ DeltaTest: benchstat.TTest,
+ },
+ },
+ {
+ golden: "packages",
+ base: "packagesold.txt",
+ head: "packagesnew.txt",
+ b: &Benchstat{
+ SplitBy: []string{"pkg", "goos", "goarch"},
+ },
+ },
+ {
+ golden: "units",
+ base: "units-old.txt",
+ head: "units-new.txt",
+ b: new(Benchstat),
+ },
+ {
+ golden: "zero",
+ base: "zero-old.txt",
+ head: "zero-new.txt",
+ b: &Benchstat{
+ DeltaTest: benchstat.NoDeltaTest,
+ },
+ },
+ {
+ golden: "namesort",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ Order: benchstat.ByName,
+ },
+ },
+ {
+ golden: "deltasort",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ Order: benchstat.ByDelta,
+ },
+ },
+ {
+ golden: "rdeltasort",
+ base: "old.txt",
+ head: "new.txt",
+ b: &Benchstat{
+ Order: benchstat.ByDelta,
+ ReverseOrder: true,
+ },
+ },
+ } {
+ t.Run(td.golden, func(t *testing.T) {
+ result, err := td.b.Run(td.base, td.head)
+ require.NoError(t, err)
+ var buf bytes.Buffer
+ err = td.b.OutputTables(&buf, result.Tables())
+ require.NoError(t, err)
+ want, err := ioutil.ReadFile(td.golden + ".golden")
+ require.NoError(t, err)
+ require.Equal(t, string(want), buf.String())
+ })
+ }
}
diff --git a/pkg/benchstatter/testdata/deltasort.golden b/pkg/benchstatter/testdata/deltasort.golden
new file mode 100644
index 0000000..020c044
--- /dev/null
+++ b/pkg/benchstatter/testdata/deltasort.golden
@@ -0,0 +1,75 @@
+name old time/op new time/op delta
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.010 n=9+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.000 n=9+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.003 n=9+8)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.539 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.952 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.882 n=9+9)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.508 n=10+9)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% ~ (p=0.055 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.754 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.036 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.005 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.008 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+
+name old speed new speed delta
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.001 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.000 n=9+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.002 n=9+8)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.579 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% ~ (p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.780 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.842 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.497 n=10+9)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.739 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.005 n=10+10)
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.009 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
diff --git a/pkg/benchstatter/testdata/example.golden b/pkg/benchstatter/testdata/example.golden
new file mode 100644
index 0000000..f98bd9e
--- /dev/null
+++ b/pkg/benchstatter/testdata/example.golden
@@ -0,0 +1,7 @@
+name old time/op new time/op delta
+GobEncode 13.6ms ± 1% 11.8ms ± 1% -13.31% (p=0.016 n=4+5)
+JSONEncode 32.1ms ± 1% 31.8ms ± 1% ~ (p=0.286 n=4+5)
+
+name old speed new speed delta
+GobEncode 56.4MB/s ± 1% 65.1MB/s ± 1% +15.36% (p=0.016 n=4+5)
+JSONEncode 60.4MB/s ± 1% 61.1MB/s ± 2% ~ (p=0.286 n=4+5)
diff --git a/pkg/benchstatter/testdata/examplecsv.golden b/pkg/benchstatter/testdata/examplecsv.golden
new file mode 100644
index 0000000..3a758f2
--- /dev/null
+++ b/pkg/benchstatter/testdata/examplecsv.golden
@@ -0,0 +1,7 @@
+name,old time/op (ns/op),±,new time/op (ns/op),±,delta,±
+GobEncode,1.35991E+07,1%,1.17893E+07,1%,-13.31%,(p=0.016 n=4+5)
+JSONEncode,3.21143E+07,1%,3.17614E+07,1%,~,(p=0.286 n=4+5)
+
+name,old speed (MB/s),±,new speed (MB/s),±,delta,±
+GobEncode,5.64400E+01,1%,6.51080E+01,1%,+15.36%,(p=0.016 n=4+5)
+JSONEncode,6.04275E+01,1%,6.11020E+01,2%,~,(p=0.286 n=4+5)
diff --git a/pkg/benchstatter/testdata/examplehtml.golden b/pkg/benchstatter/testdata/examplehtml.golden
new file mode 100644
index 0000000..501dd57
--- /dev/null
+++ b/pkg/benchstatter/testdata/examplehtml.golden
@@ -0,0 +1,38 @@
+
+
+
+
+Performance Result Comparison
+
+
+
+
+
+ | exampleold.txt | examplenew.txt
+
+
+ |
+ | time/op | delta
+ |
|---|
| GobEncode | 13.6ms ± 1% | 11.8ms ± 1% | −13.31% | (p=0.016 n=4+5)
+ |
| JSONEncode | 32.1ms ± 1% | 31.8ms ± 1% | ~ | (p=0.286 n=4+5)
+ |
|
+ |
+
+
+ | speed | delta
+ |
|---|
| GobEncode | 56.4MB/s ± 1% | 65.1MB/s ± 1% | +15.36% | (p=0.016 n=4+5)
+ |
| JSONEncode | 60.4MB/s ± 1% | 61.1MB/s ± 2% | ~ | (p=0.286 n=4+5)
+ |
|
+ |
+
+
+
+
diff --git a/pkg/benchstatter/testdata/examplenew.txt b/pkg/benchstatter/testdata/examplenew.txt
new file mode 100644
index 0000000..9463228
--- /dev/null
+++ b/pkg/benchstatter/testdata/examplenew.txt
@@ -0,0 +1,10 @@
+BenchmarkGobEncode 100 11773189 ns/op 65.19 MB/s
+BenchmarkJSONEncode 50 32036529 ns/op 60.57 MB/s
+BenchmarkGobEncode 100 11942588 ns/op 64.27 MB/s
+BenchmarkJSONEncode 50 32156552 ns/op 60.34 MB/s
+BenchmarkGobEncode 100 11786159 ns/op 65.12 MB/s
+BenchmarkJSONEncode 50 31288355 ns/op 62.02 MB/s
+BenchmarkGobEncode 100 11628583 ns/op 66.00 MB/s
+BenchmarkJSONEncode 50 31559706 ns/op 61.49 MB/s
+BenchmarkGobEncode 100 11815924 ns/op 64.96 MB/s
+BenchmarkJSONEncode 50 31765634 ns/op 61.09 MB/s
diff --git a/pkg/benchstatter/testdata/exampleold.txt b/pkg/benchstatter/testdata/exampleold.txt
new file mode 100644
index 0000000..9ec3f51
--- /dev/null
+++ b/pkg/benchstatter/testdata/exampleold.txt
@@ -0,0 +1,8 @@
+BenchmarkGobEncode 100 13552735 ns/op 56.63 MB/s
+BenchmarkJSONEncode 50 32395067 ns/op 59.90 MB/s
+BenchmarkGobEncode 100 13553943 ns/op 56.63 MB/s
+BenchmarkJSONEncode 50 32334214 ns/op 60.01 MB/s
+BenchmarkGobEncode 100 13606356 ns/op 56.41 MB/s
+BenchmarkJSONEncode 50 31992891 ns/op 60.65 MB/s
+BenchmarkGobEncode 100 13683198 ns/op 56.09 MB/s
+BenchmarkJSONEncode 50 31735022 ns/op 61.15 MB/s
diff --git a/pkg/benchstatter/testdata/namesort.golden b/pkg/benchstatter/testdata/namesort.golden
new file mode 100644
index 0000000..2dea70b
--- /dev/null
+++ b/pkg/benchstatter/testdata/namesort.golden
@@ -0,0 +1,75 @@
+name old time/op new time/op delta
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.003 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.882 n=9+9)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.002 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.036 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.952 n=10+9)
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.008 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.539 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.508 n=10+9)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.010 n=9+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% ~ (p=0.055 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.754 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.143 n=10+10)
+
+name old speed new speed delta
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.002 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.842 n=9+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.002 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% ~ (p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.780 n=10+9)
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.009 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.579 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.001 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.497 n=10+9)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.739 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.143 n=10+10)
diff --git a/pkg/benchstatter/testdata/new.txt b/pkg/benchstatter/testdata/new.txt
new file mode 100644
index 0000000..b45c622
--- /dev/null
+++ b/pkg/benchstatter/testdata/new.txt
@@ -0,0 +1,367 @@
+pkg: hash/crc32
+goarch: amd64
+goos: darwin
+note: hw acceleration enabled
+
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 43.6 ns/op 343.87 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 45.4 ns/op 330.50 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 43.4 ns/op 345.50 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 45.3 ns/op 331.23 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 43.9 ns/op 341.73 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 46.0 ns/op 326.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 45.1 ns/op 332.54 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 43.8 ns/op 342.12 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 43.8 ns/op 342.14 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 44.9 ns/op 333.84 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 43.8 ns/op 342.08 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.0 ns/op 340.68 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 45.0 ns/op 333.41 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.1 ns/op 340.41 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 43.7 ns/op 343.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 43.7 ns/op 342.96 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.9 ns/op 333.71 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 46.3 ns/op 323.68 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.9 ns/op 333.82 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.6 ns/op 336.33 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 43.9 ns/op 912.06 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.3 ns/op 945.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.7 ns/op 937.51 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 43.5 ns/op 919.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 44.9 ns/op 890.35 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.6 ns/op 938.20 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.3 ns/op 968.78 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.2 ns/op 970.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.3 ns/op 968.06 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.3 ns/op 968.27 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.3 ns/op 968.46 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.5 ns/op 941.20 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 43.2 ns/op 926.72 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.1 ns/op 949.91 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.9 ns/op 953.96 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.9 ns/op 954.23 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.5 ns/op 964.12 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.9 ns/op 932.70 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.7 ns/op 959.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.4 ns/op 966.36 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 2000000 56.1 ns/op 9128.24 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 2000000 56.2 ns/op 9107.94 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 3000000 56.1 ns/op 9129.45 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 3000000 56.5 ns/op 9064.49 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 3000000 58.1 ns/op 8819.84 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 3000000 59.0 ns/op 8675.61 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 2000000 55.9 ns/op 9157.53 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 3000000 57.0 ns/op 8976.22 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 2000000 58.7 ns/op 8724.66 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 2000000 57.6 ns/op 8887.48 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 2000000 58.3 ns/op 8782.52 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 57.6 ns/op 8882.44 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 2000000 57.0 ns/op 8980.50 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 56.4 ns/op 9071.81 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 56.0 ns/op 9135.04 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 2000000 58.8 ns/op 8705.97 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 2000000 56.2 ns/op 9115.68 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 57.3 ns/op 8941.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 56.3 ns/op 9090.66 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 3000000 57.8 ns/op 8854.75 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 92.6 ns/op 11058.32 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 93.8 ns/op 10913.47 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 93.5 ns/op 10953.07 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 95.0 ns/op 10778.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 94.8 ns/op 10799.14 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 95.3 ns/op 10741.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 92.6 ns/op 11055.29 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 1000000 100 ns/op 10189.63 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 2000000 95.3 ns/op 10747.01 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 1000000 102 ns/op 9978.90 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 1000000 103 ns/op 9907.74 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 92.8 ns/op 11036.21 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 92.8 ns/op 11031.01 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 1000000 102 ns/op 10006.87 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 93.1 ns/op 11000.89 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 92.8 ns/op 11029.36 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 95.3 ns/op 10743.40 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 93.6 ns/op 10941.47 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 93.3 ns/op 10979.13 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 2000000 92.6 ns/op 11053.13 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 302 ns/op 13561.37 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 294 ns/op 13906.19 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 298 ns/op 13734.81 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 296 ns/op 13826.62 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 301 ns/op 13598.75 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 299 ns/op 13676.26 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 299 ns/op 13686.88 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 289 ns/op 14143.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 296 ns/op 13824.99 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 500000 298 ns/op 13716.11 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 295 ns/op 13878.73 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 302 ns/op 13531.91 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 295 ns/op 13868.51 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 293 ns/op 13944.64 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 300 ns/op 13620.51 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 296 ns/op 13820.66 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 305 ns/op 13418.41 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 293 ns/op 13960.90 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 303 ns/op 13506.47 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 500000 309 ns/op 13218.83 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2149 ns/op 15241.57 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 50000 2230 ns/op 14693.09 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2183 ns/op 15005.52 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2115 ns/op 15486.09 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2227 ns/op 14708.97 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 50000 2140 ns/op 15308.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2157 ns/op 15188.25 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 50000 2133 ns/op 15359.48 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2117 ns/op 15475.06 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 100000 2129 ns/op 15385.26 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2233 ns/op 14673.10 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2244 ns/op 14596.46 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 50000 2154 ns/op 15211.73 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2156 ns/op 15196.79 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 50000 2159 ns/op 15175.66 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2151 ns/op 15228.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2169 ns/op 15105.80 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2206 ns/op 14850.25 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 100000 2145 ns/op 15271.77 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 50000 2166 ns/op 15126.92 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.1 ns/op 932.96 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.4 ns/op 912.82 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.2 ns/op 924.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.1 ns/op 934.22 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.2 ns/op 924.90 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.6 ns/op 904.66 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.5 ns/op 910.72 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 17.6 ns/op 853.00 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.4 ns/op 915.21 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.2 ns/op 923.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.2 ns/op 871.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.5 ns/op 854.97 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.3 ns/op 864.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 16.9 ns/op 885.36 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.4 ns/op 862.94 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 16.9 ns/op 887.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.0 ns/op 879.90 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.7 ns/op 847.32 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.6 ns/op 854.26 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.4 ns/op 864.10 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.5 ns/op 2279.37 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.1 ns/op 2334.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.9 ns/op 2235.38 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.1 ns/op 2338.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.2 ns/op 2325.21 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.8 ns/op 2251.24 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.8 ns/op 2242.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 18.2 ns/op 2199.30 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.4 ns/op 2305.18 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.3 ns/op 2315.62 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.5 ns/op 2055.96 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.7 ns/op 2034.99 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.3 ns/op 2068.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.8 ns/op 2021.43 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.4 ns/op 2060.79 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.3 ns/op 2076.79 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.1 ns/op 2091.18 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.0 ns/op 2100.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.5 ns/op 2049.71 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.3 ns/op 2074.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.7 ns/op 12891.27 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.1 ns/op 12777.24 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 41.7 ns/op 12266.52 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.8 ns/op 12866.81 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.8 ns/op 12862.14 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.8 ns/op 12537.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.3 ns/op 13022.34 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.9 ns/op 12817.64 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.8 ns/op 12543.27 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.4 ns/op 12993.64 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.7 ns/op 12276.08 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.0 ns/op 12199.95 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.2 ns/op 12121.96 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.9 ns/op 12215.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 43.2 ns/op 11854.68 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.1 ns/op 12165.99 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.5 ns/op 12328.95 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.9 ns/op 12206.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.6 ns/op 12306.14 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.6 ns/op 12022.39 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.4 ns/op 15646.46 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.9 ns/op 15531.97 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.4 ns/op 15422.12 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.7 ns/op 15358.30 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 72.1 ns/op 14207.76 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.3 ns/op 15455.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.2 ns/op 15479.94 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 68.6 ns/op 14926.33 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.3 ns/op 15436.78 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.1 ns/op 15481.91 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 68.6 ns/op 14928.29 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 67.2 ns/op 15241.88 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 68.3 ns/op 14985.73 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 68.5 ns/op 14958.31 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 69.2 ns/op 14806.15 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 68.4 ns/op 14977.84 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 69.1 ns/op 14822.32 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 67.5 ns/op 15171.65 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 70.7 ns/op 14489.26 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 69.4 ns/op 14744.72 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 157 ns/op 25978.03 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26173.33 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 160 ns/op 25471.67 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26190.72 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 164 ns/op 24861.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 157 ns/op 26018.79 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26101.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 163 ns/op 24990.34 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 162 ns/op 25138.27 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 157 ns/op 25972.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 164 ns/op 24908.40 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 160 ns/op 25529.63 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 167 ns/op 24412.21 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 162 ns/op 25206.52 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 158 ns/op 25827.66 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 160 ns/op 25519.93 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 163 ns/op 25090.11 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 159 ns/op 25657.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 160 ns/op 25576.18 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 163 ns/op 25007.68 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1233 ns/op 26561.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1223 ns/op 26786.22 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1193 ns/op 27451.16 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1288 ns/op 25436.18 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1212 ns/op 27022.56 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1245 ns/op 26314.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1208 ns/op 27105.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1200 ns/op 27296.77 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1226 ns/op 26714.57 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 200000 1189 ns/op 27542.78 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1235 ns/op 26530.39 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1193 ns/op 27444.08 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1272 ns/op 25752.85 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1210 ns/op 27080.94 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1207 ns/op 27142.02 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1245 ns/op 26305.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1226 ns/op 26710.70 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1223 ns/op 26787.03 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1217 ns/op 26921.93 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1180 ns/op 27746.71 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.6 ns/op 421.93 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.2 ns/op 425.84 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.1 ns/op 415.35 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.2 ns/op 426.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.6 ns/op 420.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.6 ns/op 410.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.1 ns/op 427.35 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.8 ns/op 419.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.6 ns/op 421.31 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 35.2 ns/op 425.93 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.1 ns/op 427.06 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.7 ns/op 420.07 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 3000000 35.2 ns/op 425.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.4 ns/op 423.84 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.4 ns/op 423.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 37.4 ns/op 400.57 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.7 ns/op 419.68 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.6 ns/op 421.03 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.5 ns/op 422.80 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 36.0 ns/op 417.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 89.8 ns/op 445.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 89.1 ns/op 448.86 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.6 ns/op 456.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 86.7 ns/op 461.44 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 86.6 ns/op 462.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 88.0 ns/op 454.58 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.2 ns/op 458.73 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.5 ns/op 457.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 86.4 ns/op 462.92 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.6 ns/op 456.63 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.2 ns/op 458.58 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.0 ns/op 459.82 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 89.1 ns/op 449.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 86.5 ns/op 462.62 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 88.8 ns/op 450.43 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.1 ns/op 459.03 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.8 ns/op 455.54 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.5 ns/op 457.36 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 90.9 ns/op 440.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 88.4 ns/op 452.59 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1100 ns/op 465.26 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1072 ns/op 477.31 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1075 ns/op 475.90 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1056 ns/op 484.71 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1113 ns/op 459.68 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1054 ns/op 485.69 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1066 ns/op 480.13 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1074 ns/op 476.36 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1057 ns/op 483.93 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1092 ns/op 468.52 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1074 ns/op 476.50 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1100 ns/op 465.08 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1106 ns/op 462.87 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1226 ns/op 417.43 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1189 ns/op 430.31 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 100000 1176 ns/op 435.29 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1235 ns/op 414.39 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1213 ns/op 422.03 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1210 ns/op 422.92 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1137 ns/op 450.03 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2259 ns/op 453.12 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2322 ns/op 441.00 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2350 ns/op 435.62 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2355 ns/op 434.74 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 50000 2291 ns/op 446.86 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2343 ns/op 436.93 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2416 ns/op 423.68 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2410 ns/op 424.86 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2256 ns/op 453.73 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2405 ns/op 425.75 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 50000 2472 ns/op 414.20 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2433 ns/op 420.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 50000 2390 ns/op 428.34 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2368 ns/op 432.28 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2294 ns/op 446.37 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2334 ns/op 438.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2298 ns/op 445.50 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2374 ns/op 431.17 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2354 ns/op 434.95 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2284 ns/op 448.24 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8799 ns/op 465.49 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9346 ns/op 438.26 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9129 ns/op 448.65 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8710 ns/op 470.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8699 ns/op 470.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8704 ns/op 470.58 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9563 ns/op 428.28 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9173 ns/op 446.50 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9286 ns/op 441.08 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8623 ns/op 475.00 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8410 ns/op 487.02 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8847 ns/op 462.96 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8430 ns/op 485.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8505 ns/op 481.58 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8426 ns/op 486.11 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 10107 ns/op 405.24 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9125 ns/op 448.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9740 ns/op 420.50 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9564 ns/op 428.23 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9309 ns/op 439.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 69825 ns/op 469.28 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 74409 ns/op 440.37 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 75041 ns/op 436.67 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 72268 ns/op 453.42 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 73333 ns/op 446.84 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 70923 ns/op 462.02 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 70095 ns/op 467.48 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 76125 ns/op 430.45 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 73908 ns/op 443.36 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 73078 ns/op 448.39 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 76238 ns/op 429.81 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 74141 ns/op 441.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 71910 ns/op 455.67 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 76684 ns/op 427.31 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 75951 ns/op 431.43 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 73299 ns/op 447.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 76288 ns/op 429.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 73453 ns/op 446.10 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 72748 ns/op 450.43 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 72097 ns/op 454.50 MB/s
+PASS
+ok hash/crc32 72.655s
diff --git a/pkg/benchstatter/testdata/new4.golden b/pkg/benchstatter/testdata/new4.golden
new file mode 100644
index 0000000..a1eb317
--- /dev/null
+++ b/pkg/benchstatter/testdata/new4.golden
@@ -0,0 +1,27 @@
+name old time/op new time/op delta
+CRC32/poly=IEEE/size=40/align=0-8 42.5ns ± 6% 42.1ns ± 3% ~ (p=0.642 n=10+10)
+CRC32/poly=IEEE/size=40/align=1-8 42.0ns ± 3% 41.7ns ± 5% ~ (p=0.148 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 298ns ± 1% 1682ns ± 2% +464.22% (p=0.000 n=9+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 299ns ± 3% 1690ns ± 4% +464.96% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.5ns ± 4% 18.6ns ±11% +5.99% (p=0.049 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.4ns ± 2% 19.6ns ± 2% ~ (p=0.072 n=10+8)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 159ns ± 3% 161ns ± 8% ~ (p=0.421 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 162ns ± 3% 170ns ± 8% +4.95% (p=0.019 n=10+10)
+CRC32/poly=Koopman/size=40/align=0-8 87.6ns ± 2% 93.8ns ±13% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 88.0ns ± 3% 86.9ns ± 3% -1.33% (p=0.050 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.00µs ± 6% 9.08µs ± 8% ~ (p=0.631 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 9.05µs ±12% 9.46µs ± 8% ~ (p=0.123 n=10+10)
+
+name old speed new speed delta
+CRC32/poly=IEEE/size=40/align=0-8 942MB/s ± 5% 951MB/s ± 3% ~ (p=0.684 n=10+10)
+CRC32/poly=IEEE/size=40/align=1-8 952MB/s ± 3% 960MB/s ± 4% ~ (p=0.143 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 13.7GB/s ± 1% 2.4GB/s ± 2% -82.26% (p=0.000 n=9+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 13.7GB/s ± 3% 2.4GB/s ± 4% -82.28% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.28GB/s ± 4% 2.16GB/s ±11% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.06GB/s ± 2% 2.04GB/s ± 2% ~ (p=0.055 n=10+8)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.7GB/s ± 3% 25.4GB/s ± 7% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 25.3GB/s ± 3% 24.1GB/s ± 8% -4.55% (p=0.015 n=10+10)
+CRC32/poly=Koopman/size=40/align=0-8 456MB/s ± 2% 428MB/s ±12% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 455MB/s ± 3% 461MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 455MB/s ± 6% 452MB/s ± 8% ~ (p=0.631 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 455MB/s ±11% 434MB/s ± 9% ~ (p=0.123 n=10+10)
diff --git a/pkg/benchstatter/testdata/old.txt b/pkg/benchstatter/testdata/old.txt
new file mode 100644
index 0000000..cd1b57e
--- /dev/null
+++ b/pkg/benchstatter/testdata/old.txt
@@ -0,0 +1,367 @@
+pkg: hash/crc32
+goarch: amd64
+goos: darwin
+note: hw acceleration disabled
+
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 44.6 ns/op 336.59 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 47.3 ns/op 317.29 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 44.6 ns/op 336.14 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 46.3 ns/op 323.80 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 50.7 ns/op 295.90 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 45.8 ns/op 327.41 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 46.8 ns/op 320.56 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 44.3 ns/op 338.48 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 47.7 ns/op 314.52 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=0-8 3000000 50.6 ns/op 296.42 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 46.8 ns/op 320.44 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.0 ns/op 340.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.6 ns/op 336.05 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.1 ns/op 340.42 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.5 ns/op 336.82 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.0 ns/op 340.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.2 ns/op 339.16 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 45.1 ns/op 332.85 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 44.0 ns/op 340.71 MB/s
+BenchmarkCRC32/poly=IEEE/size=15/align=1-8 3000000 45.8 ns/op 327.44 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.0 ns/op 975.84 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 43.0 ns/op 930.22 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 40.9 ns/op 978.39 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.3 ns/op 944.76 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.0 ns/op 976.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.0 ns/op 975.15 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.3 ns/op 967.88 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 40.8 ns/op 979.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.1 ns/op 974.19 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.2 ns/op 969.78 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.9 ns/op 931.47 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.9 ns/op 977.34 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.4 ns/op 965.44 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.2 ns/op 971.79 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.1 ns/op 972.53 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.8 ns/op 979.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.9 ns/op 978.70 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.9 ns/op 978.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.5 ns/op 964.07 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.0 ns/op 974.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 249 ns/op 2051.08 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 248 ns/op 2058.43 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 232 ns/op 2202.80 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 238 ns/op 2145.40 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 234 ns/op 2181.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 237 ns/op 2151.78 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 241 ns/op 2117.97 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 231 ns/op 2213.97 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 231 ns/op 2207.52 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=0-8 500000 239 ns/op 2139.64 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 238 ns/op 2143.57 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 232 ns/op 2205.23 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 230 ns/op 2220.72 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 233 ns/op 2192.30 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 231 ns/op 2215.20 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 238 ns/op 2143.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 242 ns/op 2108.05 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 241 ns/op 2117.57 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 230 ns/op 2220.54 MB/s
+BenchmarkCRC32/poly=IEEE/size=512/align=1-8 500000 240 ns/op 2125.08 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 435 ns/op 2352.05 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 461 ns/op 2218.18 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 446 ns/op 2291.09 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 448 ns/op 2284.64 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 448 ns/op 2282.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 464 ns/op 2206.86 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 456 ns/op 2242.96 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 457 ns/op 2239.06 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 461 ns/op 2219.82 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=0-8 300000 449 ns/op 2278.55 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 436 ns/op 2343.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 452 ns/op 2263.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 443 ns/op 2310.35 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 446 ns/op 2292.48 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 436 ns/op 2346.76 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 445 ns/op 2296.07 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 451 ns/op 2268.08 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 450 ns/op 2274.49 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 441 ns/op 2320.41 MB/s
+BenchmarkCRC32/poly=IEEE/size=1kB/align=1-8 300000 436 ns/op 2346.69 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1698 ns/op 2411.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1667 ns/op 2456.00 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1694 ns/op 2416.70 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1654 ns/op 2476.16 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1704 ns/op 2402.42 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1876 ns/op 2182.35 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1790 ns/op 2287.20 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1812 ns/op 2259.59 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1828 ns/op 2239.82 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1677 ns/op 2441.05 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1679 ns/op 2438.77 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1705 ns/op 2401.47 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1665 ns/op 2459.27 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1678 ns/op 2440.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1819 ns/op 2251.46 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1871 ns/op 2188.25 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1878 ns/op 2180.70 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1782 ns/op 2297.30 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1797 ns/op 2278.59 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1769 ns/op 2315.22 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 14964 ns/op 2189.65 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 14612 ns/op 2242.49 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 14258 ns/op 2298.15 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 15641 ns/op 2094.94 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 14653 ns/op 2236.19 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 15101 ns/op 2169.79 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 15065 ns/op 2174.97 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 15801 ns/op 2073.78 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 15459 ns/op 2119.55 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=0-8 10000 13975 ns/op 2344.74 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 13567 ns/op 2415.11 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 14515 ns/op 2257.37 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 14510 ns/op 2258.21 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 15133 ns/op 2165.26 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 14383 ns/op 2278.22 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 14983 ns/op 2186.90 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 13519 ns/op 2423.74 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 13154 ns/op 2491.10 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 13594 ns/op 2410.43 MB/s
+BenchmarkCRC32/poly=IEEE/size=32kB/align=1-8 10000 14530 ns/op 2255.12 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 18.0 ns/op 834.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.4 ns/op 913.19 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.6 ns/op 903.85 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.3 ns/op 920.52 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.0 ns/op 937.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.6 ns/op 903.12 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.0 ns/op 934.62 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.6 ns/op 903.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.1 ns/op 930.77 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=0-8 10000000 16.8 ns/op 895.10 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.0 ns/op 884.78 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.5 ns/op 855.00 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.1 ns/op 874.74 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.5 ns/op 857.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.2 ns/op 869.69 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.0 ns/op 883.09 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.1 ns/op 877.29 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.2 ns/op 869.59 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 18.6 ns/op 807.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=15/align=1-8 10000000 17.4 ns/op 861.10 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.3 ns/op 2317.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.6 ns/op 2273.98 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.5 ns/op 2280.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.2 ns/op 2322.88 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.7 ns/op 2257.80 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.5 ns/op 2290.51 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.2 ns/op 2319.50 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.2 ns/op 2329.20 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.4 ns/op 2300.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.7 ns/op 2262.94 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 20.3 ns/op 1966.20 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.3 ns/op 2077.39 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.1 ns/op 2094.95 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.8 ns/op 2022.06 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.9 ns/op 2009.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.6 ns/op 2037.74 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 20.1 ns/op 1987.93 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.5 ns/op 2050.18 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.8 ns/op 2024.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.7 ns/op 2031.46 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.4 ns/op 12662.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.7 ns/op 12889.39 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.3 ns/op 12706.28 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.0 ns/op 12814.70 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.1 ns/op 12758.84 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.7 ns/op 12894.29 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.8 ns/op 12535.17 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.8 ns/op 12542.40 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 40.2 ns/op 12750.46 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=0-8 3000000 39.7 ns/op 12882.94 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.9 ns/op 12212.50 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.9 ns/op 12206.11 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 43.1 ns/op 11869.61 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.8 ns/op 11949.04 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 43.3 ns/op 11823.64 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 42.0 ns/op 12196.38 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.5 ns/op 12325.33 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.8 ns/op 12236.96 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.5 ns/op 12326.79 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=512/align=1-8 3000000 41.6 ns/op 12298.60 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.4 ns/op 15659.97 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.5 ns/op 15623.63 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.2 ns/op 15711.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.5 ns/op 15640.74 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.3 ns/op 15687.32 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 66.0 ns/op 15509.02 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.3 ns/op 15684.59 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 70.2 ns/op 14584.88 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.7 ns/op 15582.29 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=0-8 2000000 65.6 ns/op 15619.90 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 67.6 ns/op 15140.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 68.1 ns/op 15039.19 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 67.5 ns/op 15180.69 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 67.6 ns/op 15146.80 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 73.1 ns/op 14015.81 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 70.7 ns/op 14493.63 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 74.1 ns/op 13820.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 71.8 ns/op 14256.30 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 70.9 ns/op 14451.65 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=1kB/align=1-8 2000000 69.5 ns/op 14727.15 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 162 ns/op 25174.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 162 ns/op 25194.50 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 167 ns/op 24422.65 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 160 ns/op 25541.37 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 161 ns/op 25354.03 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 171 ns/op 23871.09 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 162 ns/op 25224.84 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 158 ns/op 25798.19 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 158 ns/op 25815.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 167 ns/op 24465.11 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 168 ns/op 24282.26 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 177 ns/op 23065.76 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 176 ns/op 23245.80 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 170 ns/op 24015.77 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 173 ns/op 23579.34 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 174 ns/op 23531.14 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 169 ns/op 24107.05 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 166 ns/op 24657.46 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 162 ns/op 25273.53 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 159 ns/op 25619.67 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1234 ns/op 26534.55 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1210 ns/op 27063.60 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1241 ns/op 26391.50 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1230 ns/op 26634.33 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1190 ns/op 27515.61 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1183 ns/op 27695.90 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1271 ns/op 25771.02 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1205 ns/op 27170.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1337 ns/op 24493.55 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=0-8 100000 1200 ns/op 27299.92 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1263 ns/op 25937.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1274 ns/op 25702.13 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1278 ns/op 25639.64 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1271 ns/op 25763.65 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1235 ns/op 26515.05 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1232 ns/op 26586.52 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1341 ns/op 24430.71 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1257 ns/op 26056.28 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1264 ns/op 25910.24 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=32kB/align=1-8 100000 1309 ns/op 25023.35 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.5 ns/op 410.82 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 37.3 ns/op 402.07 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.7 ns/op 408.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 34.8 ns/op 430.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 40.4 ns/op 371.74 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 38.6 ns/op 388.62 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.3 ns/op 413.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 34.0 ns/op 441.26 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 34.3 ns/op 437.06 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=0-8 5000000 36.2 ns/op 414.34 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 34.4 ns/op 435.65 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 37.0 ns/op 405.81 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.8 ns/op 419.55 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 36.5 ns/op 410.66 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 35.2 ns/op 425.85 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 34.4 ns/op 436.09 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 34.0 ns/op 441.70 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 33.9 ns/op 443.08 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 33.9 ns/op 443.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=15/align=1-8 5000000 36.4 ns/op 412.65 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 89.7 ns/op 445.75 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 90.4 ns/op 442.39 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 94.9 ns/op 421.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.4 ns/op 457.45 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 89.3 ns/op 448.11 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 90.3 ns/op 443.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.9 ns/op 455.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 93.7 ns/op 426.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 100 ns/op 396.87 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 92.8 ns/op 430.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.9 ns/op 455.30 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 90.9 ns/op 439.90 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 93.5 ns/op 427.91 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 93.7 ns/op 426.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 95.0 ns/op 421.02 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 90.1 ns/op 443.95 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 95.3 ns/op 419.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 85.6 ns/op 467.20 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 86.9 ns/op 460.19 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 91.9 ns/op 435.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1118 ns/op 457.68 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1168 ns/op 438.12 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1132 ns/op 452.06 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1079 ns/op 474.47 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1079 ns/op 474.46 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1126 ns/op 454.69 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1132 ns/op 452.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 100000 1193 ns/op 429.16 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1124 ns/op 455.38 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=0-8 200000 1166 ns/op 438.87 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1096 ns/op 466.92 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1117 ns/op 458.09 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1200 ns/op 426.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1109 ns/op 461.41 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1155 ns/op 443.08 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1141 ns/op 448.59 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1136 ns/op 450.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1145 ns/op 446.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 200000 1085 ns/op 471.86 MB/s
+BenchmarkCRC32/poly=Koopman/size=512/align=1-8 100000 1084 ns/op 471.93 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2308 ns/op 443.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2480 ns/op 412.88 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2288 ns/op 447.44 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2371 ns/op 431.88 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2247 ns/op 455.55 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2211 ns/op 462.97 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2264 ns/op 452.17 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2231 ns/op 458.82 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2161 ns/op 473.71 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=0-8 100000 2109 ns/op 485.48 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2160 ns/op 473.90 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2103 ns/op 486.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2189 ns/op 467.75 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2159 ns/op 474.21 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2144 ns/op 477.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2169 ns/op 472.09 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2123 ns/op 482.20 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 50000 2150 ns/op 476.26 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2141 ns/op 478.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=1kB/align=1-8 100000 2238 ns/op 457.51 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8562 ns/op 478.35 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8584 ns/op 477.16 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9176 ns/op 446.36 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9096 ns/op 450.27 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9337 ns/op 438.67 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9545 ns/op 429.11 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9287 ns/op 441.04 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8963 ns/op 456.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8970 ns/op 456.61 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8795 ns/op 465.67 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9179 ns/op 446.20 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9026 ns/op 453.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8505 ns/op 481.60 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8396 ns/op 487.85 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9818 ns/op 417.17 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8652 ns/op 473.38 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8689 ns/op 471.36 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8345 ns/op 490.83 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9391 ns/op 436.13 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9401 ns/op 435.66 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 74664 ns/op 438.87 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 72859 ns/op 449.74 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 73403 ns/op 446.41 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 73646 ns/op 444.94 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 76501 ns/op 428.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 78648 ns/op 416.64 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 69550 ns/op 471.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 67848 ns/op 482.96 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 67984 ns/op 482.00 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=0-8 2000 69177 ns/op 473.68 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 70108 ns/op 467.39 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 67566 ns/op 484.98 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 71256 ns/op 459.86 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 69979 ns/op 468.25 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 69972 ns/op 468.30 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 68356 ns/op 479.37 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 69631 ns/op 470.59 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 70087 ns/op 467.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 75510 ns/op 433.95 MB/s
+BenchmarkCRC32/poly=Koopman/size=32kB/align=1-8 2000 76970 ns/op 425.72 MB/s
+PASS
+ok hash/crc32 68.427s
diff --git a/pkg/benchstatter/testdata/oldnew.golden b/pkg/benchstatter/testdata/oldnew.golden
new file mode 100644
index 0000000..c754683
--- /dev/null
+++ b/pkg/benchstatter/testdata/oldnew.golden
@@ -0,0 +1,75 @@
+name old time/op new time/op delta
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.008 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.539 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.036 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.952 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.003 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.882 n=9+9)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.508 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% ~ (p=0.055 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.010 n=9+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.754 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+
+name old speed new speed delta
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.009 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.579 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.001 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% ~ (p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.780 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.002 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.842 n=9+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.497 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.739 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
diff --git a/pkg/benchstatter/testdata/oldnewcsv.golden b/pkg/benchstatter/testdata/oldnewcsv.golden
new file mode 100644
index 0000000..5d1dbbb
--- /dev/null
+++ b/pkg/benchstatter/testdata/oldnewcsv.golden
@@ -0,0 +1,75 @@
+name,old time/op (ns/op),±,new time/op (ns/op),±,delta,±
+CRC32/poly=IEEE/size=15/align=0-8,4.68700E+01,8%,4.45200E+01,3%,-5.01%,(p=0.008 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8,4.47100E+01,5%,4.45000E+01,4%,~,(p=0.539 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8,4.10375E+01,1%,4.25000E+01,6%,+3.56%,(p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8,4.10778E+01,1%,4.20400E+01,3%,+2.34%,(p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8,2.38000E+02,5%,5.71200E+01,3%,-76.00%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8,2.35500E+02,3%,5.71700E+01,3%,-75.72%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8,4.52500E+02,4%,9.41125E+01,2%,-79.20%,(p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8,4.43600E+02,2%,9.32875E+01,2%,-78.97%,(p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8,1.74000E+03,8%,2.98111E+02,1%,-82.87%,(p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8,1.76430E+03,6%,2.99100E+02,3%,-83.05%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8,1.49529E+04,7%,2.15800E+03,3%,-85.57%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8,1.41888E+04,7%,2.17830E+03,3%,-84.65%,(p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8,1.63778E+01,3%,1.63000E+01,2%,~,(p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8,1.72222E+01,2%,1.72900E+01,2%,~,(p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8,1.74300E+01,2%,1.75300E+01,4%,~,(p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8,1.97100E+01,3%,1.93900E+01,2%,-1.62%,(p=0.036 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8,4.01700E+01,2%,4.01300E+01,4%,~,(p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8,4.21400E+01,3%,4.19444E+01,2%,~,(p=0.952 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8,6.55000E+01,1%,6.61625E+01,1%,+1.01%,(p=0.003 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8,7.00900E+01,6%,6.84667E+01,2%,~,(p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8,1.62800E+02,5%,1.58800E+02,3%,-2.46%,(p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8,1.69400E+02,6%,1.61600E+02,3%,-4.60%,(p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8,1.21822E+03,4%,1.21433E+03,3%,~,(p=0.882 n=9+9)
+CRC32/poly=Castagnoli/size=32kB/align=1-8,1.26478E+03,3%,1.22080E+03,4%,-3.48%,(p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8,3.65100E+01,11%,3.56000E+01,3%,~,(p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8,3.51500E+01,5%,3.55111E+01,1%,~,(p=0.508 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8,9.16400E+01,9%,8.76500E+01,2%,-4.35%,(p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8,9.10800E+01,6%,8.80300E+01,3%,~,(p=0.055 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8,1.13170E+03,5%,1.07590E+03,3%,-4.93%,(p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8,1.12680E+03,6%,1.16660E+03,8%,~,(p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8,2.24333E+03,6%,2.34070E+03,4%,+4.34%,(p=0.010 n=9+10)
+CRC32/poly=Koopman/size=1kB/align=1-8,2.14867E+03,2%,2.36010E+03,5%,+9.84%,(p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8,9.03150E+03,6%,9.00320E+03,6%,~,(p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8,8.94020E+03,10%,9.04630E+03,12%,~,(p=0.754 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8,7.24280E+04,9%,7.29005E+04,4%,~,(p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8,6.96194E+04,3%,7.42809E+04,3%,+6.70%,(p=0.000 n=8+10)
+
+name,old speed (MB/s),±,new speed (MB/s),±,delta,±
+CRC32/poly=IEEE/size=15/align=0-8,3.20711E+02,8%,3.36950E+02,3%,+5.06%,(p=0.009 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8,3.35516E+02,4%,3.37066E+02,4%,~,(p=0.579 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8,9.74718E+02,1%,9.41823E+02,5%,-3.37%,(p=0.001 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8,9.73636E+02,1%,9.51759E+02,3%,-2.25%,(p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8,2.14703E+03,4%,8.96715E+03,3%,+317.65%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8,2.16913E+03,3%,8.95606E+03,3%,+312.89%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8,2.26152E+03,4%,1.08807E+04,2%,+381.12%,(p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8,2.30619E+03,2%,1.09768E+04,2%,+375.97%,(p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8,2.35732E+03,7%,1.37258E+04,1%,+482.26%,(p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8,2.32511E+03,6%,1.36770E+04,3%,+488.23%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8,2.19443E+03,7%,1.51852E+04,3%,+591.99%,(p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8,2.31415E+03,8%,1.50437E+04,3%,+550.07%,(p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8,9.15799E+02,2%,9.20433E+02,2%,~,(p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8,8.70312E+02,2%,8.67298E+02,2%,~,(p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8,2.29560E+03,2%,2.28265E+03,4%,~,(p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8,2.03023E+03,3%,2.06346E+03,2%,~,(p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8,1.27437E+04,2%,1.27578E+04,4%,~,(p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8,1.21445E+04,3%,1.22049E+04,1%,~,(p=0.780 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8,1.56355E+04,1%,1.54766E+04,1%,-1.02%,(p=0.002 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8,1.46273E+04,6%,1.49597E+04,2%,~,(p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8,2.50862E+04,5%,2.56897E+04,3%,~,(p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8,2.41378E+04,6%,2.52736E+04,3%,+4.71%,(p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8,2.68975E+04,4%,2.68232E+04,5%,~,(p=0.842 n=9+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8,2.59038E+04,3%,2.68422E+04,4%,+3.62%,(p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8,4.11932E+02,10%,4.21452E+02,3%,~,(p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8,4.27408E+02,5%,4.22362E+02,1%,~,(p=0.497 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8,4.36831E+02,9%,4.56472E+02,2%,+4.50%,(p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8,4.39731E+02,6%,4.54515E+02,3%,~,(p=0.052 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8,4.52693E+02,5%,4.75749E+02,3%,+5.09%,(p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8,4.54579E+02,6%,4.39685E+02,8%,~,(p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8,4.52443E+02,9%,4.37629E+02,4%,~,(p=0.052 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=1-8,4.76558E+02,2%,4.34042E+02,5%,-8.92%,(p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8,4.54022E+02,5%,4.55492E+02,6%,~,(p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8,4.59394E+02,9%,4.54627E+02,11%,~,(p=0.739 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8,4.53471E+02,8%,4.49828E+02,4%,~,(p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8,4.70784E+02,3%,4.41379E+02,3%,-6.25%,(p=0.000 n=8+10)
diff --git a/pkg/benchstatter/testdata/oldnewgeo.golden b/pkg/benchstatter/testdata/oldnewgeo.golden
new file mode 100644
index 0000000..c625f03
--- /dev/null
+++ b/pkg/benchstatter/testdata/oldnewgeo.golden
@@ -0,0 +1,77 @@
+name old time/op new time/op delta
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.008 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.539 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.000 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.036 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.952 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.003 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.882 n=9+9)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.508 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% ~ (p=0.055 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.010 n=9+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.754 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+[Geo mean] 345ns 238ns -30.99%
+
+name old speed new speed delta
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.009 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.579 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.001 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% ~ (p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.780 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.002 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.005 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.842 n=9+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.002 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.497 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.002 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.739 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
+[Geo mean] 1.71GB/s 2.48GB/s +44.88%
diff --git a/pkg/benchstatter/testdata/oldnewhtml.golden b/pkg/benchstatter/testdata/oldnewhtml.golden
new file mode 100644
index 0000000..84ed364
--- /dev/null
+++ b/pkg/benchstatter/testdata/oldnewhtml.golden
@@ -0,0 +1,106 @@
+
+
+
+
+Performance Result Comparison
+
+
+
+
+
+ | old.txt | new.txt
+
+
+ |
+ | time/op | delta
+ |
|---|
| CRC32/poly=IEEE/size=15/align=0-8 | 46.9ns ± 8% | 44.5ns ± 3% | −5.01% | (p=0.008 n=10+10)
+ |
| CRC32/poly=IEEE/size=15/align=1-8 | 44.7ns ± 5% | 44.5ns ± 4% | ~ | (p=0.539 n=10+10)
+ |
| CRC32/poly=IEEE/size=40/align=0-8 | 41.0ns ± 1% | 42.5ns ± 6% | +3.56% | (p=0.000 n=8+10)
+ |
| CRC32/poly=IEEE/size=40/align=1-8 | 41.1ns ± 1% | 42.0ns ± 3% | +2.34% | (p=0.000 n=9+10)
+ |
| CRC32/poly=IEEE/size=512/align=0-8 | 238ns ± 5% | 57ns ± 3% | −76.00% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=512/align=1-8 | 236ns ± 3% | 57ns ± 3% | −75.72% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=1kB/align=0-8 | 452ns ± 4% | 94ns ± 2% | −79.20% | (p=0.000 n=10+8)
+ |
| CRC32/poly=IEEE/size=1kB/align=1-8 | 444ns ± 2% | 93ns ± 2% | −78.97% | (p=0.000 n=10+8)
+ |
| CRC32/poly=IEEE/size=4kB/align=0-8 | 1.74µs ± 8% | 0.30µs ± 1% | −82.87% | (p=0.000 n=10+9)
+ |
| CRC32/poly=IEEE/size=4kB/align=1-8 | 1.76µs ± 6% | 0.30µs ± 3% | −83.05% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=32kB/align=0-8 | 15.0µs ± 7% | 2.2µs ± 3% | −85.57% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=32kB/align=1-8 | 14.2µs ± 7% | 2.2µs ± 3% | −84.65% | (p=0.000 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=15/align=0-8 | 16.4ns ± 3% | 16.3ns ± 2% | ~ | (p=0.615 n=9+9)
+ |
| CRC32/poly=Castagnoli/size=15/align=1-8 | 17.2ns ± 2% | 17.3ns ± 2% | ~ | (p=0.650 n=9+10)
+ |
| CRC32/poly=Castagnoli/size=40/align=0-8 | 17.4ns ± 2% | 17.5ns ± 4% | ~ | (p=0.694 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=40/align=1-8 | 19.7ns ± 3% | 19.4ns ± 2% | −1.62% | (p=0.036 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=512/align=0-8 | 40.2ns ± 2% | 40.1ns ± 4% | ~ | (p=0.614 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=512/align=1-8 | 42.1ns ± 3% | 41.9ns ± 2% | ~ | (p=0.952 n=10+9)
+ |
| CRC32/poly=Castagnoli/size=1kB/align=0-8 | 65.5ns ± 1% | 66.2ns ± 1% | +1.01% | (p=0.003 n=9+8)
+ |
| CRC32/poly=Castagnoli/size=1kB/align=1-8 | 70.1ns ± 6% | 68.5ns ± 2% | ~ | (p=0.190 n=10+9)
+ |
| CRC32/poly=Castagnoli/size=4kB/align=0-8 | 163ns ± 5% | 159ns ± 3% | −2.46% | (p=0.032 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=4kB/align=1-8 | 169ns ± 6% | 162ns ± 3% | −4.60% | (p=0.005 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=32kB/align=0-8 | 1.22µs ± 4% | 1.21µs ± 3% | ~ | (p=0.882 n=9+9)
+ |
| CRC32/poly=Castagnoli/size=32kB/align=1-8 | 1.26µs ± 3% | 1.22µs ± 4% | −3.48% | (p=0.002 n=9+10)
+ |
| CRC32/poly=Koopman/size=15/align=0-8 | 36.5ns ±11% | 35.6ns ± 3% | ~ | (p=0.216 n=10+10)
+ |
| CRC32/poly=Koopman/size=15/align=1-8 | 35.1ns ± 5% | 35.5ns ± 1% | ~ | (p=0.508 n=10+9)
+ |
| CRC32/poly=Koopman/size=40/align=0-8 | 91.6ns ± 9% | 87.6ns ± 2% | −4.35% | (p=0.002 n=10+10)
+ |
| CRC32/poly=Koopman/size=40/align=1-8 | 91.1ns ± 6% | 88.0ns ± 3% | ~ | (p=0.055 n=10+10)
+ |
| CRC32/poly=Koopman/size=512/align=0-8 | 1.13µs ± 5% | 1.08µs ± 3% | −4.93% | (p=0.000 n=10+10)
+ |
| CRC32/poly=Koopman/size=512/align=1-8 | 1.13µs ± 6% | 1.17µs ± 8% | ~ | (p=0.143 n=10+10)
+ |
| CRC32/poly=Koopman/size=1kB/align=0-8 | 2.24µs ± 6% | 2.34µs ± 4% | +4.34% | (p=0.010 n=9+10)
+ |
| CRC32/poly=Koopman/size=1kB/align=1-8 | 2.15µs ± 2% | 2.36µs ± 5% | +9.84% | (p=0.000 n=9+10)
+ |
| CRC32/poly=Koopman/size=4kB/align=0-8 | 9.03µs ± 6% | 9.00µs ± 6% | ~ | (p=0.971 n=10+10)
+ |
| CRC32/poly=Koopman/size=4kB/align=1-8 | 8.94µs ±10% | 9.05µs ±12% | ~ | (p=0.754 n=10+10)
+ |
| CRC32/poly=Koopman/size=32kB/align=0-8 | 72.4µs ± 9% | 72.9µs ± 4% | ~ | (p=0.684 n=10+10)
+ |
| CRC32/poly=Koopman/size=32kB/align=1-8 | 69.6µs ± 3% | 74.3µs ± 3% | +6.70% | (p=0.000 n=8+10)
+ |
|
+ |
+
+
+ | speed | delta
+ |
|---|
| CRC32/poly=IEEE/size=15/align=0-8 | 321MB/s ± 8% | 337MB/s ± 3% | +5.06% | (p=0.009 n=10+10)
+ |
| CRC32/poly=IEEE/size=15/align=1-8 | 336MB/s ± 4% | 337MB/s ± 4% | ~ | (p=0.579 n=10+10)
+ |
| CRC32/poly=IEEE/size=40/align=0-8 | 975MB/s ± 1% | 942MB/s ± 5% | −3.37% | (p=0.001 n=8+10)
+ |
| CRC32/poly=IEEE/size=40/align=1-8 | 974MB/s ± 1% | 952MB/s ± 3% | −2.25% | (p=0.000 n=9+10)
+ |
| CRC32/poly=IEEE/size=512/align=0-8 | 2.15GB/s ± 4% | 8.97GB/s ± 3% | +317.65% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=512/align=1-8 | 2.17GB/s ± 3% | 8.96GB/s ± 3% | +312.89% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=1kB/align=0-8 | 2.26GB/s ± 4% | 10.88GB/s ± 2% | +381.12% | (p=0.000 n=10+8)
+ |
| CRC32/poly=IEEE/size=1kB/align=1-8 | 2.31GB/s ± 2% | 10.98GB/s ± 2% | +375.97% | (p=0.000 n=10+8)
+ |
| CRC32/poly=IEEE/size=4kB/align=0-8 | 2.36GB/s ± 7% | 13.73GB/s ± 1% | +482.26% | (p=0.000 n=10+9)
+ |
| CRC32/poly=IEEE/size=4kB/align=1-8 | 2.33GB/s ± 6% | 13.68GB/s ± 3% | +488.23% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=32kB/align=0-8 | 2.19GB/s ± 7% | 15.19GB/s ± 3% | +591.99% | (p=0.000 n=10+10)
+ |
| CRC32/poly=IEEE/size=32kB/align=1-8 | 2.31GB/s ± 8% | 15.04GB/s ± 3% | +550.07% | (p=0.000 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=15/align=0-8 | 916MB/s ± 2% | 920MB/s ± 2% | ~ | (p=0.489 n=9+9)
+ |
| CRC32/poly=Castagnoli/size=15/align=1-8 | 870MB/s ± 2% | 867MB/s ± 2% | ~ | (p=0.661 n=9+10)
+ |
| CRC32/poly=Castagnoli/size=40/align=0-8 | 2.30GB/s ± 2% | 2.28GB/s ± 4% | ~ | (p=0.684 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=40/align=1-8 | 2.03GB/s ± 3% | 2.06GB/s ± 2% | ~ | (p=0.063 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=512/align=0-8 | 12.7GB/s ± 2% | 12.8GB/s ± 4% | ~ | (p=0.529 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=512/align=1-8 | 12.1GB/s ± 3% | 12.2GB/s ± 1% | ~ | (p=0.780 n=10+9)
+ |
| CRC32/poly=Castagnoli/size=1kB/align=0-8 | 15.6GB/s ± 1% | 15.5GB/s ± 1% | −1.02% | (p=0.002 n=9+8)
+ |
| CRC32/poly=Castagnoli/size=1kB/align=1-8 | 14.6GB/s ± 6% | 15.0GB/s ± 2% | ~ | (p=0.211 n=10+9)
+ |
| CRC32/poly=Castagnoli/size=4kB/align=0-8 | 25.1GB/s ± 5% | 25.7GB/s ± 3% | ~ | (p=0.052 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=4kB/align=1-8 | 24.1GB/s ± 6% | 25.3GB/s ± 3% | +4.71% | (p=0.005 n=10+10)
+ |
| CRC32/poly=Castagnoli/size=32kB/align=0-8 | 26.9GB/s ± 4% | 26.8GB/s ± 5% | ~ | (p=0.842 n=9+10)
+ |
| CRC32/poly=Castagnoli/size=32kB/align=1-8 | 25.9GB/s ± 3% | 26.8GB/s ± 4% | +3.62% | (p=0.002 n=9+10)
+ |
| CRC32/poly=Koopman/size=15/align=0-8 | 412MB/s ±10% | 421MB/s ± 3% | ~ | (p=0.218 n=10+10)
+ |
| CRC32/poly=Koopman/size=15/align=1-8 | 427MB/s ± 5% | 422MB/s ± 1% | ~ | (p=0.497 n=10+9)
+ |
| CRC32/poly=Koopman/size=40/align=0-8 | 437MB/s ± 9% | 456MB/s ± 2% | +4.50% | (p=0.002 n=10+10)
+ |
| CRC32/poly=Koopman/size=40/align=1-8 | 440MB/s ± 6% | 455MB/s ± 3% | ~ | (p=0.052 n=10+10)
+ |
| CRC32/poly=Koopman/size=512/align=0-8 | 453MB/s ± 5% | 476MB/s ± 3% | +5.09% | (p=0.000 n=10+10)
+ |
| CRC32/poly=Koopman/size=512/align=1-8 | 455MB/s ± 6% | 440MB/s ± 8% | ~ | (p=0.143 n=10+10)
+ |
| CRC32/poly=Koopman/size=1kB/align=0-8 | 452MB/s ± 9% | 438MB/s ± 4% | ~ | (p=0.052 n=10+10)
+ |
| CRC32/poly=Koopman/size=1kB/align=1-8 | 477MB/s ± 2% | 434MB/s ± 5% | −8.92% | (p=0.000 n=9+10)
+ |
| CRC32/poly=Koopman/size=4kB/align=0-8 | 454MB/s ± 5% | 455MB/s ± 6% | ~ | (p=0.971 n=10+10)
+ |
| CRC32/poly=Koopman/size=4kB/align=1-8 | 459MB/s ± 9% | 455MB/s ±11% | ~ | (p=0.739 n=10+10)
+ |
| CRC32/poly=Koopman/size=32kB/align=0-8 | 453MB/s ± 8% | 450MB/s ± 4% | ~ | (p=0.684 n=10+10)
+ |
| CRC32/poly=Koopman/size=32kB/align=1-8 | 471MB/s ± 3% | 441MB/s ± 3% | −6.25% | (p=0.000 n=8+10)
+ |
|
+ |
+
+
+
+
diff --git a/pkg/benchstatter/testdata/oldnewttest.golden b/pkg/benchstatter/testdata/oldnewttest.golden
new file mode 100644
index 0000000..9ff4fb3
--- /dev/null
+++ b/pkg/benchstatter/testdata/oldnewttest.golden
@@ -0,0 +1,75 @@
+name old time/op new time/op delta
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.011 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.600 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.006 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.001 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.511 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.553 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.472 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.033 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.885 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.430 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.001 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.069 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.029 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.735 n=9+9)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.001 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.183 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.374 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.009 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% -3.35% (p=0.022 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.001 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.086 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.008 n=9+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.849 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.678 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.730 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+
+name old speed new speed delta
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.010 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.600 n=10+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.005 n=8+10)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.001 n=9+10)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.469 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.599 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.469 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% +1.64% (p=0.035 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.872 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.391 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.001 n=9+8)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.071 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% +2.41% (p=0.033 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.797 n=9+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.001 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.203 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.306 n=10+9)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.008 n=10+10)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% +3.36% (p=0.024 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.001 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.096 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.065 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.844 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.708 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.669 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
diff --git a/pkg/benchstatter/testdata/outputs/benchdiff-1.out b/pkg/benchstatter/testdata/outputs/benchdiff-1.out
deleted file mode 100644
index f42516e..0000000
--- a/pkg/benchstatter/testdata/outputs/benchdiff-1.out
+++ /dev/null
@@ -1,15 +0,0 @@
-goos: darwin
-goarch: amd64
-pkg: github.com/willabides/benchdiff/tmp/747290359
-BenchmarkDoNothing-8 10 11164321 ns/op 12 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10853508 ns/op 14 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 11656783 ns/op 11 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10700432 ns/op 12 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10427720 ns/op 12 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10712753 ns/op 11 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10662319 ns/op 11 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10506228 ns/op 12 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 11475983 ns/op 11 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 10771303 ns/op 11 B/op 0 allocs/op
-PASS
-ok github.com/willabides/benchdiff/tmp/747290359 1.223s
diff --git a/pkg/benchstatter/testdata/outputs/benchdiff-worktree.out b/pkg/benchstatter/testdata/outputs/benchdiff-worktree.out
deleted file mode 100644
index cce481c..0000000
--- a/pkg/benchstatter/testdata/outputs/benchdiff-worktree.out
+++ /dev/null
@@ -1,15 +0,0 @@
-goos: darwin
-goarch: amd64
-pkg: github.com/willabides/benchdiff/tmp/747290359
-BenchmarkDoNothing-8 10 1146337 ns/op 37 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1249409 ns/op 33 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1382591 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1383354 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1272821 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1338119 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1252743 ns/op 33 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1335703 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1402933 ns/op 32 B/op 0 allocs/op
-BenchmarkDoNothing-8 10 1378127 ns/op 32 B/op 0 allocs/op
-PASS
-ok github.com/willabides/benchdiff/tmp/747290359 0.171s
diff --git a/pkg/benchstatter/testdata/packages.golden b/pkg/benchstatter/testdata/packages.golden
new file mode 100644
index 0000000..05cf0c7
--- /dev/null
+++ b/pkg/benchstatter/testdata/packages.golden
@@ -0,0 +1,11 @@
+name old time/op new time/op delta
+pkg:encoding/gob
+GobEncode 13.6ms ± 1% 11.8ms ± 1% -13.31% (p=0.016 n=4+5)
+pkg:encoding/json
+JSONEncode 32.1ms ± 1% 31.8ms ± 1% ~ (p=0.286 n=4+5)
+
+name old speed new speed delta
+pkg:encoding/gob
+GobEncode 56.4MB/s ± 1% 65.1MB/s ± 1% +15.36% (p=0.016 n=4+5)
+pkg:encoding/json
+JSONEncode 60.4MB/s ± 1% 61.1MB/s ± 2% ~ (p=0.286 n=4+5)
diff --git a/pkg/benchstatter/testdata/packagesnew.txt b/pkg/benchstatter/testdata/packagesnew.txt
new file mode 100644
index 0000000..7732820
--- /dev/null
+++ b/pkg/benchstatter/testdata/packagesnew.txt
@@ -0,0 +1,12 @@
+pkg: encoding/gob
+BenchmarkGobEncode 100 11773189 ns/op 65.19 MB/s
+BenchmarkGobEncode 100 11942588 ns/op 64.27 MB/s
+BenchmarkGobEncode 100 11786159 ns/op 65.12 MB/s
+BenchmarkGobEncode 100 11628583 ns/op 66.00 MB/s
+BenchmarkGobEncode 100 11815924 ns/op 64.96 MB/s
+pkg: encoding/json
+BenchmarkJSONEncode 50 32036529 ns/op 60.57 MB/s
+BenchmarkJSONEncode 50 32156552 ns/op 60.34 MB/s
+BenchmarkJSONEncode 50 31288355 ns/op 62.02 MB/s
+BenchmarkJSONEncode 50 31559706 ns/op 61.49 MB/s
+BenchmarkJSONEncode 50 31765634 ns/op 61.09 MB/s
diff --git a/pkg/benchstatter/testdata/packagesold.txt b/pkg/benchstatter/testdata/packagesold.txt
new file mode 100644
index 0000000..add4b7a
--- /dev/null
+++ b/pkg/benchstatter/testdata/packagesold.txt
@@ -0,0 +1,10 @@
+pkg: encoding/gob
+BenchmarkGobEncode 100 13552735 ns/op 56.63 MB/s
+BenchmarkGobEncode 100 13553943 ns/op 56.63 MB/s
+BenchmarkGobEncode 100 13606356 ns/op 56.41 MB/s
+BenchmarkGobEncode 100 13683198 ns/op 56.09 MB/s
+pkg: encoding/json
+BenchmarkJSONEncode 50 32395067 ns/op 59.90 MB/s
+BenchmarkJSONEncode 50 32334214 ns/op 60.01 MB/s
+BenchmarkJSONEncode 50 31992891 ns/op 60.65 MB/s
+BenchmarkJSONEncode 50 31735022 ns/op 61.15 MB/s
diff --git a/pkg/benchstatter/testdata/rdeltasort.golden b/pkg/benchstatter/testdata/rdeltasort.golden
new file mode 100644
index 0000000..d74cce4
--- /dev/null
+++ b/pkg/benchstatter/testdata/rdeltasort.golden
@@ -0,0 +1,75 @@
+name old time/op new time/op delta
+CRC32/poly=IEEE/size=32kB/align=0-8 15.0µs ± 7% 2.2µs ± 3% -85.57% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 14.2µs ± 7% 2.2µs ± 3% -84.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=1-8 1.76µs ± 6% 0.30µs ± 3% -83.05% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 1.74µs ± 8% 0.30µs ± 1% -82.87% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=1kB/align=0-8 452ns ± 4% 94ns ± 2% -79.20% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 444ns ± 2% 93ns ± 2% -78.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=512/align=0-8 238ns ± 5% 57ns ± 3% -76.00% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 236ns ± 3% 57ns ± 3% -75.72% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=15/align=0-8 46.9ns ± 8% 44.5ns ± 3% -5.01% (p=0.008 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 1.13µs ± 5% 1.08µs ± 3% -4.93% (p=0.000 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 169ns ± 6% 162ns ± 3% -4.60% (p=0.005 n=10+10)
+CRC32/poly=Koopman/size=40/align=0-8 91.6ns ± 9% 87.6ns ± 2% -4.35% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 1.26µs ± 3% 1.22µs ± 4% -3.48% (p=0.002 n=9+10)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 163ns ± 5% 159ns ± 3% -2.46% (p=0.032 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 19.7ns ± 3% 19.4ns ± 2% -1.62% (p=0.036 n=10+10)
+CRC32/poly=IEEE/size=15/align=1-8 44.7ns ± 5% 44.5ns ± 4% ~ (p=0.539 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 16.4ns ± 3% 16.3ns ± 2% ~ (p=0.615 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 17.2ns ± 2% 17.3ns ± 2% ~ (p=0.650 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 17.4ns ± 2% 17.5ns ± 4% ~ (p=0.694 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 40.2ns ± 2% 40.1ns ± 4% ~ (p=0.614 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 42.1ns ± 3% 41.9ns ± 2% ~ (p=0.952 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 70.1ns ± 6% 68.5ns ± 2% ~ (p=0.190 n=10+9)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 1.22µs ± 4% 1.21µs ± 3% ~ (p=0.882 n=9+9)
+CRC32/poly=Koopman/size=15/align=0-8 36.5ns ±11% 35.6ns ± 3% ~ (p=0.216 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 35.1ns ± 5% 35.5ns ± 1% ~ (p=0.508 n=10+9)
+CRC32/poly=Koopman/size=40/align=1-8 91.1ns ± 6% 88.0ns ± 3% ~ (p=0.055 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 1.13µs ± 6% 1.17µs ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 9.03µs ± 6% 9.00µs ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 8.94µs ±10% 9.05µs ±12% ~ (p=0.754 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 72.4µs ± 9% 72.9µs ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 65.5ns ± 1% 66.2ns ± 1% +1.01% (p=0.003 n=9+8)
+CRC32/poly=IEEE/size=40/align=1-8 41.1ns ± 1% 42.0ns ± 3% +2.34% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=40/align=0-8 41.0ns ± 1% 42.5ns ± 6% +3.56% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 2.24µs ± 6% 2.34µs ± 4% +4.34% (p=0.010 n=9+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 69.6µs ± 3% 74.3µs ± 3% +6.70% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 2.15µs ± 2% 2.36µs ± 5% +9.84% (p=0.000 n=9+10)
+
+name old speed new speed delta
+CRC32/poly=IEEE/size=32kB/align=0-8 2.19GB/s ± 7% 15.19GB/s ± 3% +591.99% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=32kB/align=1-8 2.31GB/s ± 8% 15.04GB/s ± 3% +550.07% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=1-8 2.33GB/s ± 6% 13.68GB/s ± 3% +488.23% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=4kB/align=0-8 2.36GB/s ± 7% 13.73GB/s ± 1% +482.26% (p=0.000 n=10+9)
+CRC32/poly=IEEE/size=1kB/align=0-8 2.26GB/s ± 4% 10.88GB/s ± 2% +381.12% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=1kB/align=1-8 2.31GB/s ± 2% 10.98GB/s ± 2% +375.97% (p=0.000 n=10+8)
+CRC32/poly=IEEE/size=512/align=0-8 2.15GB/s ± 4% 8.97GB/s ± 3% +317.65% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=512/align=1-8 2.17GB/s ± 3% 8.96GB/s ± 3% +312.89% (p=0.000 n=10+10)
+CRC32/poly=Koopman/size=512/align=0-8 453MB/s ± 5% 476MB/s ± 3% +5.09% (p=0.000 n=10+10)
+CRC32/poly=IEEE/size=15/align=0-8 321MB/s ± 8% 337MB/s ± 3% +5.06% (p=0.009 n=10+10)
+CRC32/poly=Castagnoli/size=4kB/align=1-8 24.1GB/s ± 6% 25.3GB/s ± 3% +4.71% (p=0.005 n=10+10)
+CRC32/poly=Koopman/size=40/align=0-8 437MB/s ± 9% 456MB/s ± 2% +4.50% (p=0.002 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=1-8 25.9GB/s ± 3% 26.8GB/s ± 4% +3.62% (p=0.002 n=9+10)
+CRC32/poly=IEEE/size=15/align=1-8 336MB/s ± 4% 337MB/s ± 4% ~ (p=0.579 n=10+10)
+CRC32/poly=Castagnoli/size=15/align=0-8 916MB/s ± 2% 920MB/s ± 2% ~ (p=0.489 n=9+9)
+CRC32/poly=Castagnoli/size=15/align=1-8 870MB/s ± 2% 867MB/s ± 2% ~ (p=0.661 n=9+10)
+CRC32/poly=Castagnoli/size=40/align=0-8 2.30GB/s ± 2% 2.28GB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=40/align=1-8 2.03GB/s ± 3% 2.06GB/s ± 2% ~ (p=0.063 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=0-8 12.7GB/s ± 2% 12.8GB/s ± 4% ~ (p=0.529 n=10+10)
+CRC32/poly=Castagnoli/size=512/align=1-8 12.1GB/s ± 3% 12.2GB/s ± 1% ~ (p=0.780 n=10+9)
+CRC32/poly=Castagnoli/size=1kB/align=1-8 14.6GB/s ± 6% 15.0GB/s ± 2% ~ (p=0.211 n=10+9)
+CRC32/poly=Castagnoli/size=4kB/align=0-8 25.1GB/s ± 5% 25.7GB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Castagnoli/size=32kB/align=0-8 26.9GB/s ± 4% 26.8GB/s ± 5% ~ (p=0.842 n=9+10)
+CRC32/poly=Koopman/size=15/align=0-8 412MB/s ±10% 421MB/s ± 3% ~ (p=0.218 n=10+10)
+CRC32/poly=Koopman/size=15/align=1-8 427MB/s ± 5% 422MB/s ± 1% ~ (p=0.497 n=10+9)
+CRC32/poly=Koopman/size=40/align=1-8 440MB/s ± 6% 455MB/s ± 3% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=512/align=1-8 455MB/s ± 6% 440MB/s ± 8% ~ (p=0.143 n=10+10)
+CRC32/poly=Koopman/size=1kB/align=0-8 452MB/s ± 9% 438MB/s ± 4% ~ (p=0.052 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=0-8 454MB/s ± 5% 455MB/s ± 6% ~ (p=0.971 n=10+10)
+CRC32/poly=Koopman/size=4kB/align=1-8 459MB/s ± 9% 455MB/s ±11% ~ (p=0.739 n=10+10)
+CRC32/poly=Koopman/size=32kB/align=0-8 453MB/s ± 8% 450MB/s ± 4% ~ (p=0.684 n=10+10)
+CRC32/poly=Castagnoli/size=1kB/align=0-8 15.6GB/s ± 1% 15.5GB/s ± 1% -1.02% (p=0.002 n=9+8)
+CRC32/poly=IEEE/size=40/align=1-8 974MB/s ± 1% 952MB/s ± 3% -2.25% (p=0.000 n=9+10)
+CRC32/poly=IEEE/size=40/align=0-8 975MB/s ± 1% 942MB/s ± 5% -3.37% (p=0.001 n=8+10)
+CRC32/poly=Koopman/size=32kB/align=1-8 471MB/s ± 3% 441MB/s ± 3% -6.25% (p=0.000 n=8+10)
+CRC32/poly=Koopman/size=1kB/align=1-8 477MB/s ± 2% 434MB/s ± 5% -8.92% (p=0.000 n=9+10)
diff --git a/pkg/benchstatter/testdata/slashslash4.txt b/pkg/benchstatter/testdata/slashslash4.txt
new file mode 100644
index 0000000..509c0d1
--- /dev/null
+++ b/pkg/benchstatter/testdata/slashslash4.txt
@@ -0,0 +1,127 @@
+pkg: hash/crc32
+goarch: amd64
+goos: darwin
+note: hw acceleration disabled, -bench=//4
+
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 40.9 ns/op 978.88 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.8 ns/op 933.98 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 40.9 ns/op 978.23 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.4 ns/op 942.76 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.4 ns/op 967.26 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 41.6 ns/op 962.08 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.6 ns/op 939.29 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 43.5 ns/op 918.83 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.0 ns/op 951.27 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=0-8 3000000 42.7 ns/op 937.30 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.1 ns/op 973.19 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 43.6 ns/op 918.29 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.8 ns/op 934.58 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.0 ns/op 975.00 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.2 ns/op 970.18 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.8 ns/op 980.81 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 42.4 ns/op 942.44 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.4 ns/op 966.71 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 40.7 ns/op 982.65 MB/s
+BenchmarkCRC32/poly=IEEE/size=40/align=1-8 3000000 41.8 ns/op 955.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1807 ns/op 2266.51 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1668 ns/op 2454.61 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1718 ns/op 2383.22 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1675 ns/op 2445.28 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1682 ns/op 2434.60 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1673 ns/op 2448.24 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1672 ns/op 2449.03 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1693 ns/op 2419.16 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1658 ns/op 2469.45 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=0-8 100000 1699 ns/op 2410.39 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1699 ns/op 2409.64 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1677 ns/op 2441.13 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1671 ns/op 2450.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1666 ns/op 2457.51 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1757 ns/op 2330.39 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1666 ns/op 2457.84 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1716 ns/op 2386.93 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1662 ns/op 2464.20 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1703 ns/op 2404.35 MB/s
+BenchmarkCRC32/poly=IEEE/size=4kB/align=1-8 100000 1681 ns/op 2436.35 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.1 ns/op 2334.91 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.5 ns/op 2288.87 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.8 ns/op 2244.89 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 17.3 ns/op 2311.76 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 18.0 ns/op 2224.01 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 20.7 ns/op 1933.54 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 19.3 ns/op 2073.61 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 19.3 ns/op 2067.47 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 19.9 ns/op 2011.31 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=0-8 10000000 18.9 ns/op 2117.00 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.9 ns/op 2005.75 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.5 ns/op 2049.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.2 ns/op 2081.60 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 20.0 ns/op 1996.42 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.4 ns/op 2066.66 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.8 ns/op 2025.21 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.8 ns/op 2015.13 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 21.2 ns/op 1888.37 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 19.5 ns/op 2046.76 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=40/align=1-8 10000000 22.3 ns/op 1796.24 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 174 ns/op 23478.39 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 158 ns/op 25880.52 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 164 ns/op 24857.78 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26150.67 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26185.14 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 161 ns/op 25366.49 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 164 ns/op 24930.88 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 156 ns/op 26209.59 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 161 ns/op 25376.24 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=0-8 1000000 162 ns/op 25281.02 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 168 ns/op 24280.72 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 166 ns/op 24653.32 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 163 ns/op 24991.81 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 158 ns/op 25826.99 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 162 ns/op 25188.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 164 ns/op 24970.03 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 179 ns/op 22771.21 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 176 ns/op 23182.06 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 184 ns/op 22193.41 MB/s
+BenchmarkCRC32/poly=Castagnoli/size=4kB/align=1-8 1000000 176 ns/op 23191.10 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 1000000 106 ns/op 376.78 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 1000000 102 ns/op 391.07 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 99.7 ns/op 401.12 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 95.6 ns/op 418.47 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 93.3 ns/op 428.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 90.5 ns/op 441.87 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 92.1 ns/op 434.22 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 85.6 ns/op 467.07 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 87.6 ns/op 456.72 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=0-8 2000000 85.7 ns/op 466.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 85.6 ns/op 467.12 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 86.1 ns/op 464.59 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 85.5 ns/op 467.95 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 86.5 ns/op 462.44 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 89.8 ns/op 445.20 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 86.4 ns/op 463.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 85.8 ns/op 466.27 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.7 ns/op 456.34 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 88.0 ns/op 454.78 MB/s
+BenchmarkCRC32/poly=Koopman/size=40/align=1-8 2000000 87.2 ns/op 458.77 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8373 ns/op 489.18 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8397 ns/op 487.76 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9496 ns/op 431.31 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9426 ns/op 434.52 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9035 ns/op 453.33 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9295 ns/op 440.65 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9220 ns/op 444.22 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9539 ns/op 429.37 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 8401 ns/op 487.53 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=0-8 20000 9634 ns/op 425.14 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9591 ns/op 427.02 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9878 ns/op 414.64 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9630 ns/op 425.32 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9284 ns/op 441.18 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8676 ns/op 472.10 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 8844 ns/op 463.13 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9621 ns/op 425.72 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9364 ns/op 437.38 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9993 ns/op 409.85 MB/s
+BenchmarkCRC32/poly=Koopman/size=4kB/align=1-8 20000 9671 ns/op 423.50 MB/s
+PASS
+ok hash/crc32 25.585s
diff --git a/pkg/benchstatter/testdata/units-new.txt b/pkg/benchstatter/testdata/units-new.txt
new file mode 100644
index 0000000..397088d
--- /dev/null
+++ b/pkg/benchstatter/testdata/units-new.txt
@@ -0,0 +1,8 @@
+pkg: synthetic
+note: test benchstat printing of units
+
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14100000000000 user-ns/op 5 ns/GC 12 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14700000000000 user-ns/op 5 ns/GC 16 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14800000000000 user-ns/op 5 ns/GC 12 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14300000000000 user-ns/op 5 ns/GC 16 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14000000000000 user-ns/op 5 ns/GC 12 quick-bytes
diff --git a/pkg/benchstatter/testdata/units-old.txt b/pkg/benchstatter/testdata/units-old.txt
new file mode 100644
index 0000000..6e87b07
--- /dev/null
+++ b/pkg/benchstatter/testdata/units-old.txt
@@ -0,0 +1,8 @@
+pkg: synthetic
+note: test benchstat printing of units
+
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14400000000000 user-ns/op 5 ns/GC 12 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14500000000000 user-ns/op 5 ns/GC 16 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14600000000000 user-ns/op 5 ns/GC 12 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14200000000000 user-ns/op 5 ns/GC 16 quick-bytes
+BenchmarkTwoHourMarathon 1 7200000000000 ns/op 14300000000000 user-ns/op 5 ns/GC 12 quick-bytes
diff --git a/pkg/benchstatter/testdata/units.golden b/pkg/benchstatter/testdata/units.golden
new file mode 100644
index 0000000..3a5ca67
--- /dev/null
+++ b/pkg/benchstatter/testdata/units.golden
@@ -0,0 +1,11 @@
+name old time/op new time/op delta
+TwoHourMarathon 7200s ± 0% 7200s ± 0% ~ (all equal)
+
+name old user-time/op new user-time/op delta
+TwoHourMarathon 14400s ± 1% 14380s ± 3% ~ (p=0.881 n=5+5)
+
+name old time/GC new time/GC delta
+TwoHourMarathon 5.00ns ± 0% 5.00ns ± 0% ~ (all equal)
+
+name old quick-bytes new quick-bytes delta
+TwoHourMarathon 13.6B ±18% 13.6B ±18% ~ (p=1.000 n=5+5)
diff --git a/pkg/benchstatter/testdata/zero-new.txt b/pkg/benchstatter/testdata/zero-new.txt
new file mode 100644
index 0000000..d855b6b
--- /dev/null
+++ b/pkg/benchstatter/testdata/zero-new.txt
@@ -0,0 +1,4 @@
+pkg: synthetic
+note: test benchstat printing of zeros
+
+BenchmarkImperceptible 1 1234567890 a-bytes 171717171716 b-bytes 99999930 c-bytes
diff --git a/pkg/benchstatter/testdata/zero-old.txt b/pkg/benchstatter/testdata/zero-old.txt
new file mode 100644
index 0000000..9df0d06
--- /dev/null
+++ b/pkg/benchstatter/testdata/zero-old.txt
@@ -0,0 +1,4 @@
+pkg: synthetic
+note: test benchstat printing of zeros
+
+BenchmarkImperceptible 1 1234567890 a-bytes 171717171717 b-bytes 99999929 c-bytes
diff --git a/pkg/benchstatter/testdata/zero.golden b/pkg/benchstatter/testdata/zero.golden
new file mode 100644
index 0000000..7c6170f
--- /dev/null
+++ b/pkg/benchstatter/testdata/zero.golden
@@ -0,0 +1,8 @@
+name old a-bytes new a-bytes delta
+Imperceptible 1.23GB ± 0% 1.23GB ± 0% 0.00%
+
+name old b-bytes new b-bytes delta
+Imperceptible 172GB ± 0% 172GB ± 0% -0.00%
+
+name old c-bytes new c-bytes delta
+Imperceptible 100MB ± 0% 100MB ± 0% +0.00%