카테고리 없음

golang point / go언어 포인트 함수 벤치마킹

미래의 고 2023. 3. 14. 22:17
포인트 함수 벤치마킹
 
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)
   }
}