之前做了实验,[]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. 查看Windows系统 重启时间

    查看Windows系统 重启时间 CMD 命令 systeminfo 事件查看器 筛选:1074 6005: 开机时间.6006:关机时间

  2. 【Flask】Flask快速使用 web框架原理 Flask配置文件写法 路由系统源码分析

    目录 1 Flask介绍 1.1同步框架和异步框架的区别 1.2 flask介绍 2 Flask快速使用 3 web框架原理(了解) 4 flask 展示用户信息案例 4.1 login.html 4 ...

  3. Android Viewpager 滑动冲突解决

    这篇博客主要讲解一下几个问题 粗略地介绍一下View的事件分发机制 解决事件滑动冲突的思路及方法 ScrollView 里面嵌套ViewPager导致的滑动冲突 ViewPager里面嵌套ViewPa ...

  4. CPP-移动语义

    "Move semantics allows us to optimize the copying of objects, where we no longer need the value ...

  5. 解决MySQL在连接时警告:WARN: Establishing SSL connection without server's identity verificatio

    起因: 程序在启动时,连接MySQL数据库,发出警告️: Establishing SSL connection without server's identity verification is n ...

  6. Codeforces Round #713 (Div. 3) Person Editorial

    补题链接:Here 1512A - Spy Detected! 题意:找到唯一不同数的下标 复制数组然后比较 \(a_1\) int main() { ios_base::sync_with_stdi ...

  7. 【每日一题】1. tokitsukaze and Soldier (优先队列 + 排序)

    题目链接:Here 思路:这道题很容易看出来是考察 优先队列(priority_queue) 和 sort . 对于容忍人数越高的人来说,团队人数低也更能做到: for i = 0 to n - 1: ...

  8. i 的二次幂求和

    学习 自为风月马前卒 大佬的数学笔记 \(i^2\) 求和 查阅资料我们很容易就发现 \(\sum_{i = 1}^ni^2 = \frac{n(n + 1)(2n + 1)}{6}\) 但具体怎么求 ...

  9. 悟空活动中台 - 基于 WebP 的图片高性能加载方案

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/rSpWorfNTajtqq_pd7H-nw作者:悟空中台研发团队 一.背景 移动端网页的加载 ...

  10. redis管道技术pipeline一 ——api

    import java.io.UnsupportedEncodingException; import java.util.Set; import org.springframework.beans. ...