Golang`copy`时间复杂性
我想知道go的复制函数的时间复杂性 直觉上,我会假设线性时间的最坏情况。但我想知道是否有什么魔法可以进行批量分配,或者什么可以让它表现得更好的东西 我想大会会解释一些事情,但我不确定我读的是什么:pGolang`copy`时间复杂性,go,Go,我想知道go的复制函数的时间复杂性 直觉上,我会假设线性时间的最坏情况。但我想知道是否有什么魔法可以进行批量分配,或者什么可以让它表现得更好的东西 我想大会会解释一些事情,但我不确定我读的是什么:p $ GOOS=linux GOARCH=amd64 go tool compile -S main.go 通过复制行的以下输出: 然后我也尝试了5种元素: func main() { src := []int{1, 2, 3, 4, 5} dst := make([]int, l
$ GOOS=linux GOARCH=amd64 go tool compile -S main.go
通过复制行的以下输出:
然后我也尝试了5种元素:
func main() {
src := []int{1, 2, 3, 4, 5}
dst := make([]int, len(src))
numCopied := copy(dst, src)
if numCopied != 5 {
panic(fmt.Sprintf("expected 5 copied received: %d", numCopied))
}
}
通过复制行的以下输出:
我建议对复制不同大小的阵列/切片所需的时间进行基准测试。下面是一些可以让事情顺利进行的东西:
package main
import (
"fmt"
"math"
"testing"
)
func main() {
for i := 0; i < 16; i++ {
size := powerOfTwo(i)
runBench(size)
}
}
func runBench(size int) {
bench := func(b *testing.B) {
src := make([]int, size, size)
dst := make([]int, size, size)
// we don't want to measure the time
// it takes to make the arrays, so reset timer
b.ResetTimer()
for i := 0; i < b.N; i++ {
copy(dst, src)
}
}
fmt.Printf("size = %d, %s", size, testing.Benchmark(bench))
}
func powerOfTwo(i int) int {
return int(math.Pow(float64(2), float64(i)))
}
你所看到的组件实际上没有什么作用,你可以看到它们都是一样的。实际工作是在运行时完成的。请注意,所获得的效率不会改变大O时间复杂度,它们可能会降低一个系数
func main() {
src := []int{1, 2, 3, 4, 5}
dst := make([]int, len(src))
numCopied := copy(dst, src)
if numCopied != 5 {
panic(fmt.Sprintf("expected 5 copied received: %d", numCopied))
}
}
0x0086 00134 (main.go:9) CMPQ AX, $5
0x008a 00138 (main.go:9) JLE 145
0x008c 00140 (main.go:9) MOVL $5, AX
0x0091 00145 (main.go:9) MOVQ AX, "".numCopied+56(SP)
0x0096 00150 (main.go:9) MOVQ CX, (SP)
0x009a 00154 (main.go:9) LEAQ ""..autotmp_8+72(SP), CX
0x009f 00159 (main.go:9) MOVQ CX, 8(SP)
0x00a4 00164 (main.go:9) SHLQ $3, AX
0x00a8 00168 (main.go:9) MOVQ AX, 16(SP)
0x00ad 00173 (main.go:9) PCDATA $0, $0
0x00ad 00173 (main.go:9) CALL runtime.memmove(SB)
0x00b2 00178 (main.go:9) MOVQ "".numCopied+56(SP), AX
package main
import (
"fmt"
"math"
"testing"
)
func main() {
for i := 0; i < 16; i++ {
size := powerOfTwo(i)
runBench(size)
}
}
func runBench(size int) {
bench := func(b *testing.B) {
src := make([]int, size, size)
dst := make([]int, size, size)
// we don't want to measure the time
// it takes to make the arrays, so reset timer
b.ResetTimer()
for i := 0; i < b.N; i++ {
copy(dst, src)
}
}
fmt.Printf("size = %d, %s", size, testing.Benchmark(bench))
}
func powerOfTwo(i int) int {
return int(math.Pow(float64(2), float64(i)))
}