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

3 profiling go

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

2字符串修剪方法

nem*_*emo 5

您可以使用内置的基准功能go test.

例如(正在播放):

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")
    }
}
Run Code Online (Sandbox Code Playgroud)

将此代码存储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
Run Code Online (Sandbox Code Playgroud)

基准测试实用程序将尝试执行一定数量的运行,直到测量到有意义的时间,这将在数字的输出中反映出来100000000.代码是运行 100000000时间,循环中的每个操作分别占用12.9 ns和16.1 ns.因此,您可以得出结论,代码BenchmarkStrip1执行得更好.

无论结果如何,通常最好对您的程序进行分析,以了解真正的瓶颈在哪里,而不是浪费您的时间与这些微基准测试.

我也不建议您编写自己的基准测试,因为您可能不会考虑一些因素,例如垃圾收集器运行样本足够长的时间.