我注意到以下两个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)
输出: …
我试图准确理解为什么,当从外部函数调用时,我的时间播种随机数生成器返回相同数字的序列.
问题的最小工作示例:
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)