小编kap*_*paw的帖子

增加地图的最快方法是什么?

我注意到以下两个map[int]int变量增量方法的3倍速度因子:

快速: myMap[key]++

慢: myMap[key]=myMap[key]+1

这可能并不奇怪,因为,至少天真地,在第二种情况下,我指示Go两次访问myMap.我只是很好奇:熟悉Go编译器的人能帮助我理解这些操作在地图上的区别吗?有了编译器如何工作的知识,是否有更快的技巧来增加地图?

编辑:在本地运行差异不太明显,但仍然存在:

package main

import (
    "fmt"
    "math"
    "time"
)

func main() {

    x, y := make(map[int]int), make(map[int]int)
    x[0], y[0] = 0, 0
    steps := int(math.Pow(10, 9))

    start1 := time.Now()
    for i := 0; i < steps; i++ {
        x[0]++
    }
    elapsed1 := time.Since(start1)
    fmt.Println("++ took", elapsed1)

    start2 := time.Now()
    for i := 0; i < steps; i++ {
        y[0] = y[0] + 1
    }
    elapsed2 := time.Since(start2)

    fmt.Println("y=y+1 took", elapsed2)

}
Run Code Online (Sandbox Code Playgroud)

输出: …

optimization hashmap go

5
推荐指数
1
解决办法
215
查看次数

Golang在时间种子后依次产生相同的随机数?(在我的机器上运行)

我试图准确理解为什么,当从外部函数调用时,我的时间播种随机数生成器返回相同数字的序列.

问题的最小工作示例:

package main

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

//Generates random int as function of range
func getRand(Range int) int {
    s1 := rand.NewSource(time.Now().UnixNano())
    r1 := rand.New(s1)
    return r1.Intn(Range)
}

//Print 100 random ints between 0 and 100
func main() {
    for i := 0; i < 100; i++ {
        fmt.Print(getRand(100), ", ")
    }
}
Run Code Online (Sandbox Code Playgroud)

这个的输出是

Out[1]: 40, 40, 40, 40, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 34,
34, 34, 34, 34, 34, …
Run Code Online (Sandbox Code Playgroud)

random go

2
推荐指数
1
解决办法
338
查看次数

标签 统计

go ×2

hashmap ×1

optimization ×1

random ×1