함수 캐싱은 재사용을 위해 함수 호출 결과를 저장하고 반복 계산을 방지하는 성능 최적화 기술입니다. Go에서는 map이나 sync.Map을 사용하여 함수 캐싱을 구현할 수 있으며, 특정 시나리오에 따라 다양한 캐싱 전략을 채택할 수 있습니다. 예를 들어, 간단한 캐시 전략은 모든 함수 매개변수를 캐시 키로 사용하는 반면, 세련된 캐시 전략은 공간을 절약하기 위해 결과의 일부만 캐시합니다. 또한 동시 안전 캐싱 및 무효화 전략을 통해 캐시 성능을 더욱 최적화할 수 있습니다. 이러한 기술을 적용하면 함수 호출의 실행 효율성을 크게 향상시킬 수 있습니다.
함수 캐싱은 향후 재사용을 위해 함수 호출 결과를 저장할 수 있는 일반적인 성능 최적화 기술입니다. 이렇게 하면 함수가 호출될 때마다 동일한 계산을 수행하지 않으므로 성능이 향상됩니다.
간단한 캐싱 전략:함수의 모든 매개변수를 캐시 키로 사용하고 함수 결과를 맵에 직접 캐시합니다.
func computeCircleArea(radius float64) float64 { return math.Pi * radius * radius } var areaCache = make(map[float64]float64) func CachedComputeCircleArea(radius float64) float64 { if area, ok := areaCache[radius]; ok { return area } result := computeCircleArea(radius) areaCache[radius] = result return result }
세련된 캐싱 전략:함수 매개변수에 따라 결과의 일부만 캐시하여 공간을 절약할 수 있습니다. 예를 들어 원의 면적을 계산하는 함수의 경우 반경이 0과 1 사이인 결과만 캐시할 수 있습니다.
func computeCircleArea(radius float64) float64 { return math.Pi * radius * radius } var areaCache = make(map[float64]float64) func CachedComputeCircleArea(radius float64) float64 { if 0 <= radius && radius <= 1 { if area, ok := areaCache[radius]; ok { return area } result := computeCircleArea(radius) areaCache[radius] = result return result } return computeCircleArea(radius) }
동시성 안전 캐시:동시 환경에서 동시성 안전 데이터 함수 캐싱을 구현하려면 구조를 사용해야 합니다. 예를 들어sync.Map
을 사용할 수 있습니다.sync.Map
:
package main import ( "math" "sync" ) func computeCircleArea(radius float64) float64 { return math.Pi * radius * radius } var areaCache sync.Map func CachedComputeCircleArea(radius float64) float64 { if area, ok := areaCache.Load(radius); ok { return area.(float64) } result := computeCircleArea(radius) areaCache.Store(radius, result) return result }
失效策略:有时,缓存中的结果可能变得无效。例如,如果计算圆形面积的函数的实现发生改变,那么缓存的结果就无效了。您可以通过设定过期时间或在函数结果发生变化时清除缓存来处理这种情况。
假设我们有一个函数slowOperation()
package main import ( "sync/atomic" "time" ) var operationCount int64 func slowOperation() float64 { count := atomic.AddInt64(&operationCount, 1) print("执行 slowOperation ", count, " 次\n") time.Sleep(100 * time.Millisecond) return 1.0 } var operationCache sync.Map func CachedSlowOperation() float64 { // 将函数参数 nil(空指针)作为缓存键 if result, ok := operationCache.Load(nil); ok { return result.(float64) } result := slowOperation() operationCache.Store(nil, result) return result } func main() { for i := 0; i < 10; i++ { t := time.Now().UnixNano() _ = CachedSlowOperation() print("优化后花费 ", (time.Now().UnixNano() - t), " ns\n") t = time.Now().UnixNano() _ = slowOperation() print("原始花费 ", (time.Now().UnixNano() - t), " ns\n") } }
무효화 전략:
때때로 캐시 결과가 무효화될 수 있습니다. 예를 들어 원의 면적을 계산하는 함수의 구현이 변경되면 캐시된 결과가 무효화됩니다. 함수 결과가 변경되면 만료 시간을 설정하거나 캐시를 삭제하여 이러한 상황을 처리할 수 있습니다. 실용 사례 계산에 시간이 많이 걸리는slowOperation()
함수가 있다고 가정해 보겠습니다. 함수 캐시를 사용하여 최적화할 수 있습니다:
执行 slowOperation 1 次 优化后花费 0 ns 执行 slowOperation 2 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 3 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 4 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 5 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 6 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 7 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 8 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 9 次 原始花费 100000000 ns 优化后花费 0 ns 执行 slowOperation 10 次 原始花费 100000000 ns 优化后花费 0 ns
위 내용은 Golang 함수 캐시 성능 최적화 팁 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!