0

Golang の練習用に作成した基数ツリーの実装のベンチマークを試みています。

しかし、「どのようにベンチマークすればよいですか?」という問題に遭遇しました。以下のコードでは、2 つのケースを示しています。または、LookUp 関数のベンチマークを実行するさまざまな方法を示しています。

  • ケース 1: ツリー上に存在する 1 つのバイト スライスを使用すると、すべての子ノードなどを介してルックアップが成功します。

  • ケース 2: func を使用して、ツリー内の既存のデータからそのランダムなスライスを生成します。これは、ルックアップも成功することを意味します...

かかる時間はツリーの深さに依存することはわかっています... ケース 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
4

1 に答える 1

0

ベンチマークがランダムである場合、ある実行から次の実行までの異なる実装間のパフォーマンスを比較することは非常に困難になります。

代わりに、アルゴリズムのさまざまな領域に重点を置くいくつかの異なるベンチマーク ケースを静的に実装します。ケースはさまざまなシナリオを表す必要があります。たとえば、一致するものがない場合 (既にある場合)、ルックアップで返されるソース データに多くの項目がある場合、多くの項目があり、 1点のみ返品等

于 2016-05-16T06:23:08.130 に答える