我的同事告訴我,代碼修改 2 的能力將針對位操作進行優化,并且比修改其他數字更快。我檢查了證明他的選擇的程式集。但是我用 Golang 寫了一個基準代碼,并用 Go 1.17 版運行它。好像沒有太大區別。為什么會這樣,他是對的嗎?
這是Golang代碼:
package main
import (
"fmt"
"time"
)
const loop = 10000000000
func Mod1024() int {
sum := 0
for i := 0; i < loop; i {
sum = i % 1024
}
return sum
}
func Mod1023() int {
sum := 0
for i := 0; i < loop; i {
sum = i % 1023
}
return sum
}
func main() {
start := time.Now()
Mod1023()
fmt.Println(time.Since(start).Microseconds())
start = time.Now()
Mod1024()
fmt.Println(time.Since(start).Microseconds())
}
我電腦上的結果是:
2810668
2694136
uj5u.com熱心網友回復:
執行單個模運算真的很快,它的大小只有一個納秒。您的Mod1024()和Mod1023()函式所做的更多:它們增加和測驗回圈變數,執行加法并將結果存盤在區域變數中。無論是否針對位掩碼進行了優化,這些總體上都比簡單的修改操作高出幾個數量級。
此外,將任何代碼作為主應用程式的一部分進行基準測驗從來都不是一個好主意,有許多因素會扭曲結果(通常使其完全無用)。請參閱代碼和性能的順序。始終使用 Go 的測驗框架(具有基準測驗功能)來更可靠地對代碼進行基準測驗。
所以讓我們修改示例函式:
func Mod1023() {
for i := 23; i%1023 != 0; i {
}
}
func Mod1024() {
for i := 24; i%1024 != 0; i {
}
}
(上述函式中的回圈將有 1000 次迭代。)
讓我們使用 Go 的測驗框架撰寫適當的基準測驗函式:
func BenchmarkMod1023(b *testing.B) {
for i := 0; i < b.N; i {
Mod1023()
}
}
func BenchmarkMod1024(b *testing.B) {
for i := 0; i < b.N; i {
Mod1024()
}
}
使用 運行基準測驗go test -bench .,輸出為:
BenchmarkMod1023-8 881263 1346 ns/op
BenchmarkMod1024-8 3710430 325.4 ns/op
所以是的,modding by1024針對位掩碼進行了優化,實際上速度更快:大約快 4 倍。由于優化(1.3 ns vs 0.3 ns),為您節省了整整納秒。盡管這僅在您必須執行數百萬次并且沒有其他代碼比簡單的 CPU mod 操作慢的執行部分時才重要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/388884.html
