Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢
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
更多关于Golang Go语言中新的 exp/slices 包大部分比较函数都比较慢的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
关于Golang中exp/slices
包内大部分比较函数较慢的问题,这里有几个可能的解释和建议:
-
实现细节:
exp/slices
包作为一个实验性质的包,其内部实现可能还未经过充分优化。相比标准库中的函数,实验性包中的函数在性能上可能存在一定的差距。 -
通用性与性能:为了实现更高的通用性,
exp/slices
包中的比较函数可能需要处理更多的边界情况和类型检查,这可能会导致性能下降。而标准库中的函数往往针对特定场景进行了优化。 -
测试环境:性能的比较需要在相同的测试环境下进行,包括硬件、操作系统、Go版本等。如果测试环境存在差异,可能会导致不公平的比较结果。
-
优化建议:如果你发现
exp/slices
包中的函数性能确实无法满足你的需求,可以考虑以下几种优化方式:- 切换到标准库中的函数,如果标准库提供了类似的功能。
- 对
exp/slices
包中的函数进行自定义修改和优化。 - 编写自己的比较函数,针对你的具体需求进行优化。
-
反馈与改进:如果你认为
exp/slices
包中的函数存在性能问题,可以向Go社区反馈,并提供你的测试数据和结果。Go团队会根据反馈进行相应的改进和优化。
总之,性能优化是一个复杂的过程,需要综合考虑多种因素。希望这些建议能帮助你解决问题。