如何找出哪两种方法更快?

时间:2014-02-06 21:59:17

标签: go profiling

我有两种方法可以从子域修剪域后缀,我想知道哪一种更快。我该怎么做?

2 string trimming methods

1 个答案:

答案 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 collectorrunning your samples long enough