> 백엔드 개발 > Golang > Go 언어의 벤치마크 및 성능 비교

Go 언어의 벤치마크 및 성능 비교

王林
풀어 주다: 2024-05-08 09:27:02
원래의
983명이 탐색했습니다.

Go에서는 테스트 패키지에 있는 BenchmarkXXX 함수를 사용하여 코드 성능을 측정하는 벤치마크 테스트를 쉽게 작성할 수 있습니다. 이러한 함수는 표준 구문을 따르며 벤치마크 실행을 제어하는 ​​*testing.B 유형의 포인터를 인수로 받습니다. 벤치마크(go test -bench=BenchmarkName)를 실행하면 각 작업에 소요된 나노초 수, 초당 수행된 작업 수, 테스트에서 실행된 반복 횟수 및 초당 패스 수 메모리 양 등 다양한 벤치마크 결과를 비교함으로써 비효율적인 코드 영역을 식별하고 이를 통해 애플리케이션의 전반적인 성능을 향상시킬 수 있습니다.

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

🎜Syntax🎜🎜🎜벤치마크 함수의 구문은 다음과 같습니다. 🎜rrreee🎜여기서: 🎜
  • b*testing.B , 벤치마킹을 위한 몇 가지 추가 기능이 포함되어 있습니다.
🎜🎜실용 사례🎜🎜🎜두 가지 정렬 알고리즘의 성능을 비교하는 벤치마크를 작성해 보겠습니다. 🎜rrreee🎜🎜벤치마크 실행🎜🎜🎜벤치마크를 실행하려면 다음 명령을 실행하세요. 🎜 rrreee🎜여기서 BenchmarkName은 실행하려는 벤치마크 기능의 이름입니다. 🎜🎜🎜결과 해석🎜🎜🎜벤치마크 결과는 다음과 같은 다양한 정보가 포함된 테이블 형식으로 출력됩니다. 🎜
  • ns/op: 각 작업에 소요된 나노초 수입니다.
  • op/s: 초당 수행되는 작업 수입니다.
  • B: 테스트에서 실행되는 반복 횟수입니다.
  • MB/s: 초당 전송되는 메모리 양입니다.
🎜🎜정렬 알고리즘 비교🎜🎜🎜위의 벤치마크를 실행하면 다음 결과가 표시됩니다(결과는 하드웨어 및 시스템 구성에 따라 다를 수 있음). 🎜rrreee🎜이 결과에서 다음을 수행할 수 있습니다. 삽입 정렬이 가장 느리고, 빠른 정렬이 그 뒤를 따르고, sort.Ints가 가장 빠릅니다. 🎜

위 내용은 Go 언어의 벤치마크 및 성능 비교의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿