go的数组拼接方法append()的性能问题
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问题,日常开发还是需要注意的
更多推荐
已为社区贡献1条内容
所有评论(0)