본문 바로가기
Language/Go

Go - Iteration & Benchmark

by ocwokocw 2021. 12. 4.

참조: https://quii.gitbook.io/learn-go-with-tests/go-fundamentals/iteration

- 개요

Go 에서는 반복을 수행할 때 for 문을 이용한다. Go 에는 while, do, until 문이 없으며 for 문만 사용가능하다.
또한 단순한 Test 뿐만 아니라 자체적으로(표준 library로) 성능을 측정하는 Benchmark 도 지원하는데 이를 알아본다.

- Example Code

특정 문자를 5번 반복하는 코드를 작성해본다.
 
우선 테스트 코드를 작성하자. TDD 접근법의 첫단계에서는 기능을 구현 했다고 가정한 후, 실제 결과값과 기대값을 비교하는 테스트 코드를 먼저 작성한다. 성급하게 구현을 어떻게 할지 미리 생각하지 않는다.
 
iteration package 를 만들고 파일 이름을 repeat_test.go 와 같이 지정해준다. go test 가 수행하는 대상은 파일 이름이 _test.go 로 끝나야 하며, 함수는 Test 로 시작해야 한다.
 
package iteration

import "testing"

func TestRepeat(t *testing.T) {
    repeated := Repeat("a")
    expected := "aaaaa"

    if repeated != expected {
        t.Errorf("expected %q but got %q", expected, repeated)
    }
}
 
 
터미널에서 go test 를 수행하면 Repeat 함수를 구현 하라는 오류가 뜰것이다.  특정 문자를 5번 반복하는 기능을 구현하므로 "a" 문자를 입력을 받은 repeated 값과 결과로 기대하는 expected 값이 다르다면 오류를 출력한다.
 
package iteration

func Repeat(character string) string {
    return ""
}
 
 
구현은 하지 않고 컴파일만 수행되도록 코드를 작성한다. 다시 go test 를 수행하면 기대한 값과 다르다는 오류 메시지가 출력될 것이다. 
이제 테스트가 통과 하도록 내용을 구현한다. 요구사항 대로 5번 같은 문자를 반복한 후 반환하였다.
 
func Repeat(character string) string {
    var repeated string
    for i := 0; i < 5; i++ {
        repeated = repeated + character
    }
    return repeated
}
 
 
이제는 go test 를 수행하면 테스트케이스를 통과한다. Test 를 통과한다면 리팩토링을 할 사항이 없는지 살펴본다. 
 
const repeatCount = 5

func Repeat(character string) string {
    var repeated string
    for i := 0; i < repeatCount; i++ {
        repeated += character
    }
    return repeated
}
 
 
for 문에서 반복횟수를 직접 지정 해도 되지만 더 명시적으로 반복 횟수가 5번이라는 것을 상수로 선언 해준다.

- Benchmark

Go 에서는 성능을 측정하는 benchmark 기능을 지원한다. 
 
func BenchmarkRepeat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Repeat("a")
    }
}
 
 
Test 함수와 비슷하지만 인자형을 보면 testing.B로 testing.T와 다르다는것을 알 수 있다. 함수이름은 Benchmark 로 접미사를 작성한다. Repeat 함수는 N 번 실행된다. go test -bench=.(윈도우는 go test -bench=".") 으로 실행할 수 있다. 
 
iteration % go test -bench=.
goos: darwin
goarch: amd64
pkg: example.com/go-with-test/iteration
cpu: VirtualApple @ 2.50GHz
BenchmarkRepeat-8       12819080                90.03 ns/op
PASS
 
 
위와 같은 수행결과를 얻을 수 있을것이다. 총 12819080번 수행 되었으며, loop 당 90.03 ns 가 소요 되었음을 나타낸다. 

'Language > Go' 카테고리의 다른 글

Go - struct, method, interface  (0) 2021.12.24
Go - array, slice, test coverage  (0) 2021.12.04
Go - Go with TDD  (0) 2021.12.04
Go - Go 와 Gin 을 활용한 RESTful API 개발  (0) 2021.11.28
Go - compile 과 install  (0) 2021.11.28

댓글