Commit 51af3381 authored by Jan Mercl's avatar Jan Mercl

Document concurrency issues. Fixes #5.

parent 47184dd8
# Copyright 2014 The b Authors. All rights reserved. .PHONY: all clean cover cpu editor internalError later mem nuke todo edit
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file.
.PHONY: all todo clean cover generic mem nuke cpu grep=--include=*.go --include=*.l --include=*.y --include=*.yy
ngrep='TODOOK\|parser\.go\|scanner\.go\|.*_string\.go'
testbin=b.test
all: editor all: editor
go build go vet 2>&1 | grep -v $(ngrep) || true
go vet golint 2>&1 | grep -v $(ngrep) || true
golint .
go install
make todo make todo
-unused .
editor: -misspell *.go
gofmt -l -s -w . -gosimple
go test -i
go test
clean: clean:
@go clean go clean
rm -f *~ *.out $(testbin) rm -f *~ *.test *.out
cover: cover:
t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t t=$(shell tempfile) ; go test -coverprofile $$t && go tool cover -html $$t && unlink $$t
cpu: cpu: clean
go test -c go test -run @ -bench . -cpuprofile cpu.out
./$(testbin) -test.cpuprofile cpu.out go tool pprof -lines *.test cpu.out
go tool pprof --lines $(testbin) cpu.out
edit:
@ 1>/dev/null 2>/dev/null gvim -p Makefile *.go
editor:
gofmt -l -s -w *.go
go test
go build
generic: generic:
@# writes to stdout a version where the type of key is KEY and the type @# writes to stdout a version where the type of key is KEY and the type
...@@ -38,16 +38,22 @@ generic: ...@@ -38,16 +38,22 @@ generic:
@# the output with your desired types. @# the output with your desired types.
@sed -e 's|interface{}[^{]*/\*K\*/|KEY|g' -e 's|interface{}[^{]*/\*V\*/|VALUE|g' btree.go @sed -e 's|interface{}[^{]*/\*K\*/|KEY|g' -e 's|interface{}[^{]*/\*V\*/|VALUE|g' btree.go
mem: internalError:
go test -c egrep -ho '"internal error.*"' *.go | sort | cat -n
./$(testbin) -test.bench . -test.memprofile mem.out -test.memprofilerate 1
go tool pprof --lines --web --alloc_space $(testbin) mem.out later:
grep -n $(grep) LATER * || true
grep -n $(grep) MAYBE * || true
mem: clean
go test -run @ -bench . -memprofile mem.out -memprofilerate 1 -timeout 24h
go tool pprof -lines -web -alloc_space *.test mem.out
nuke: clean nuke: clean
rm -f *.test *.out go clean -i
todo: todo:
@grep -n ^[[:space:]]*_[[:space:]]*=[[:space:]][[:alpha:]][[:alnum:]]* *.go || true grep -nr $(grep) ^[[:space:]]*_[[:space:]]*=[[:space:]][[:alpha:]][[:alnum:]]* * | grep -v $(ngrep) || true
@grep -n TODO *.go || true grep -nr $(grep) TODO * | grep -v $(ngrep) || true
@grep -n BUG *.go || true grep -nr $(grep) BUG * | grep -v $(ngrep) || true
@grep -n println *.go || true grep -nr $(grep) [^[:alpha:]]println * | grep -v $(ngrep) || true
...@@ -36,13 +36,17 @@ func dbg(s string, va ...interface{}) { ...@@ -36,13 +36,17 @@ func dbg(s string, va ...interface{}) {
fmt.Println() fmt.Println()
} }
func TODO(...interface{}) string { func TODO(...interface{}) string { //TODOOK
_, fn, fl, _ := runtime.Caller(1) _, fn, fl, _ := runtime.Caller(1)
return fmt.Sprintf("TODO: %s:%d:\n", path.Base(fn), fl) return fmt.Sprintf("TODO: %s:%d:\n", path.Base(fn), fl) //TODOOK
} }
func use(...interface{}) {} func use(...interface{}) {}
func init() {
use(caller, dbg, TODO, isNil, (*Tree).dump) //TODOOK
}
// ============================================================================ // ============================================================================
func isNil(p interface{}) bool { func isNil(p interface{}) bool {
......
...@@ -6,10 +6,30 @@ ...@@ -6,10 +6,30 @@
// //
// Changelog // Changelog
// //
// 2016-07-16: Update becnhmark results to newer Go version. Add a note on
// concurrency.
//
// 2014-06-26: Lower GC presure by recycling things. // 2014-06-26: Lower GC presure by recycling things.
// //
// 2014-04-18: Added new method Put. // 2014-04-18: Added new method Put.
// //
// Concurrency considerations
//
// Tree.{Clear,Delete,Put,Set} mutate the tree. One can use eg. a
// sync.Mutex.Lock/Unlock (or sync.RWMutex.Lock/Unlock) to wrap those calls if
// they are to be invoked concurrently.
//
// Tree.{First,Get,Last,Len,Seek,SeekFirst,SekLast} read but do not mutate the
// tree. One can use eg. a sync.RWMutex.RLock/RUnlock to wrap those calls if
// they are to be invoked concurrently with any of the tree mutating methods.
//
// Enumerator.{Next,Prev} mutate the enumerator and read but not mutate the
// tree. One can use eg. a sync.RWMutex.RLock/RUnlock to wrap those calls if
// they are to be invoked concurrently with any of the tree mutating methods. A
// separate mutex for the enumerator, or the whole tree in a simplified
// variant, is necessary if the enumerator's Next/Prev methods per se are to
// be invoked concurrently.
//
// Generic types // Generic types
// //
// Keys and their associated values are interface{} typed, similar to all of // Keys and their associated values are interface{} typed, similar to all of
...@@ -34,20 +54,20 @@ ...@@ -34,20 +54,20 @@
// No other changes to int.go are necessary, it compiles just fine. // No other changes to int.go are necessary, it compiles just fine.
// //
// Running the benchmarks for 1000 keys on a machine with Intel i5-4670 CPU @ // Running the benchmarks for 1000 keys on a machine with Intel i5-4670 CPU @
// 3.4GHz, Go release 1.4.2. // 3.4GHz, Go 1.7rc1.
// //
// $ go test -bench 1e3 example/all_test.go example/int.go // $ go test -bench 1e3 example/all_test.go example/int.go
// BenchmarkSetSeq1e3-4 20000 78265 ns/op
// BenchmarkGetSeq1e3-4 20000 67980 ns/op
// BenchmarkSetRnd1e3-4 10000 172720 ns/op
// BenchmarkGetRnd1e3-4 20000 89539 ns/op
// BenchmarkDelSeq1e3-4 20000 87863 ns/op
// BenchmarkDelRnd1e3-4 10000 130891 ns/op
// BenchmarkSeekSeq1e3-4 10000 100118 ns/op
// BenchmarkSeekRnd1e3-4 10000 121684 ns/op
// BenchmarkNext1e3-4 200000 6330 ns/op
// BenchmarkPrev1e3-4 200000 9066 ns/op
// PASS // PASS
// BenchmarkSetSeq1e3 10000 151620 ns/op // ok command-line-arguments 42.531s
// BenchmarkGetSeq1e3 10000 115354 ns/op
// BenchmarkSetRnd1e3 5000 255865 ns/op
// BenchmarkGetRnd1e3 10000 140466 ns/op
// BenchmarkDelSeq1e3 10000 143860 ns/op
// BenchmarkDelRnd1e3 10000 188228 ns/op
// BenchmarkSeekSeq1e3 10000 156448 ns/op
// BenchmarkSeekRnd1e3 10000 190587 ns/op
// BenchmarkNext1e3 200000 9407 ns/op
// BenchmarkPrev1e3 200000 9306 ns/op
// ok command-line-arguments 26.369s
// $ // $
package b package b
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment