@ 260812.1

220222.4 · 2e6a1b8a1ce88e578279e6e631b2129f7144ec87

Add Makefile and benchmark script

reading declarations

Makefile

new file mode 100644@@ -0,0 +1,57 @@+.PHONY: test_build_darwin_arm64+test_build_darwin_arm64:+	GOOS=darwin GOARCH=arm64 go test -c -o /dev/null++.PHONY: test_build_darwin_amd64+test_build_darwin_amd64:+	GOOS=darwin GOARCH=amd64 go test -c -o /dev/null++.PHONY: test_build_linux_arm64+test_build_linux_arm64:+	GOOS=linux GOARCH=arm64 go test -c -o /dev/null++.PHONY: test_build_linux_amd64+test_build_linux_amd64:+	GOOS=linux GOARCH=amd64 go test -c -o /dev/null++.PHONY: test_build_windows_amd64+test_build_windows_amd64:+	GOOS=windows GOARCH=amd64 go test -c -o /dev/null++.PHONY: test_build_freebsd_amd64+test_build_freebsd_amd64:+	GOOS=freebsd GOARCH=amd64 go test -c -o /dev/null++.PHONY: test_build_openbsd_amd64+test_build_openbsd_amd64:+	GOOS=openbsd GOARCH=amd64 go test -c -o /dev/null++.PHONY: test_build_netbsd_amd64+test_build_netbsd_amd64:+	GOOS=netbsd GOARCH=amd64 go test -c -o /dev/null++# Test that we can build fastwalk on multiple platforms+.PHONY: test_build+test_build: test_build_darwin_arm64 test_build_darwin_amd64 \+	test_build_linux_arm64 test_build_linux_amd64 \+	test_build_windows_amd64 test_build_freebsd_amd64 \+	test_build_openbsd_amd64 test_build_netbsd_amd64++.PHONY: test+test: # runs all tests against the package with race detection and coverage percentage+	@go test -race -cover ./...++.PHONY: quick+quick: # runs all tests without coverage or the race detector+	@go test ./...++.PHONY: bench+bench:+	@go test -run '^$' -bench . -benchmem ./...++.PHONY: bench_comp+bench_comp: scripts/bench_comp+	@go run ./scripts/bench_comp.go++.PHONY: all+all: test test_build

scripts/.gitignore

new file mode 100644@@ -0,0 +1,2 @@+/bench_comp+*.exe

scripts/bench_comp.go

new file mode 100644@@ -0,0 +1,101 @@+package main++import (+	"flag"+	"fmt"+	"io"+	"io/ioutil"+	"log"+	"os"+	"os/exec"+	"path/filepath"+	"strconv"+)++func init() {+	log.SetOutput(os.Stderr)+	log.SetFlags(log.LstdFlags | log.Lshortfile)+}++var Tests = []string{+	"filepath",+	"godirwalk",+	"fastwalk",+}++func main() {+	count := flag.Int("count", 5, "Run each test and benchmark n times")+	compCmd := flag.String("comp", "benchstat", "Benchmark comparison command")+	flag.Parse()++	if _, err := exec.LookPath(*compCmd); err != nil {+		log.Fatalf("error: %v: %q\n", err, *compCmd)+	}++	tmpdir, err := ioutil.TempDir("", "fastwalk-bench.*")+	if err != nil {+		log.Fatal(err)+	}++	runTest := func(name string) error {+		fmt.Println("##", name)++		filename := filepath.Join(tmpdir, name+".txt")+		f, err := os.Create(filename)+		if err != nil {+			log.Fatal(err)+		}+		defer f.Close()++		args := []string{+			"test",+			"-run", `^$`,+			"-bench", `^BenchmarkWalkComparison$`,+			"-benchmem",+			"-count", strconv.Itoa(*count),+			"github.com/charlievieth/fastwalk",+			"-walkfunc", name,+		}++		cmd := exec.Command("go", args...)+		cmd.Stderr = os.Stderr+		cmd.Stdout = io.MultiWriter(os.Stdout, f)++		if err := cmd.Run(); err != nil {+			log.Fatalf("error running command: %q: %v\n", cmd.Args, err)+		}++		if err := f.Close(); err != nil {+			log.Fatal(err)+		}++		fmt.Print("\n")+		return nil+	}++	for _, name := range Tests {+		runTest(name)+	}++	benchStat := func(from, to string) {+		fmt.Printf("## %s vs. %s\n", from, to)+		cmd := exec.Command(*compCmd,+			filepath.Join(tmpdir, from+".txt"),+			filepath.Join(tmpdir, to+".txt"),+		)+		cmd.Stderr = os.Stderr+		cmd.Stdout = os.Stdout+		if err := cmd.Run(); err != nil {+			log.Fatalf("error running command: %q: %v\n", cmd.Args, err)+		}+		fmt.Print("\n")+	}++	fmt.Println("## Comparisons")+	fmt.Println("########################################################")+	fmt.Print("\n")+	benchStat("filepath", "fastwalk")+	benchStat("godirwalk", "fastwalk")++	fmt.Printf("Temp: %s\n", tmpdir)+}