繁体   English   中英

Golang:基准基数树查找

[英]Golang: benchmark Radix Tree Lookup

为了与Golang一起练习,我一直在尝试对我编写的Radix Tree实现进行基准测试。

但是我遇到了一个问题:“我应该如何对其进行基准测试?”。 在下面的代码中,显示了两种情况,或者说不同的方式,我想对LookUp函数进行基准测试。

  • 情况1:使用树上存在的单个字节片,这意味着它将通过所有子节点等成功执行LookUp。

  • 情况2:使用func从树中的现有数据生成该随机切片,这意味着它也会成功执行LookUp ...

我知道时间的消耗将取决于树的深度...我认为案例2是否接近实际的实现?

问题:哪种情况对基准测试更有效或更有用?

基准测试:

func BenchmarkLookUp(b *testing.B) {
    radix := New()
    insertData(radix, sampleData2)

    textToLookUp := randomBytes()

    for i := 0; i < b.N; i++ {
        radix.LookUp(textToLookUp) // Case 1 
        //radix.LookUp(randomBytes()) // Case 2
    }
}

func randomBytes() []byte {
    strings := sampleData2()
    return []byte(strings[random(0, len(strings))])
}

func sampleData2() []string {
    return []string{
        "romane",
        "romanus",
        "romulus",
        ...
    }
}

结果案例1:

PASS
BenchmarkLookUp-4       10000000               146 ns/op
ok      github.com/falmar/goradix       2.068s
PASS
BenchmarkLookUp-4       10000000               149 ns/op
ok      github.com/falmar/goradix       2.244s

结果案例2:

PASS
BenchmarkLookUp-4        3000000               546 ns/op
ok      github.com/falmar/goradix       3.094s
PASS
BenchmarkLookUp-4        3000000               538 ns/op
ok      github.com/falmar/goradix       4.481s

没有匹配的结果:

PASS
BenchmarkLookUp-4       10000000               194 ns/op
ok      github.com/falmar/goradix       3.189s
PASS
BenchmarkLookUp-4       10000000               191 ns/op
ok      github.com/falmar/goradix       3.243s

如果您的基准测试是随机的,那么将很难比较从一次运行到另一次运行的不同实现之间的性能。

取而代之的是,静态实现一些不同的基准测试案例,这些案例会强调算法的不同领域。 这些案例应代表不同的场景,例如没有匹配项的情况(如您已有的情况),源数据中有很多项目将在查找中返回的情况,有很多项目且仅退回1件商品,依此类推。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM