2017-02-19 2 views
1

누군가가 이동하기 전에 pool지도를 시도했는지 궁금했습니다. 나는 이전에 pooling buffers에 대해 읽었으며 비슷한 추론을 통해지도를 쌓아서 자주 만들거나 파괴해야하는 이유가 있는지, 선험적으로 이유가 있다면 효율적이지 않을지 궁금해졌습니다. 지도가 풀로 돌아 왔을 때 모든 요소를 ​​삭제하고 반복해야하지만 create a new map instead of deleting the entries in a map which has already been allocated and reusing it에 대한 권장 사항 인 것처럼 보이기 때문에지도를 풀링하면 도움이되지 않을 수도 있습니다.골란 풀링지도

답변

1

지도가 삭제되거나 항목을 추가하여 크기가 (많은) 변경되면 새로운 할당이 이루어지며 풀링 할 때 이점이 없습니다.

지도의 크기는 변경되지 않지만 키 값만 변경되면 풀링이 성공적으로 최적화됩니다.

CSV 파일이나 데이터베이스 테이블과 같은 테이블 형식의 구조를 읽을 때 유용합니다. 각 행에는 정확히 동일한 열이 포함되므로 항목을 지울 필요가 없습니다. @Grzegorz 주르 말씀처럼 당신의지도가 매우 크기가 변경되지 않는 경우 다음 풀링 도움이됩니다,

package mappool 

import "testing" 

const SIZE = 1000000 

func BenchmarkMap(b *testing.B) { 
    m := make(map[int]int) 

    for i := 0; i < SIZE; i++ { 
     m[i] = i 
    } 

    b.ResetTimer() 

    for i := 0; i < b.N; i++ { 
     for i := 0; i < SIZE; i++ { 
      m[i] = m[i] + 1 
     } 
    } 
} 
1

go test -benchmem -bench .로 실행할 때

아래의 벤치 마크는 더 할당을 보여줍니다. 이를 테스트하기 위해 풀링이 성공한 벤치 마크를 만들었습니다. 내 컴퓨터의 출력은 다음과 같습니다

Pool time: 115.977µs 
No-pool time: 160.828µs 

벤치 마크 코드 :

package main 

import (
    "fmt" 
    "math/rand" 
    "time" 
) 

const BenchIters = 1000 

func main() { 
    pool := map[int]int{} 
    poolTime := benchmark(func() { 
     useMapForSomething(pool) 

     // Return to pool by clearing the map. 
     for key := range pool { 
      delete(pool, key) 
     } 
    }) 

    nopoolTime := benchmark(func() { 
     useMapForSomething(map[int]int{}) 
    }) 

    fmt.Println("Pool time:", poolTime) 
    fmt.Println("No-pool time:", nopoolTime) 
} 

func useMapForSomething(m map[int]int) { 
    for i := 0; i < 1000; i++ { 
     m[rand.Intn(300)] += 5 
    } 
} 

// benchmark measures how long f takes, on average. 
func benchmark(f func()) time.Duration { 
    start := time.Now().UnixNano() 
    for i := 0; i < BenchIters; i++ { 
     f() 
    } 
    return time.Nanosecond * time.Duration((time.Now().UnixNano()-start)/BenchIters) 
}