我有两种方法可以从子域修剪域后缀,我想知道哪一种更快。我该怎么做?
答案 0 :(得分:5)
您可以使用benchmark capabilities的内置go test
。
例如(on play):
import (
"strings"
"testing"
)
func BenchmarkStrip1(b *testing.B) {
for br := 0; br < b.N; br++ {
host := "subdomain.domain.tld"
s := strings.Index(host, ".")
_ = host[:s]
}
}
func BenchmarkStrip2(b *testing.B) {
for br := 0; br < b.N; br++ {
host := "subdomain.domain.tld"
strings.TrimSuffix(host, ".domain.tld")
}
}
将此代码存储在somename_test.go
中并运行go test -test.bench='.*'
。对我来说,这给了我
以下输出:
% go test -test.bench='.*'
testing: warning: no tests to run
PASS
BenchmarkStrip1 100000000 12.9 ns/op
BenchmarkStrip2 100000000 16.1 ns/op
ok 21614966 2.935s
基准实用程序将attempt to do a certain number of runs直到有意义的时间为止
测量值在数字100000000
的输出中反映出来。代码已运行
100000000
次,循环中的每个操作分别占用12.9 ns和16.1 ns。
因此,您可以得出结论BenchmarkStrip1
中的代码表现得更好。
无论结果如何,profile your program通常更好地了解其中的位置 真正的瓶颈不是浪费你的时间与这些微基准。
我也不建议您编写自己的基准测试,因为您可能会有一些因素 不要考虑诸如the garbage collector和running your samples long enough。