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

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

May 08, 2024 am 09:27 AM
言語を移動 ベンチマーク 性能比較

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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles