mirror of
https://github.com/golang/go
synced 2024-11-18 05:24:47 -07:00
d9caac3737
I'd like to propose changes to the directory scanner implementation, and it would be good to be able to measure how changes compare in terms of allocations and time taken. Change-Id: I4ff4bbd38b5e3522f50d31473f2ac607bb0de802 Reviewed-on: https://go-review.googlesource.com/94904 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package godoc
|
|
|
|
import (
|
|
"go/build"
|
|
"path/filepath"
|
|
"runtime"
|
|
"sort"
|
|
"testing"
|
|
|
|
"golang.org/x/tools/godoc/vfs"
|
|
"golang.org/x/tools/godoc/vfs/gatefs"
|
|
)
|
|
|
|
func TestNewDirTree(t *testing.T) {
|
|
fsGate := make(chan bool, 20)
|
|
rootfs := gatefs.New(vfs.OS(runtime.GOROOT()), fsGate)
|
|
fs := vfs.NameSpace{}
|
|
fs.Bind("/", rootfs, "/", vfs.BindReplace)
|
|
|
|
c := NewCorpus(fs)
|
|
// 3 levels deep is enough for testing
|
|
dir := c.newDirectory("/", 3)
|
|
|
|
processDir(t, dir)
|
|
}
|
|
|
|
func processDir(t *testing.T, dir *Directory) {
|
|
var list []string
|
|
for _, d := range dir.Dirs {
|
|
list = append(list, d.Name)
|
|
// recursively process the lower level
|
|
processDir(t, d)
|
|
}
|
|
|
|
if sort.StringsAreSorted(list) == false {
|
|
t.Errorf("list: %v is not sorted\n", list)
|
|
}
|
|
}
|
|
|
|
func BenchmarkNewDirectory(b *testing.B) {
|
|
if testing.Short() {
|
|
b.Skip("not running tests requiring large file scan in short mode")
|
|
}
|
|
|
|
fsGate := make(chan bool, 20)
|
|
|
|
goroot := runtime.GOROOT()
|
|
rootfs := gatefs.New(vfs.OS(goroot), fsGate)
|
|
fs := vfs.NameSpace{}
|
|
fs.Bind("/", rootfs, "/", vfs.BindReplace)
|
|
for _, p := range filepath.SplitList(build.Default.GOPATH) {
|
|
fs.Bind("/src/golang.org", gatefs.New(vfs.OS(p), fsGate), "/src/golang.org", vfs.BindAfter)
|
|
}
|
|
b.ResetTimer()
|
|
b.ReportAllocs()
|
|
for tries := 0; tries < b.N; tries++ {
|
|
corpus := NewCorpus(fs)
|
|
corpus.newDirectory("/", -1)
|
|
}
|
|
}
|