专栏首页Go语言101Go编程中很多场合下使用append来克隆切片常常比使用copy高效得多

Go编程中很多场合下使用append来克隆切片常常比使用copy高效得多

直接上基准测试:

package main

import "testing"

type Element = int64
const N = 1024 * 1024

var y0 []Element
func Benchmark_PureMake(b *testing.B) {
  for i := 0; i < b.N; i++ {
    y0 = make([]Element, N)
  }
}

var x1 = make([]Element, N)
var y1 = make([]Element, N)
func Benchmark_PureCopy(b *testing.B) {
  for i := 0; i < b.N; i++ {
    copy(y1, x1)
  }
}

// 方法一:make + copy
var x2 = make([]Element, N)
var y2 []Element
func Benchmark_MakeAndCopy(b *testing.B) {
  for i := 0; i < b.N; i++ {
    y2 = make([]Element, N)
    copy(y2, x2)
  }
}

// 方法二:append
var x3 = make([]Element, N)
var y3 []Element
func Benchmark_Append(b *testing.B) {
  for i := 0; i < b.N; i++ {
    y3 = append(x3[:0:0], x3...)
  }
}

基准测试结果(标准编译器1.12):

Benchmark_PureMake-4     1328951 ns/op
Benchmark_PureCopy-4     1271411 ns/op
Benchmark_MakeAndCopy-4  2799283 ns/op
Benchmark_Append-4       1637352 ns/op

从这个结果可以看出,使用append来克隆切片比使用make+copy要高效得多。使用make+copy相对低效的原因是make需要将其开辟出的每个元素置零,这对于这个应用场景其实是没有必要的。

注意:

  • 今后的标准编译器版本可能会对使用make+copy方法进行优化,从而将完全消除这两种方法的性能差异。
  • 当切片的元素中包含指针时,这两种方法的性能差异并不大。
  • 此第二种方法(使用append)参考了本博“如何完美地克隆一个切片”一文。

更多关于Go语言的细节、技巧和常识,请访问《Go语言101》项目或者《Go语言101》官网,或者关注本专栏公众号(Go 101):

Go 101.jpg

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Visual Studio 2019 16.1 使用 .NET Core 3.0

    早在很久之前微软便公布 .NET Core 3.0 将支持开发Winform应用程序等等新特性,现如今 .NET Core 3.0 预览版已经出来第五个预览版了...

    晓晨
  • java8读书笔记:探究java8流收集数据原理

    本文揭示如何学习一门新技术,从示例入手,重点阐述Stream#collect方法的实现原理,为更好的使用java8中流来收集数据。

    丁威
  • Error:(1, 1) java: 非法字符: ‘\ufeff’

    错误原因是 UTF-8 文件开头添加了 BOM,IDEA不能正确读取 .java 文件从而导致程序出错。

    那一叶随风
  • API注入机制及插件启动流程_VSCode插件开发笔记2

    在插件进程环境,可以引入vscode模块访问插件可用的API,好奇一点的话,能够发现node_modules下并没有vscode模块,而且vscode模块也名没...

    ayqy贾杰
  • 经验分享丨教你怎么优化电脑系统,让你的计算机远离卡顿

    电脑系统使用时间长了都会变的卡顿,因为使用过程中产生大量的文件和垃圾,和硬盘读写过程中产生的碎片,一般使用一段时间电脑卡顿我们都会选择重装系统,但是对于某些朋友...

    半夜喝可乐
  • Defcon China 1.0 胸卡破解笔记

    不会IOT, 不会逆向, 也没去听破解胸卡的 workshop, 本菜鸡在 @hook 师傅指引下完成了这次”破解“,在此记录一下,供大家看个热闹。

    ChaMd5安全团队
  • new一个Vue

    感谢支持ayqy个人订阅号,每周义务推送1篇(only unique one)原创精品博文,话题包括但不限于前端、Node、Android、数学...

    ayqy贾杰
  • 利用vscode当golang编写IDE的配置过程

    vscode以良好的兼容性进来收到追捧。整个vscode执行效率比基于java的ide效率又高。一直用liteide来编写golang,但是liteide调试时...

    xiny120
  • 技巧:Vimdiff 使用

    各种 IDE 大行其道的同时,传统的命令行工具以其短小精悍,随手可得的特点仍有很大的生存空间,这篇短文介绍了一个文本比较和合并的小工具:vimdiff。希望能对...

    菲宇
  • 如何根据jar包的名称找到包含对应源代码的jar包

    我们经常在trouble shooting时,需要进入依赖的java库文件的源代码内进行调试,如下图所示,Eclipse提示需要指定包含了源代码的jar包:C...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券