gpt4 book ai didi

arrays - 或突然减速取决于阵列大小

转载 作者:IT王子 更新时间:2023-10-29 00:54:32 25 4
gpt4 key购买 nike

我写了一个简单的程序,对一个巨大的 go slice 中包含的所有值进行 OR。当我使用 10 倍大的 slice 时,我预计性能会下降 10 倍。然而,在执行提供的测试时,存在巨大的性能差距。程序输出如下:

oadam@oadam-Latitude-E6510:~/$ go test -bench .
testing: warning: no tests to run
PASS
BenchmarkLittle 2000000000 0.11 ns/op
BenchmarkBig 1 2417869962 ns/op
ok _/home/oadam/ 5.048s

代码

package main

import (
"math/rand"
"testing"
)

const (
little = 5000000
big = 50000000
)

var a = make([]uint32, big)

func benchOR(b *testing.B, l int) {
for i := 0; i < l; i++ {
a[i] = rand.Uint32()
}

var result uint32
for i := 0; i < l; i++ {
result |= a[i]
}
}

func BenchmarkLittle(b *testing.B) {
benchOR(b, little)
}

func BenchmarkBig(b *testing.B) {
benchOR(b, big)
}

编辑:一定是 go test -bench 中的错误。使用手动计时我不重现

package main

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

const (
little = 5000000
big = 50000000
)

var a = make([]uint32, big)

func initA(l int) {
for i := 0; i < l; i++ {
a[i] = rand.Uint32()
}
}

func test(l int) uint32 {
var result uint32
for i := 0; i < l; i++ {
result |= a[i]
}
return result
}

func main() {
initA(little)
var before = time.Now()
test(little)
log.Println(time.Since(before))

initA(big)
var before2 = time.Now()
test(big)
log.Println(time.Since(before2))

}

最佳答案

问题是您没有使用 b.N,它会告诉您运行基准测试的次数。此外,如果您只想对 ORing 进行基准测试,您可能应该只初始化数组一次,或者至少调用 b.ResetTimer() 这样初始化就不会被计算在内。

这是我最终得到的结果,它给出了预期的结果:

package main

import (
"math/rand"
"testing"
)

const (
little = 5000000
big = 50000000
)

var a = make([]uint32, big)

func init() {
for i := 0; i < big; i++ {
a[i] = rand.Uint32()
}
}

func benchOR(b *testing.B, l int) {
var result uint32
for _, u := range a[:l] {
result |= u
}
}

func BenchmarkLittle(b *testing.B) {
for i := 0; i < b.N; i++ {
benchOR(b, little)
}
}

func BenchmarkBig(b *testing.B) {
for i := 0; i < b.N; i++ {
benchOR(b, big)
}
}

我的结果:

BenchmarkLittle      500       3222064 ns/op
BenchmarkBig 50 32268023 ns/op

关于arrays - 或突然减速取决于阵列大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com