我的同事告诉我,代码调制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发布于 2021-12-21 14:02:42
执行一个模块操作是非常快的,它的大小相当于一个纳秒。Mod1024()和Mod1023()函数所做的事情要多得多:它们增加并测试一个循环变量,执行加法并将结果存储在一个局部变量中。这些都是数量级以上的一个简单的调制操作,无论它优化为比特掩蔽或不。
此外,将任何代码作为主应用程序的一部分进行基准测试从来都不是一个好主意,有许多因素扭曲了结果(常常使其完全无用)。见Order of the code and performance。始终使用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所以是的,通过1024进行的调制被优化为比特掩蔽,而且实际上更快:大约比快4倍。由于优化(1.3ns对0.3ns),为您节省了一个完整的纳秒。虽然这只是当您必须执行这数百万次并且没有其他代码是执行的一部分比一个简单的CPU模块操作慢的时候,这才重要。
https://stackoverflow.com/questions/70436444
复制相似问题