【小实验】golang的if比较中的string/[]byte转换会被编译器优化
之前做了实验,[]byte类型使用string()进行转换的时候,会产生拷贝。see: 【小测试】golang中使用string()来转换[]byte数组产生了拷贝
不过今天又有了新的认识。请先看下面的benchmark测试:
// goos: windows
// goarch: amd64
// pkg: git.woa.com/ahfuzhang/go_proxy/internal
// cpu: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
// BenchmarkStringCompare
// BenchmarkStringCompare-8 15305848 73.45 ns/op
func BenchmarkStringCompare(b *testing.B) {
buf := make([]byte, 1024)
for i := 0; i < cap(buf); i++ {
buf[i] = byte(rand.Intn(125-32) + 32)
}
total := 0
for n := 0; n < b.N; n++ {
start1 := rand.Intn(len(buf))
len1 := rand.Intn(len(buf) - start1)
start2 := rand.Intn(len(buf))
len2 := rand.Intn(len(buf) - start2)
if bytes.Compare(buf[start1:start1+len1], buf[start2:start2+len2]) == 0 {
total++
}
}
}
// goos: windows
// goarch: amd64
// pkg: git.woa.com/ahfuzhang/go_proxy/internal
// cpu: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
// BenchmarkStringCompare1
// BenchmarkStringCompare1-8 16340803 69.47 ns/op
func BenchmarkStringCompare1(b *testing.B) {
buf := make([]byte, 1024)
for i := 0; i < cap(buf); i++ {
buf[i] = byte(rand.Intn(125-32) + 32)
}
total := 0
for n := 0; n < b.N; n++ {
start1 := rand.Intn(len(buf))
len1 := rand.Intn(len(buf) - start1)
start2 := rand.Intn(len(buf))
len2 := rand.Intn(len(buf) - start2)
if string(buf[start1:start1+len1]) == string(buf[start2:start2+len2]) {
total++
}
}
}
// goos: windows
// goarch: amd64
// pkg: git.woa.com/ahfuzhang/go_proxy/internal
// cpu: Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz
// BenchmarkStringCompare2
// BenchmarkStringCompare2-8 4692843 263.5 ns/op
func BenchmarkStringCompare2(b *testing.B) {
buf := make([]byte, 1024)
for i := 0; i < cap(buf); i++ {
buf[i] = byte(rand.Intn(125-32) + 32)
}
total := 0
for n := 0; n < b.N; n++ {
start1 := rand.Intn(len(buf))
len1 := rand.Intn(len(buf) - start1)
start2 := rand.Intn(len(buf))
len2 := rand.Intn(len(buf) - start2)
s1 := string(buf[start1 : start1+len1])
s2 := string(buf[start2 : start2+len2])
if s1 == s2 {
total++
}
}
}
同样是字符串的==比较,在if中直接转换,对于转换赋值后再比较,性能相差几倍。
golang官方库的源码也看到了类似的注释:
//C:\Go\src\bytes\bytes.go
// 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)
}
看来是编译器对if语句这里的比较做了特殊优化。
【小实验】golang的if比较中的string/[]byte转换会被编译器优化的更多相关文章
- c#中从string数组转换到int数组
以前一直有一个数组之间转换的东西,可是忘记了,今天也是找了好久也没有解决,最后用这种方法解决了,分享给大家. " }; int[] output = Array.ConvertAll< ...
- c#中从string数组转换到int数组及比较两个字符串相等
string[] input = { "1", "2", "3", "4", "5", " ...
- [转]c#中从string数组转换到int数组
string[] input = { "1", "2", "3", "4", "5", " ...
- Java中base64与byte[]转换
1.base64转byte[] 导包: import java.util.Base64 转换: String base64Str = base64的字符串; byte[] bytes = Base64 ...
- JAVA中BufferedImage与byte[]转换
BufferedImage转byte[] ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imgBuff, ...
- 关于JAVA中的String的使用与连接(转)
JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable). String的不可变性是Ja ...
- js中关于事件捕获与事件冒泡的小实验
1.事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div - ...
- 关于java中equals与==的区别的小实验
java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...
- ubuntu下格式化内存当硬盘使的小实验
内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...
- MongoDB 主从复制小实验
MongoDB 主从复制小实验 操作环境描述:WIN8 64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...
随机推荐
- linux centos8 安装php nginx mysql 运行phpcms网站
重新换vps,用centos8,重新配置系统环境,记下笔记: 安装nginx与php 首先安装nginx php ,安装默认版本的nginx,php默认安装7 yum install nginx ph ...
- iOS上架报错:无法添加以供审核
无法提交以供审核 要开始审核流程 必须提供以下项目 您必须为要添加的 app 提供版权信息. 您在提交 app 审核时遇到的问题是因为需要提供版权信息,而您的 app 缺少相关的版权信息.以下是解 ...
- 一文详解特权访问管理(PAM)
什么是特权访问管理(PAM)? 特权访问管理(Privileged Access Management)是一个包含网络安全策略和访问管理工具的解决方案,用于控制和监管和保护具有特权访问权限的用户.在之 ...
- 玩转Python:处理图像,两个非常重要的库,很实用,附代码
在Python中,图像处理是一个涉及图像分析.编辑和处理的广泛领域.有几个流行的库通常用于处理图像,每个库都有其特殊的功能和优势.以下是一些常用的Python图像处理库: 1. Pillow (PIL ...
- 关于“Github上传以及Clone时发生的 Failed to connect to github.com port 443: Timed out 问题解法记录
本文是记录关于如何解决 "Github上传以及Clone时发生的 Failed to connect to github.com port 443: Timed out 错误" 看 ...
- 分库分表Sharding-JDBC + MyBatis-Plus动态表名
MyBatis-Plus动态表名 1: https://blog.csdn.net/Zack_tzh/article/details/107529746?utm_medium=distribute.p ...
- spring--CGLIB动态代理的实现原理
CGLIB(Code Generation Library)是一个强大的.高性能.高质量的代码生成库,它可以在运行时扩展 Java 类和实现 Java 接口.CGLIB 动态代理是基于继承的方式来实现 ...
- 一文搞清楚Java中的方法、常量、变量、参数
写在开头 在上一篇文章:一文搞清楚Java中的包.类.接口 中我们讲了Java中的包.类和接口,今天继续将剩下的方法.常量.变量以及参数梳理完. Java中的变量与常量 在JVM的运转中,承载的是数据 ...
- 基于java+springboot的宠物商店、宠物管理系统
该系统是基于java+springboot开发的宠物商城,用户可以登录该网站购买宠物.该系统是给师弟开发的课程作业.运行过程中的问题,可以咨询github或留言. 演示地址 前台地址: http:// ...
- 【ArgParse】一个开源的入参解析库
项目地址:argtable3 本地验证: 编译构建 新增验证 // examples/skull.c #include "argtable3.h" int main(int arg ...