Jump to content

Knapsack problem/Bounded/Go test

From Rosetta Code

Simple test and benchmark for Knapsack_problem/Bounded#Go.

package main

import (
	"reflect"
	"testing"
)

func TestSol(t *testing.T) {
	//v, w, s := choose(400, len(items)-1, make(map[key]*Solution))
	v, w, s := Chooser{Items: items}.Choose(400)
	if e := 1010; v != e {
		t.Errorf("got value %d, expected %d", v, e)
	}
	if e := 396; w != e {
		t.Errorf("got weight %d, expected %d", w, e)
	}
	exSol := []int{1, 1, 1, 0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0}
	if !reflect.DeepEqual(s, exSol) {
		t.Errorf("got s\t%v,\n\texpected\t%v", s, exSol)
	}
}

func BenchmarkSol(b *testing.B) {
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
		//choose(400, len(items)-1, make(map[key]*Solution))
		Chooser{Items: items}.Choose(400)
	}
}
Output:
% go test -bench=.
PASS
BenchmarkSol	    1000	   2266833 ns/op	 1587854 B/op	    3013 allocs/op
ok  	rosetta/kp_bounded	2.507s

If you're unfamiliar with using benchmarks within go tests:

  • Put the above into a *_test.go file in the same directory as the *.go file from Knapsack_problem/Bounded#Go (and with no other Go source files)
  • Get and build benchcmp if you don't already have it: "go get -v golang.org/x/tools/cmd/benchcmp"
  • Run go test -v -bench=. > bench.out.orig (or go test -bench=. | tee bench.out.orig or some such)
  • Make changes as desired
  • Re-run the benchmark this time saving the output to a different file, e.g. bench.out
  • Compare the results with "benchcmp bench.out{.orig,}" (or if your shell doesn't support "{}", with something like "benchcmp bench.out.orig bench.out")

For example, when I changed the code to use a struct as a map key instead of a string, the output was:

% go test -bench=. | tee bench.out && benchcmp bench.out{.orig,}
PASS
BenchmarkSol	    1000	   2919580 ns/op	 1885978 B/op	   12239 allocs/op
ok  	rosetta/kp_bounded	3.221s
benchmark        old ns/op     new ns/op     delta
BenchmarkSol     6929766       2919580       -57.87%

benchmark        old allocs     new allocs     delta
BenchmarkSol     16963          12239          -27.85%

benchmark        old bytes     new bytes     delta
BenchmarkSol     1963326       1885978       -3.94%
Cookies help us deliver our services. By using our services, you agree to our use of cookies.