포인트 함수 벤치마킹
Golang은 C언어처럼 포인터를 지원합니다. 하지만 포인터 연산은 안 되는 건 go를 사용하시는 분들은 아실 겁니다.
하지만 포인터 참조만으로도 많은 이익이 있습니다.
그중에서 가장 흔하게 함수를 작성할 때 포인터를 사용한다. 입니다.
이유는 포인터 함수 호출 시 메모리 복사를 안 한다는 것입니다. call by reference라 합니다.
반대로 일반 함수는 메모리 복사가 되는 call by value라 합니다.
아래 코드를 돌려 일반 함수와 포인터 함수의 성능 차를 비교하였습니다.
간단한 string으로 테스트하였지만, 크기가 큰 array나 map을 포인터로 사용하였다면 더 큰 이익을 볼 수 있습니다.
하지만 map 사용 시 교착상태가 발생하여 행이 걸리는 이슈를 경험해 보면, mutex나 sync.Map 같은 걸 고민하시게 될 겁니다.
하지만 개인 테스트 시 어지간히 해서는 경험하기는 어렵겠습니다.
현업에서 golang을 하면서 에러도 안 나고 행이 걸리는 경험을 하시면, 교착상태도 고려 대상 입니다.
point_func.go
package main
func AppendChar(v string) string {
v += "a"
return v
}
func AppendCharPointer(v *string) {
*v += "a"
}
func main() {
var v string
v = AppendChar(v)
AppendCharPointer(&v)
}
point_func_test.go
package main
import (
"testing"
)
func BenchmarkAppendChar(b *testing.B) {
var v string
for i := 0; i < b.N; i++ {
v += AppendChar("a")
}
}
func BenchmarkAppendCharPointer(b *testing.B) {
var v string
for i := 0; i < b.N; i++ {
AppendCharPointer(&v)
}
}