ゴーゴーベンチマーク


信用

  • この記事はOfficial Documentに基づいています
  • ベンチマークとテスト


    現代の開発ツールとして、Go Languageはビルトインベンチマークツール(モジュール)で出荷されます!そして、続く規則がいくつかあります.見つけましょう.

    Surfixによるファイル名


    シェル(またはコマンド)のgo test -bench=.は、どんなファイルでも名前がCount Testで終わるとわかります.テストコードとしてハンドルを認識しに移動します.たとえば、組み合わせについてのベンチマークコードを作成したいのですが、組み合わせテストでファイルを作る必要があります.試み
    sh> head -n 6 combinations_test.go
    package main
    
    import "testing"
    
    /* my own module for go lang */
    import jeongoon "github.com/jeongoon/go-combinations"
    

    パッケージ名


    このように
    package main
    
    さもなければ、go testを実行してモジュールを自動的に見つけることができません
      sh> go test -bench=.
      can't load package: package .: found packages main (someCode.go) and in /your/path/to/code
    

    モジュールのインポート


    import "testing"
    
    これが必要なパッケージです.シンプル.

    どんな機能にも接頭辞「ベンチマーク」があります


    コードでは、ベンチマークを実行しないヘルパー関数があります.
    一方、ベンチマークコードはベンチマークのプレフィックスで開始します.
    func Benchmark_something(b *testing B) {
            // do your benchmark
    }
    
    また、引数の値はb *testing Bです.
    あなたはベンチマークと何かの間に';チェックインする必要はないことに注意してください.
    ベンチマークのプレフィックスが必要です.それは個人的な好みの問題です.

    課題


    GO言語に従うシンプルかつ簡単なルールがあります.しかし、信頼性の低いベンチマーク時間経過に関するいくつかの問題点を見出した.

    WARNING
    This is not proved but only my opinion. I hope this information will help you get more accurate result out of the benchmark in go language.


    ウォームアップコード


    あなたが走っているとき、2つの類似した機能の間のパフォーマンスを比較することは、同じ仕事をします.あなたは実際のベンチマークコードの周りにラップいくつかの余分なコードを置く必要があります.
    afuncをテストするには、その前にウォームアップコードを入れる必要があるかもしれません.
    func aFunc() {
            // some codes go here
    }
    
    func Benchmark_warmingup_aFunc() {
            someTimes := 10
            for j := 0; j < someTimes; j++ {
                    aFunc()
            }
    }
    
    func Benchmark_actually_aFunc() {
            for j := 0; j < 10000; j++ {
                    aFunc()
            }
    }
    
    さもなければ、結果は最初のランまたはその逆で遅く見えます.

    別のコード


    前の例では、同じ機能(AFUNC)を使用していましたが、他のコードを比較しているときには、前のコードとして偶数の効果を達成するために別のウォームアップコードが必要になります.
    func aFunc() {
            // some codes go here
    }
    
    func bFunc() {
            // another implementation goes here
    }
    
    // .. snip ..
    
    func Benchmark_actually_bFunc() {
            for j := 0; j < 10000; j++ {
                    aFunc()
            }
    }
    
    // and warming up again
    func Benchmark_warmingup_bFunc() {
            someTimes := 10
            for j := 0; j < someTimes; j++ {
                    aFunc()
            }
    }
    
    func Benchmark_actually_bFunc() {
            for j := 0; j < 10000; j++ {
                    aFunc()
            }
    }
    

    最後のテストのためのoutroコード


    そして、いくつかの未知の理由のために、最後のベンチマークは、正しい測定された時間を示すようでありません.ラストはやっぱり仕上げているようだった.これは私が既に知覚を持っているからです.しかし、最後のコードブロックが位置によって影響を受けるなら、変更を見るために再配置する必要があります.
    またはちょうど別のoutroコードを置く.それが最後かどうかに関係するかどうかによる影響がないならば、それは危害を加えません.
    そこで、Bfuncブロックをテストした後、別のcfuncまたはちょうど別のafuncを入れました.
    func Benchmark_actually_bFunc() {
            for j := 0; j < 10000; j++ {
                    bFunc()
            }
    }
    func Benchmark_byebye_aFunc() {
            for j := 0; j < 10; j++ {
                    aFunc
            }
    
    繰り返しますが、ベンチマークの中でより信頼できるベンチマーク結果を見つけるのを助けることを願っています.
    あなたは私のベンチマークコードの例を取得したい場合.
    私のcombinations-bench repositoryをご覧ください.