ゴーゴーベンチマーク
信用
ベンチマークとテスト
現代の開発ツールとして、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をご覧ください.
Reference
この問題について(ゴーゴーベンチマーク), 我々は、より多くの情報をここで見つけました https://dev.to/jeongoon/benchmark-with-go-3i92テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol