「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang によるベンチマーク

Golang によるベンチマーク

2024 年 11 月 4 日に公開
ブラウズ:704

こんにちはゴーファー?

このブログ投稿では、#golang テスト パッケージに組み込まれている素晴らしいツールの使用方法を説明します。コードまたは関数のパフォーマンスをどのようにテストしますか? ベンチマークテストを使用します。

さあ行こう。

このテストでは、次のように決定される古典的なフィボナッチ数またはフィボナッチ数列を使用します。

if (x 



この順序は、以下に示すように、数学や自然のいくつかの部分にも現れるため、重要です。

Benchmark with Golang

このコードを実装するにはいくつかの方法がありますが、ベンチマーク テストには再帰的計算方法と反復計算方法の 2 つを選択します。関数の主な目的は、位置を提供し、その位置のフィボナッチ数を返すことです。

再帰的方法

// main.go

func fibRecursive(n int) int {
    if n 



反復法

// main.go

func fibIterative(position uint) uint {
    slc := make([]uint, position)
    slc[0] = 1
    slc[1] = 1

    if position 



これらの方法は最適化されていませんが、テストの結果はたとえ少数であっても大きく異なります。これはテストでわかります。コードに従うには、ここをクリックしてください。

さて、ベンチマーク テストのために、_main_test.go ファイルにテストをいくつか書きましょう。 benchmark に関する Golang のドキュメントを使用すると、次のようにテストする関数を作成できます。

// main_test.go

// The key is to start every function you want to benchmark with the keyword Benchmark and use b *testing.B instead of t *testing.T as input 
func BenchmarkFibIterative(b *testing.B) {
    // Use this for-loop to ensure the code will behave correctly. 
    // Now, you can put the function or piece of code you want to test
    for i := 0; i 



先に進む前に質問: どちらが速いですか?

小さい数値 (10) と少し大きい数値 (80) に対してテストを実行してみましょう。 ベンチマーク テストを実行するには、次のコマンドを実行するだけです:

go test -bench=関数の名前

このコマンドについて詳しく知りたい場合は、ここを確認してください。

最初のテスト: 位置=10

//(fibIterative)
Results:
cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkFibIterative-8         24491042                42.50 ns/op
PASS
ok      playground      1.651s

この画像を使って分析してみましょう:

Benchmark with Golang

画像によると、テストには 8 つのコアがあり、時間制限はありません (完了するまで実行されます)。タスクを完了するまでに 1.651 秒かかりました。

==== Extra ====
We got 24,491,042 iterations (computations), and each iteration (op) took 42.50 ns.

Doing some math, we can calculate how much time one op took:

42.50 ns/op with 1 ns = 1/1,000,000,000 s
op ≈ 2.35270590588e-12 s
==== Extra ====

良い結果ですね。位置 10 の再帰関数を確認してみましょう:

// Results
BenchmarkFibRecursive-8          6035011               187.8 ns/op
PASS
ok      playground      1.882s

タスクを完了するのに 1.882 秒かかったことがわかります。

反復関数が数デシ秒の差で勝利しました。

を使用して、もう 1 つテストを試してみましょう。

位置 50

// Results for the Iterative Function

cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkFibIterative-8         27896118                45.37 ns/op
PASS
ok      playground      2.876s

// Results for the Recursive Function

cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkFibRecursive-8          6365198               186.3 ns/op
PASS
ok      playground      1.918s

おお!再帰関数の方が高速になりましたか?

もう少し大きな数字で終わりましょう。

位置 80

// Results for the Iterative Function

cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkFibIterative-8          5102344               229.5 ns/op
PASS
ok      playground      1.933s

// Results for the Recursive Function
// My poor PC couldn’t handle it, so I had to reduce the position to 50 just to get some results printed.

cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
BenchmarkFibRecursive-8                1        44319299474 ns/op
PASS
ok      playground      44.951s

その違いは大きいです。位置 80 の場合、反復アプローチには約 2 秒かかりました。位置 50 の場合、再帰関数には約 45 秒かかりました。これは、Golang プロジェクトの速度が低下し始めたときにコードのベンチマークを行うことの重要性を示しています。

結論

実稼働コードの実行が遅い、または予想外に遅い場合は、この手法を pprof または組み込みテスト パッケージの他のツールと組み合わせて使用​​し、コードがどこで実行されているかを特定してテストできます。不十分な点とそれを最適化する方法。

補足: 見た目に美しいコードのすべてがパフォーマンスが高いわけではありません。

追加の演習

再帰関数を改善するより良い方法を見つけることはできますか? (ヒント: 動的プログラミングを使用してください)。この記事では、一部の数値が小さい場合、再帰的戦略が優れている理由を説明します。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/pedrobertao/benchmark-with-golang-md4?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3