为了账号安全,请及时绑定邮箱和手机立即绑定

从数字数组中加/减值的最快方法是什么?

从数字数组中加/减值的最快方法是什么?

Go
小唯快跑啊 2022-06-01 15:59:54
我有下面的代码,想从每个元素中添加/减去值“1”。最快的方法是什么?询问是因为我在 myByte 数组中有 100 万个元素。下面的代码只显示了 3,但如果有一百万,它会花费很长时间。myByte := []byte("a","b","c")for i:=0; i<len(myByte); i++ {    myByte[i]+=1}
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

分而治之。将你的大数组分成 N 个连续的部分,然后用一个 goroutine 处理每个部分。



查看完整回答
反对 回复 2022-06-01
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

计时并尝试并行化


package add


import (

        "testing"

)



func BenchmarkSimple(b *testing.B) {

        // to run use go test -bench=.

        var array=make([]byte,1000000)

        for i := 0; i < b.N; i++ {

               addit(&array,1)

        }

}


func BenchmarkPara(b *testing.B) {

        // to run use go test -bench=.

        var array=make([]byte,1000000)

        var p1=array[0:250000]

        var p2=array[250001:500000]

        var p3=array[500001:750000]

        var p4=array[750001:999999]

        for i := 0; i < b.N; i++ {

               go addit(&p1,1)

               go addit(&p2,1)

               go addit(&p3,1)

               go addit(&p4,1)

        }

}



func addit(myByte *[]byte, v byte) {

for i:=0; i<len(*myByte); i++ {

    (*myByte)[i]+=v

}

}

这是我在笔记本电脑上看到的。我的笔记本电脑有4核


$ go test -bench=.

goos: darwin

goarch: amd64

BenchmarkSimple-4           1130           1035976 ns/op

BenchmarkPara-4            10000            559050 ns/op

PASS

ok      _/Users/jamandre/wip/add        6.923s

对于这样的事情,时间安排并不像看起来那么聪明,请参阅https://www.youtube.com/watch?v=r-TLSBdHe1A&t=46s但请务必把握好时间!


四个 goroutine 并没有给 4x 加速,大约 2 x 是相当不错的


查看完整回答
反对 回复 2022-06-01
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

并行化你的代码可能会有所帮助,并行处理是 Go 中的一等公民,因此go指令和goroutines也是如此。

SIMD指令还允许对此类计算进行巨大的性能改进。这是一个使用它们的 Go 包


查看完整回答
反对 回复 2022-06-01
  • 3 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信