함수 매개변수와 전역 변수의 성능 영향
Go 프로그래밍 영역에서는 함수 매개변수에 우선순위를 두어야 하는지에 대한 질문이 자주 발생합니다. 최적의 성능을 위해 전역 변수를 사용하시겠습니까?
제외된 패턴 조각을 가져오는 checkFiles 함수를 고려해 보세요. 인수로:
func checkFiles(path string, excludedPatterns []string) { // ... }
excludedPatterns는 함수 실행 전반에 걸쳐 일정하게 유지되므로 일부에서는 반복되는 매개변수 전달을 제거하여 성능을 최적화하기 위해 이를 전역 변수로 만들 것을 제안할 수도 있습니다.
그러나 이 최적화는 Go에서는 슬라이스 매개변수를 효율적으로 처리하므로 불필요합니다. 슬라이스는 메타데이터(길이 및 용량)를 포함하고 기본 데이터 구조를 가리키는 경량 구조입니다. 슬라이스가 함수 매개변수로 전달되면 전체 지원 배열이 아닌 메타데이터만 복사됩니다. 이는 "기록 중 복사" 의미론으로 알려져 있습니다. 따라서 함수 매개변수를 통해 제외 패턴에 액세스하는 것은 전역 변수로 액세스하는 것과 동일하게 효율적입니다.
또한 매개변수를 값으로 전달하면 캐싱과 같은 컴파일러의 최적화로 이어질 수 있습니다. 반면에 전역 변수는 더 복잡한 처리가 필요하므로 잠재적으로 최적화를 방해할 수 있습니다.
벤치마크는 슬라이스를 함수 매개변수로 전달하는 것과 전역 슬라이스에 액세스하는 것 사이에 큰 성능 차이가 없음을 보여줍니다.
package main import ( "testing" ) var gslice = make([]string, 1000) func global(s string) { for i := 0; i < 100; i++ { _ = s _ = gslice // Access global-slice } } func param(s string, ss []string) { for i := 0; i < 100; i++ { _ = s _ = ss // Access parameter-slice } } func BenchmarkParameter(b *testing.B) { for i := 0; i < b.N; i++ { param("hi", gslice) } } func BenchmarkGlobal(b *testing.B) { for i := 0; i < b.N; i++ { global("hi") } } func main() { testing.Main(m.Run, m.init, m.cleanup, m.installFlags) }
벤치마크 결과에 따르면 두 접근 방식 모두 거의 동일한 속도로 작동하는 것으로 나타났습니다.
BenchmarkParameter-8 20000000 80.2 ns/op BenchmarkGlobal-8 20000000 79.9 ns/op
결론적으로 다음 사용 사례의 경우 질문의 경우, ExceptPatterns를 함수 매개변수로 전달하는 것이 코드를 단순화하고, 가독성을 높이며, Go의 전역 변수와 비슷한 성능을 제공하므로 권장됩니다.
위 내용은 Go 성능: 함수 매개변수와 전역 변수: 실제 속도 차이가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!