Golang byte 拼接方法性能对比

Golang byte 拼接方法性能对比


最近项目上遇到需要将[]Byte进行拼接的需求,对[]Byte拼接的各种方法进行了对比,测试代码如下:

package main
import (
	"bytes"
	"fmt"
	"time"
)
func main() {
	count := 1000000
	oneSerail := []byte{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
	s0 := time.Now()
	for i := 0; i < count; i++ {
		str0 := make([][]byte, 8)
		str0[0] = oneSerail[0:4]
		str0[1] = oneSerail[4:6]
		str0[2] = oneSerail[6:10]
		str0[3] = oneSerail[0:2]
		str0[4] = oneSerail[2:6]
		str0[5] = oneSerail[6:8]
		str0[6] = oneSerail[0:4]
		str0[7] = oneSerail[8:10]
		bytes.Join(str0, []byte(""))
	}
	e0 := time.Now()
	d0 := e0.Sub(s0)
	fmt.Printf("time of way(0)=%v\n", d0)
	s1 := time.Now()
	for i := 0; i < count; i++ {
		str1 := make([]byte, 0)
		str1 = append(str1, oneSerail[0])
		str1 = append(str1, oneSerail[1])
		str1 = append(str1, oneSerail[2])
		str1 = append(str1, oneSerail[3])
		str1 = append(str1, oneSerail[4])
		str1 = append(str1, oneSerail[5])
		str1 = append(str1, oneSerail[6])
		str1 = append(str1, oneSerail[7])
		str1 = append(str1, oneSerail[8])
		str1 = append(str1, oneSerail[9])
		str1 = append(str1, oneSerail[0])
		str1 = append(str1, oneSerail[1])
		str1 = append(str1, oneSerail[2])
		str1 = append(str1, oneSerail[3])
		str1 = append(str1, oneSerail[4])
		str1 = append(str1, oneSerail[5])
		str1 = append(str1, oneSerail[6])
		str1 = append(str1, oneSerail[7])
		str1 = append(str1, oneSerail[8])
		str1 = append(str1, oneSerail[9])
		str1 = append(str1, oneSerail[0])
		str1 = append(str1, oneSerail[1])
		str1 = append(str1, oneSerail[2])
		str1 = append(str1, oneSerail[3])
		str1 = append(str1, oneSerail[4])
		str1 = append(str1, oneSerail[5])
		str1 = append(str1, oneSerail[6])
		str1 = append(str1, oneSerail[7])
		str1 = append(str1, oneSerail[8])
		str1 = append(str1, oneSerail[9])
	}
	e1 := time.Now()
	d1 := e1.Sub(s1)
	fmt.Printf("time of way(1)=%v\n", d1)
	s2 := time.Now()
	for i := 0; i < count; i++ {
		str2 := make([]byte, 0)
		str2 = append(str2, oneSerail[0:4]...)
		str2 = append(str2, oneSerail[4:6]...)
		str2 = append(str2, oneSerail[6:10]...)
		str2 = append(str2, oneSerail[0:2]...)
		str2 = append(str2, oneSerail[2:6]...)
		str2 = append(str2, oneSerail[6:8]...)
		str2 = append(str2, oneSerail[0:4]...)
		str2 = append(str2, oneSerail[4:8]...)
		str2 = append(str2, oneSerail[8:10]...)
	}
	e2 := time.Now()
	d2 := e2.Sub(s2)

	fmt.Printf("time of way(2)=%v\n", d2)

	s3 := time.Now()

	for i := 0; i < count; i++ {
		str3 := make([]byte, 30)
		for j := 0; j < 30; j++ {
			str3[j] = oneSerail[j%10]
		}
	}
	e3 := time.Now()
	d3 := e3.Sub(s3)
	fmt.Printf("time of way(3)=%v\n", d3)
	s4 := time.Now()
	for i := 0; i < count; i++ {
		var buf bytes.Buffer
		for j := 0; j < 3; j++ {
			buf.Write(oneSerail)
		}
		//fmt.Println(buf.Bytes())
	}
	e4 := time.Now()
	d4 := e4.Sub(s4)
	fmt.Printf("time of way(4)=%v\n", d4)
}

运行结果如下:

time of way(0)=194.6382ms
time of way(1)=186.6535ms
time of way(2)=136.7474ms
time of way(3)=65.876ms
time of way(4)=107.3008ms

结果分析:
1,bytes.Join耗时最久,可能是因为在进行Join的时候需要进行重新内存分配导致;
2,单byte进行append耗时比bytes.Join短,但是有限;
3,[]byte…进行append的耗时比1和2短,因为append操作的次数比2少很多;
4,最快的方法,但是需要预知拼接后byte组的大小;
5,刚刚看到一篇文章,用bytes.Buffer来拼接。这个方法在已知拼接后byte组长度的情况下,没有4快,但是优势是在未知byte组长度的情况下,比1、2、3都快。

总结:golang的内存分配真的很耗时。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用中提到的文章,《golang java 对比_golang编程语言和java的性能对比》,可以进一步了解Golang和Java在并发情况下的性能对比。引用中的文章《Golang与Java各方面使用对比(下)》也提供了对Golang和Java的比较。根据这些参考内容,我们可以得出以下结论: Golang相对于Java在并发方面具有更好的性能Golang通过goroutine和channel的机制实现高效的并发编程,而Java的线程模型在大量并发情况下可能会导致性能下降。Golang的并发模型可以更好地利用多核处理器,并且具有更低的内存占用。 此外,Golang还通过垃圾回收机制和快速编译等特性提供了更高的性能Golang的垃圾回收机制可以在运行时自动回收不再使用的内存,而Java的垃圾回收机制可能会导致一些性能损失。另外,Golang的编译器可以快速编译代码,并且生成的可执行文件相对较小,这也有助于提高性能。 然而,需要注意的是,性能对比不仅仅取决于编程语言本身,还与具体的应用场景和实现方式有关。在某些特定的应用领域中,Java可能具有更好的性能。因此,在选择编程语言时,应根据具体需求和场景来进行评估和选择。 总而言之,根据参考内容,Golang相对于Java在并发方面具有更好的性能,并且通过垃圾回收机制和快速编译等特性提供了更高的性能。但是,在具体应用场景中,还需根据需求和场景来进行评估和选择。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Golang与Java的并发性能对比](https://blog.csdn.net/yehuijun/article/details/126223686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Golang与Java各方面使用对比(上)](https://blog.csdn.net/pbrlovejava/article/details/108920137)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值