首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调制1024真的比调制1023快吗?

调制1024真的比调制1023快吗?
EN

Stack Overflow用户
提问于 2021-12-21 13:43:02
回答 1查看 92关注 0票数 1

我的同事告诉我,代码调制2的能力将被优化为比特操作,比调整其他数字的速度更快。我检查了大会证明了他的选择。但是我用Golang编写了一个基准代码,并使用Go版本1.17运行它。似乎没有太大的差别。为什么会这样,他是对的吗?

这是Golang代码:

代码语言:javascript
复制
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())
}

我的计算机上的结果是:

代码语言:javascript
复制
2810668
2694136
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-21 14:02:42

执行一个模块操作是非常快的,它的大小相当于一个纳秒。Mod1024()Mod1023()函数所做的事情要多得多:它们增加并测试一个循环变量,执行加法并将结果存储在一个局部变量中。这些都是数量级以上的一个简单的调制操作,无论它优化为比特掩蔽或不。

此外,将任何代码作为主应用程序的一部分进行基准测试从来都不是一个好主意,有许多因素扭曲了结果(常常使其完全无用)。见Order of the code and performance。始终使用Go的测试框架(具有基准测试功能)来更可靠地测试代码。

因此,让我们修改示例函数:

代码语言:javascript
复制
func Mod1023() {
    for i := 23; i%1023 != 0; i++ {
    }
}

func Mod1024() {
    for i := 24; i%1024 != 0; i++ {
    }
}

(上述函数中的循环将有1000个迭代。)

让我们使用Go的测试框架编写适当的基准测试函数:

代码语言:javascript
复制
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 .运行基准测试,输出如下:

代码语言:javascript
复制
BenchmarkMod1023-8        881263              1346 ns/op
BenchmarkMod1024-8       3710430               325.4 ns/op

所以是的,通过1024进行的调制被优化为比特掩蔽,而且实际上更快:大约快4倍。由于优化(1.3ns对0.3ns),为您节省了一个完整的纳秒。虽然这只是当您必须执行这数百万次并且没有其他代码是执行的一部分比一个简单的CPU模块操作慢的时候,这才重要。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70436444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档