之前做了实验,[]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转换会被编译器优化的更多相关文章

  1. c#中从string数组转换到int数组

    以前一直有一个数组之间转换的东西,可是忘记了,今天也是找了好久也没有解决,最后用这种方法解决了,分享给大家. " }; int[] output = Array.ConvertAll< ...

  2. c#中从string数组转换到int数组及比较两个字符串相等

    string[] input = { "1", "2", "3", "4", "5", " ...

  3. [转]c#中从string数组转换到int数组

    string[] input = { "1", "2", "3", "4", "5", " ...

  4. Java中base64与byte[]转换

    1.base64转byte[] 导包: import java.util.Base64 转换: String base64Str = base64的字符串; byte[] bytes = Base64 ...

  5. JAVA中BufferedImage与byte[]转换

    BufferedImage转byte[] ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(imgBuff, ...

  6. 关于JAVA中的String的使用与连接(转)

    JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable).           String的不可变性是Ja ...

  7. js中关于事件捕获与事件冒泡的小实验

    1.事件冒泡:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div - ...

  8. 关于java中equals与==的区别的小实验

    java中equals与==经常容易混淆,简单一点说就是equals比较的是值是否相等,是一种方法,==比较的两个对象在JVM中的地址,是一种操作符. 做了几个小实验比较结果. 实验一: String ...

  9. ubuntu下格式化内存当硬盘使的小实验

    内存虚拟硬盘(ramdisk)是指通过软件技术,将物理内存进行分割,将一部分内存通过虚拟技术转变为硬盘以较大幅度提升计算机数据读取速度和保护硬盘. 在ubuntu下的dev下有ram相关的文件,这些文 ...

  10. MongoDB 主从复制小实验

    MongoDB 主从复制小实验 操作环境描述:WIN8  64位操作系统,内装虚拟机为CentOS 5.5 32位系统. 操作描述:跟其他关系型数据库类似,在主库进行数据操作,将数据同步到从节点,从节 ...

随机推荐

  1. 前端资源共享方案对比-笔记:iframe/JS-SDK/微前端

    前端页面资源如何分享,常见的有iframe,其次是js-sdk.这两类的在地图类工具经常用.微前端是最佳比较火的方式.本篇是他们的对比分析. 下一篇讲 BK-VISION如何在让用户自由选择 ifra ...

  2. 火山引擎VeDI落地消费行业数据飞轮,提出“四更”新主张

    7月6日,火山引擎数智平台(VeDI)<全链路增长:数据飞轮转动消费新生力>主题活动在北京举办,会上分享了行业.企业.产品视角下的数据飞轮实践,并针对消费行业提出业务应用"四更& ...

  3. 一文读懂火山引擎A/B测试的实验类型(2)——可视化实验

    一. 概述 可视化实验,通过所见即所得的在线编辑(比如对页面中的图片.文字.颜色.位置等元素和属性进行编辑),降低在Web/H5页面优化的场景下,产品方和运营方使用A/B实验工具的成本,免除编码. 前 ...

  4. HanLP — 路径规划算法 - 求解最短路径 - 维特比(Viterbi)算法

    维特比算法:从众多路径中,挑出最优的那条,他和隐马尔可夫没有强关联 中文分词任务 语料库 => 训练集 初始.转移.发射矩阵 => 训练过程 维特比算法,得到真正结果 训练的时候,是用不到 ...

  5. 文件名: ?Ciwindows\system32 inetsrconfiglapplicationHost.config 错误:无法写入配置文件

    出现原因:出现这个问题,一般是在程序运行的时候更新程序,导致的. 解决方案: Microsoft Windows [版本 6.3.9600] (c) 2013 Microsoft Corporatio ...

  6. 【OpenSSL】​Visual Studio 2019配置OpenSSL 3.0开发环境

    OpenSSL从1.0.2版本升级为3.0.3版本后,需要对代码进行重构.如果不可用的代码太多,需要重新开一个项目.重新配置开发环境. [第一步]登录http://slproweb.com/,下载Wi ...

  7. POJ 1742 Coins(多重背包的可行性问题)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  8. vivo 云服务海量数据存储架构演进与实践

    一.写在开头 vivo 云服务提供给用户备份手机上的联系人.短信.便签.书签等数据的能力,底层存储采用 MySQL 数据库进行数据存储. 随着 vivo 云服务业务发展,云服务用户量增长迅速,存储在云 ...

  9. java8 Steam流及Optional的使用

    目录 Stream流: 获取流 1. list获取: 2. Map获取 3. 数组获取 流方法分类: 1. forEach(终结方法) 2. count计数(终结方法) 3.filter过滤 4.li ...

  10. <vue 路由 8、keep-alive的使用>

    一.     知识点 1.什么是keep-alive? keep-alive是Vue.js的一个内置组件. 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们.它自身不会渲染一个 DOM 元素,也 ...