go的数组拼接方法append()的性能问题

1.背景:刷leetcode 216题

2.第一次提交的func combinationSum3(k int, n int) [][]int {

result := new([][]int)
	var array []int
	getInt(result, n, k, 9, array, 0)
	return *result
}

//
func getInt(result *[][]int, n, k, now int, nowArray []int, num int) {
	//跳出条件数组长度等于k的时候跳出,不管是否成功
	if len(nowArray) == k {
		if num == n {
			x := make([]int, k)
			copy(x, nowArray)
			*result = append(*result, x)
		}
		return
	}
	for i := now; i >= 1; i-- {
		//当nowArray
		if num+i <= n {
			nowArray = append(nowArray, i)
			getInt(result, n, k, i-1, nowArray, num+i)
			//还原nowArray
			nowArray = nowArray[:len(nowArray)-1]
		}
	}
}

3.第二次提交

func combinationSum3(k int, n int) [][]int {
	result := [][]int{}

	var array []int
	getInt(&result, n, k, 9, array, 0)
	return result
}

//
func getInt(result *[][]int, n, k, now int, nowArray []int, num int) {
	//跳出条件数组长度等于k的时候跳出,不管是否成功
	if len(nowArray) == k {
		if num == n {
			x := make([]int, k)
			copy(x, nowArray)
			*result = append(*result, x)
		}
		return
	}
	for i := now; i >= 1; i-- {
		//当nowArray
		if num+i <= n {
			nowArray = append(nowArray, i)
			getInt(result, n, k, i-1, nowArray, num+i)
			//还原nowArray
			nowArray = nowArray[:len(nowArray)-1]
		}
	}
}

4.第一次result是指针平均时间4ms,第二次是数组平均时间是0ms

我以为数组和指针在进行拼接的时间性能差距很大,问了chatgpt,说确实存在性能差距,让他给了个demo

import (
	"fmt"
	"testing"
)

func BenchmarkAppendPointer(b *testing.B) {
	var result [][]int
	for i := 0; i < b.N; i++ {
		x := make([]int, 0)
		result = append(result, x)
	}
}

func BenchmarkAppendSlice(b *testing.B) {
	result := [][]int{}
	for i := 0; i < b.N; i++ {
		x := make([]int, 0)
		result = append(result, x)
	}
}

func main() {
	// 比较使用指针和切片的追加操作性能
	fmt.Println("Benchmark Append Pointer:")
	fmt.Println(testing.Benchmark(BenchmarkAppendPointer))
	fmt.Println("Benchmark Append Slice:")
	fmt.Println(testing.Benchmark(BenchmarkAppendSlice))
}

在这里插入图片描述

5.结论

运行了3次,执行结果来看确实有性能差距,但是差距没那么大应该是leecode问题,日常开发还是需要注意的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值