首页 > 其他分享 >golang对于[]byte数组转string进行比较的优化

golang对于[]byte数组转string进行比较的优化

时间:2023-06-13 21:36:18浏览次数:41  
标签:string bytes golang bool func byte buf

当需要比较两个[]byte数组是否相等时有好几种方案,下面可以看出前三种方案都是优化过的,效率高的方案。

package main

import (
	"bytes"
	"crypto/rand"
	mr "math/rand"
	"testing"
)

func StringEqual(n int, f func(a, b []byte) bool) {
	buf := make([]byte, 1024)
	rand.Read(buf)
	var total int
	for i := 0; i < n; i++ {
		start1 := mr.Intn(len(buf))
		len1 := mr.Intn(len(buf) - start1)
		start2 := mr.Intn(len(buf))
		len2 := mr.Intn(len(buf) - start2)
		if f(buf[start1:start1+len1], buf[start2:start2+len2]) {
			total++
		}
	}
}

func BenchmarkStringCompare(b *testing.B) {
	StringEqual(b.N, func(a, b []byte) bool {
		return bytes.Compare(a, b) == 0
	})
}

func BenchmarkStringCompare1(b *testing.B) {
	StringEqual(b.N, func(a, b []byte) bool {
		return string(a) == string(b)
	})
}

func BenchmarkStringEqual(b *testing.B) {
	StringEqual(b.N, func(a, b []byte) bool {
		return bytes.Equal(a, b)
	})
}

func BenchmarkStringCompare2(b *testing.B) {
	StringEqual(b.N, func(a, b []byte) bool {
		sa := string(a)
		sb := string(b)
		return sa == sb
	})
}

下面是结果,所以用bytes.Equal(a, b)属于好理解且效率高的方案

# go test -v -bench=. 
goos: windows
goarch: amd64
pkg: janbar/test1
cpu: Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
BenchmarkStringCompare
BenchmarkStringCompare-16       19283643                66.46 ns/op
BenchmarkStringCompare1
BenchmarkStringCompare1-16      17937969                64.16 ns/op
BenchmarkStringEqual
BenchmarkStringEqual-16         20451116                63.72 ns/op
BenchmarkStringCompare2
BenchmarkStringCompare2-16       7030708               181.5 ns/op
PASS
ok      janbar/test1    5.462s

源码也说了不会有额外的内存分配,该方案应该是结合if语句一起优化的

// Equal reports whether a and b
// are the same length and contain the same bytes.
// A nil argument is equivalent to an empty slice.
func Equal(a, b []byte) bool {
	// Neither cmd/compile nor gccgo allocates for these string conversions.
	return string(a) == string(b)
}

标签:string,bytes,golang,bool,func,byte,buf
From: https://www.cnblogs.com/janbar/p/17478749.html

相关文章

  • 关于mkfs.xfs创建xfs文件系统指定block-size为512字节时报错-Minimum block size for
    今天笔者看到mkfs.xfs命令的帮助文档手册时,有如下一段内容可以通过-bsize=value的方式指定block的大小,默认值是4096bytes,最小为512,最大为65536Thedefaultvalueis4096bytes(4KiB),  theminimumis512,andthemaximumis65536(64KiB).于是笔者就尝试,创建x......
  • 【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯为了提升性能,使用unsafe代码来重构了凯撒加密的代码。代码如下:const( lowerCaseAlphabet="abcdefghijklmnopqrstuvwxyz" upperCaseAlphabet="ABCDEFGHIJKLMN......
  • TStringList的用法
    TStringList的用法TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。常规的用法大家都知道,现在来讨论它的一些高级的用法。先把要讨论的几个属性列出来:1、CommaText2、Delimiter&DelimitedText3、Names&Values&ValueFromIndex先看第一个:CommaText。怎......
  • mac 下Golang 安装Protobuf
    1、安装protobufbrewinstallprotobuf2、检查安装结果protoc--version3、安装golangforprotobuf插件gogetgithub.com/golang/protobuf/protoc-gen-gogoget-u-vgithub.com/golang/protobuf/protoc-gen-gogoget=gitclone+goinstall这里会慢的要死所以我这里采取......
  • beego:interface conversion: interface {} is string, not int
    代码organizationId:=info[0]["organization_id"].(int)报错beego_api:interfaceconversion:interface{}isstring,notintRequestMethod: GETRequestURL: /v1/board2/students/detail2?id=237497RemoteAddr: ::1Stack/usr/local/go/src/runtime/panic.go......
  • golang 实现cas
    相比sync.WaitGroup里面的互斥锁,cas可以实现无锁等待一组任务执行完成后释放,示例代码如下funcTestCAS(t*testing.T){ varcountint32=10000 fori:=0;i<int(count);{ gofunc(){ deferfunc(){atomic.AddInt32(&count,-1)}() //dosomething //.........
  • C#中Byte字节的概念与操作
    C#中Byte字节的概念与操作    在C#中使用关键字byte表示字节,用byte[]表示字节数组,例如:byte[]a=newbyte[2];,就相当于创建了一个具有2个字节长度的字节数组,用变量a表示。使用BitConverter,GetBytes()方法将int、float、double、char、bool等类型转换成字节数组,如下:byte[]b......
  • C# 将 List<dynamic> 转换为 List<string>
    vardlist=newList<dynamic>(){"Guangzhou","Zhuhai","Shenzhen"};提取集合中的所有字符串,忽略所有其他类型,可以使用://Solution1:Includeonlystrings,nonullvalues,noexceptionsthrownvarstrings=dlist.OfType<stri......
  • Balanced Ternary String
    给出一个长为n的只由'1','2','0'组成的字符串,要求改动最少的位置,使'1','2','0'的个数相同(保证n能被3整除),并使改动后的字符串字典序最小。n不大于3∗105贪心思路,从左向右大的变小的,从右向左小的变大的:#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;str......
  • golang 闭包,装饰器
    packagemainimport( "fmt" "strings")funcmakeSuffixFunc(suffixstring)func(string)string{ returnfunc(namestring)string{ if!strings.HasSuffix(name,suffix){ returnname+suffix } returnname }}funcmain()......