我寫了一個簡單的程序,將OR中包含的所有值都包含在一個巨大的切片中。當我使用10倍大的切片時,我預計會有10倍的性能下降。但是在執行提供的測試時,性能差距很大。該程序的輸出如下:OR取決於陣列大小的突然減速
[email protected]:~/$ 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)
}
編輯:一定要在去測試-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.SetBytes](http://golang.org/ pkg/testing /#B.SetBytes),那麼基準測試也會顯示MB/s,這將會提供很多信息! –
不知道b.N。下一次我會在問我的問題之前閱讀完整的文檔。謝謝 ! – olivieradam666