ホームページ > バックエンド開発 > Golang > Go 言語でのベンチマークとパフォーマンスの比較

Go 言語でのベンチマークとパフォーマンスの比較

王林
リリース: 2024-05-08 09:27:02
オリジナル
1042 人が閲覧しました

Go では、テスト パッケージの BenchmarkXXX 関数を使用して、コードのパフォーマンスを測定するベンチマーク テストを簡単に作成できます。これらの関数は標準構文に従い、ベンチマークの実行を制御する *testing.B 型のポインターを引数として受け取ります。ベンチマークを実行すると (go test -bench=BenchmarkName)、結果の表を出力できます。この表には、各操作に費やされたナノ秒数、1 秒あたりに実行された操作の数、テストで実行された反復数、および1 秒あたりのパス数、メモリ量など。さまざまなベンチマークの結果を比較することで、非効率なコード領域を特定し、アプリケーションの全体的なパフォーマンスを向上させることができます。

Go 言語でのベンチマークとパフォーマンスの比較

Go 言語のベンチマークとパフォーマンスの比較

はじめに

ベンチマークは、コードのパフォーマンスを測定するための重要なツールです。これは非効率なコード領域を特定するのに役立ち、それによってアプリケーションの全体的なパフォーマンスが向上します。 Go 言語には、Go でのベンチマーク テストの作成を非常に簡単にする組み込みの testing パッケージが用意されています。 testing 包,使得在 Go 中编写基准测试变得非常容易。

语法

基准测试函数的语法如下:

func BenchmarkName(b *testing.B)
ログイン後にコピー

其中:

  • b 是一个 *testing.B 类型的指针,它包含了一些用于基准测试的附加功能。

实战案例

让我们编写一个基准测试来比较两种不同的排序算法的性能:

package main

import (
    "testing"
    "bytes"
    "sort"
)

// 插入排序
func insertionSort(nums []int) {
    for i := 1; i < len(nums); i++ {
        key := nums[i]
        j := i - 1

        for j >= 0 && nums[j] > key {
            nums[j+1] = nums[j]
            j--
        }

        nums[j+1] = key
    }
}

// 快速排序
func quickSort(nums []int) {
    if len(nums) <= 1 {
        return
    }

    pivot := nums[len(nums)/2]
    var left, right []int

    for _, num := range nums {
        if num < pivot {
            left = append(left, num)
        } else if num > pivot {
            right = append(right, num)
        }
    }

    quickSort(left)
    quickSort(right)

    copy(nums, append(left, append([]int{pivot}, right...)...))
}

// 基准测试
func BenchmarkInsertionSort(b *testing.B) {
    var buf bytes.Buffer

    for i := 0; i < b.N; i++ {
        nums := []int{5, 2, 8, 3, 1, 9, 4, 7, 6}
        insertionSort(nums)
        buf.WriteString(bytes.Join(nums, " "))
    }
}

func BenchmarkQuickSort(b *testing.B) {
    var buf bytes.Buffer

    for i := 0; i < b.N; i++ {
        nums := []int{5, 2, 8, 3, 1, 9, 4, 7, 6}
        quickSort(nums)
        buf.WriteString(bytes.Join(nums, " "))
    }
}

func BenchmarkGoSort(b *testing.B) {
    var buf bytes.Buffer

    for i := 0; i < b.N; i++ {
        nums := []int{5, 2, 8, 3, 1, 9, 4, 7, 6}
        sort.Ints(nums)
        buf.WriteString(bytes.Join(nums, " "))
    }
}
ログイン後にコピー

运行基准测试

要运行基准测试,请运行以下命令:

go test -bench=BenchmarkName
ログイン後にコピー

其中 BenchmarkName 是您要运行的基准测试函数的名称。

结果解读

基准测试结果将以表格的形式输出,其中包含各种信息,例如:

  • ns/op:每个操作所花费的纳秒数。
  • op/s:每秒执行的操作数。
  • B:测试中运行的迭代次数。
  • MB/s:每秒传递的内存量。

比较排序算法

运行上面的基准测试后,您会看到以下结果(结果可能会因您的硬件和系统配置而异):

BenchmarkInsertionSort     20332432               62.5 ns/op         16 B/op               5.75 MB/s
BenchmarkQuickSort         11440808              104 ns/op          24 B/op              1.64 MB/s
BenchmarkGoSort            21864500               57.7 ns/op          32 B/op               4.77 MB/s
ログイン後にコピー

从这些结果中,我们可以看到 插入排序 是最慢的,其次是 快速排序,最快的则是 sort.Ints

🎜構文🎜🎜🎜ベンチマーク関数の構文は次のとおりです: 🎜rrreee🎜ここで: 🎜
  • b は、型 *testing.B には、ベンチマーク用の追加機能がいくつか含まれています。
🎜🎜実際のケース🎜🎜🎜 2 つの異なる並べ替えアルゴリズムのパフォーマンスを比較するベンチマークを作成しましょう: 🎜rrreee🎜🎜 ベンチマークを実行する🎜🎜🎜 ベンチマークを実行するには、次のコマンドを実行します: 🎜 rrreee🎜 ここで、BenchmarkName は、実行するベンチマーク関数の名前です。 🎜🎜🎜結果の解釈🎜🎜🎜ベンチマーク結果は、次のようなさまざまな情報を含むテーブルの形式で出力されます。 🎜
  • ns/op: 各操作に費やされたナノ秒数。
  • op/s: 1 秒あたりに実行される操作の数。
  • B: テストで実行される反復の数。
  • MB/s: 1 秒あたりに転送されるメモリの量。
🎜🎜並べ替えアルゴリズムの比較🎜🎜🎜上記のベンチマークを実行すると、次の結果が表示されます (結果はハードウェアとシステム構成によって異なる場合があります): 🎜rrreee🎜これらの結果から、次のことがわかります。 Insertion Sort が最も遅く、次に Quick Sort が続き、最も速いのは sort.Ints であることがわかります。 🎜

以上がGo 言語でのベンチマークとパフォーマンスの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート