import ( "코딩", "행복", "즐거움" )

Golang 벤치마킹 함수 성능 개선 본문

GO

Golang 벤치마킹 함수 성능 개선

더코드마니아 2022. 11. 15. 17:45

원문: https://blog.logrocket.com/benchmarking-golang-improve-function-performance/

 

Benchmarking in Golang: Improving function performance - LogRocket Blog

Improve your Golang application's performance by running benchmarks with built-in tools like the testing package and the go tool.

blog.logrocket.com

 

 

Golang 에서 벤치마크 작성하기 

go에 벤치마트 테스트 패키지 도구가 포함되어 있어 별도의 설치없이 벤치마크 성능 테스트를 할 수 있다. 

 

간단한 벤치마크 코드를 작성 한다

 

main.go에 성능을 테스트하기 위한 함수를 만든다. 

// main.go
func primeNumbers(max int) []int {
    var primes []int

    for i := 2; i < max; i++ {
        isPrime := true

        for j := 2; j <= int(math.Sqrt(float64(i))); j++ {
            if i%j == 0 {
                isPrime = false
                break
            }
        }

        if isPrime {
            primes = append(primes, i)
        }
    }

    return primes
}

 

main_test.go에  main.go에 만들었던 함수를 성능테스트하는 벤치마크 코드를 작성 한다. 

package main

import (
    "testing"
)

var num = 1000

func BenchmarkPrimeNumbers(b *testing.B) {
    for i := 0; i < b.N; i++ {
        primeNumbers(num)
    }
}

벤치마크 함수의 시작은 Benchmark로 시작 해야 하며 func BenchmarkXxx(*testing.B)testing.B 와 같은 형식을 유지해야 한다. 

 

b.N은 반복횟수를 의미하고, 값은 정해져있지 않으며, 실행 시 동적으로 할당되며, 최소 1초 동안 실행 된다. 

 

Golang에서 벤치마크 실행하기 

go test -bench=. 명령을 이용해서 실행한다. 

$ go test -bench=.
goos: linux
goarch: amd64
pkg: github.com/ayoisaiah/random
cpu: Intel(R) Core(TM) i7-7560U CPU @ 2.40GHz
BenchmarkPrimeNumbers-4            14588             82798 ns/op
PASS
ok      github.com/ayoisaiah/random     2.091s

실행 시 운영체제, 아키텍처, 패키지 및 CPU사양을 설명하고, 벤치마크에 사용된 cpu 수량도 출력한다. 

14588은 함수가 실행된 총 횟수이고, 82798 ns/op는 평균 시간으로 나노초로 표시 된다. 

 

벤치마크를 여러번 실행 할 수 도 있는데, 아래와 같은 명령어를 사용 한다. 

$ go test -bench=. -count 5
goos: linux
goarch: amd64
pkg: github.com/ayoisaiah/random
cpu: Intel(R) Core(TM) i7-7560U CPU @ 2.40GHz
BenchmarkPrimeNumbers-4            14485             82484 ns/op
BenchmarkPrimeNumbers-4            14557             82456 ns/op
BenchmarkPrimeNumbers-4            14520             82702 ns/op
BenchmarkPrimeNumbers-4            14407             87850 ns/op
BenchmarkPrimeNumbers-4            14446             82525 ns/op
PASS
ok      github.com/ayoisaiah/random     10.259s

'GO' 카테고리의 다른 글

GO 백엔드 개발자 학습 로드맵  (0) 2022.11.16
GO 디자인 패턴에 관심이 있다면 ??  (0) 2022.11.16
pprof  (0) 2022.10.05
메모리 절약 패키지, fieldalignment 사용  (0) 2022.10.03
Go 필드 정렬해서 메모리 절약하기  (0) 2022.10.03