V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
Kisesy
V2EX  ›  Go 编程语言

新的 exp/slices 包大部分比较函数都比较慢

  •  
  •   Kisesy · 2021-12-16 14:32:24 +08:00 · 1410 次点击
    这是一个创建于 1071 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 来带值遍历, 这样会进行复制数据
    这个包里不少函数都是这样的, 有兄弟愿意的话可以去官方提交代码或提个意见

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.