Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢

package main

import ( “runtime” “testing”

"golang.org/x/exp/slices"

)

var ( aa = make([]runtime.MemStats, 1) bb = make([]runtime.MemStats, 1) )

func Benchmark1(b *testing.B) { for i := 0; i < b.N; i++ { slices.Equal(aa, bb) } }

func Benchmark2(b *testing.B) { for i := 0; i < b.N; i++ { Equal(aa, bb) } }

func Benchmark3(b *testing.B) { for i := 0; i < b.N; i++ { Equal2(aa, bb) } }

func Equal[E comparable](s1, s2 []E) bool { if len(s1) != len(s2) { return false } for i := range s1 { if s1[i] != s2[i] { return false } } return true }

func Equal2[E comparable](s1, s2 []E) bool { if len(s1) != len(s2) { return false } for i := 0; i < len(s1); i++ { if s1[i] != s2[i] { return false } } return true }

/* cpu: AMD Ryzen 5 2500U with Radeon Vega Mobile Gfx Benchmark1-8 638925 1652 ns/op 0 B/op 0 allocs/op Benchmark2-8 5131083 221.2 ns/op 0 B/op 0 allocs/op Benchmark3-8 5423184 229.6 ns/op 0 B/op 0 allocs/op */

原因就是代码使用 range 来带值遍历, 这样会进行复制数据
这个包里不少函数都是这样的, 有兄弟愿意的话可以去官方提交代码或提个意见


更多关于Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


关于Golang中exp/slices包内大部分比较函数较慢的问题,这里有几个可能的解释和建议:

  1. 实现细节exp/slices包作为一个实验性质的包,其内部实现可能还未经过充分优化。相比标准库中的函数,实验性包中的函数在性能上可能存在一定的差距。

  2. 通用性与性能:为了实现更高的通用性,exp/slices包中的比较函数可能需要处理更多的边界情况和类型检查,这可能会导致性能下降。而标准库中的函数往往针对特定场景进行了优化。

  3. 测试环境:性能的比较需要在相同的测试环境下进行,包括硬件、操作系统、Go版本等。如果测试环境存在差异,可能会导致不公平的比较结果。

  4. 优化建议:如果你发现exp/slices包中的函数性能确实无法满足你的需求,可以考虑以下几种优化方式:

    • 切换到标准库中的函数,如果标准库提供了类似的功能。
    • exp/slices包中的函数进行自定义修改和优化。
    • 编写自己的比较函数,针对你的具体需求进行优化。
  5. 反馈与改进:如果你认为exp/slices包中的函数存在性能问题,可以向Go社区反馈,并提供你的测试数据和结果。Go团队会根据反馈进行相应的改进和优化。

总之,性能优化是一个复杂的过程,需要综合考虑多种因素。希望这些建议能帮助你解决问题。

回到顶部