[Go] go bench로 성능 벤치마킹하기
go에는 자체적으로 성능 벤치마크를 위한 도구가 약간은 내장되어있다.
벤치마크는 테스트의 한 종류로서 제공된다.
기본 구성 조건
아래와 같은 함수가 2개 있고, 이걸 벤치마킹한다고 가정하겠다.

벤치마크도 테스트와 동일하게 _test.go로 만들어진 테스트파일 내에 작성되어야 한다.
함수명이 무조건 Benchmark로 시작해야 하고, testing.B 타입값을 인자로 받아야 한다.
그리고 b 파라미터 내에 전달된 횟수만큼 반복을 수행하면서 테스트 대상 기능을 호출하면 된다.
저 b.N 반복문 내의 영역은 특수하게 처리된다.
go bench는 반복문 한번 도는 것을 하나의 operation으로 간주한다.
벤치마크 실행법
벤치마크는 test의 한 종류로 제공된다고 했다. 기본적인 실행방법은 거의 같다. -bench 플래그만 주면 벤치마크 모드로 테스트가 실행된다.
CUI 표현이 구려서 뭐가 뭔지 헷갈릴 수 있는데,
첫번째 컬럼이 벤치마크 함수명.
두번째 컬럼이 반복 횟수.
세번째 컬럼이 한 루프 반복당 소요시간이다.
벤치마크의 실행시간은 좀 임의로 되는 편이기 때문에, 위처럼 너무 오래걸린다 싶으면 실행횟수가 너무 편중될 수도 있다.
임의로 실행시간을 지정하고 싶다면 다음과 같이 benchtime 플래그를 주면 된다.

혹은 반복횟수를 강제로 지정할 수도 있다. 10x와 같이 전달하면 10번만 반복한다.

cpu 개수도 지정할 수 있다.
이 경우에는 멀티코어를 활용하지 않았기 때문에 몇개를 써도 변화는 없다.
setup 시간 제외하기
테스트를 돌리려고 하다보면 사전 데이터를 생성해서 밀어넣을 필요가 있다.

근데 이렇게 할 경우 IntVector를 생성하는 시간이 벤치마크 시간에 포함되어버리는 문제가 있다.
그걸 해결하려면 다음과 같이 타이머를 수동으로 조절해줘야 한다.

이러면 정확히 연산에 대해서만 벤치마크 시간이 측정될 것이다.
참조
https://pkg.go.dev/cmd/go#hdr-Testing_flags
https://blog.logrocket.com/benchmarking-golang-improve-function-performance/
https://bugoverdose.github.io/development/go-benchmark/
https://stackoverflow.com/questions/68447175/where-to-put-setup-teardown-in-go-benchmarks