Ok, I think there are two reasons why the copy version is slower: 1. the copy version initializes each element twice actutally. 2. alloc a new slice by using make is slow than by using append. But why this?
package main import ( "testing" ) const N = 1024 * 1024 // number of elements type Element int64 var x = make([]Element, N) var y []Element func Benchmark_AllocWithMake(b *testing.B) { for i := 0; i < b.N; i++ { y = make([]Element, N) } } func Benchmark_AllocWithAppend(b *testing.B) { for i := 0; i < b.N; i++ { y = append([]Element(nil), x...) } } func Benchmark_CloneWithCopy(b *testing.B) { for i := 0; i < b.N; i++ { t := make([]Element, N) copy(t, x) y = t } } func Benchmark_CloneWithAppend(b *testing.B) { for i := 0; i < b.N; i++ { y = append([]Element(nil), x...) } } Benchmark_AllocWithMake-4 1000 1223666 ns/op Benchmark_AllocWithAppend-4 2000 725361 ns/op Benchmark_CloneWithCopy-4 1000 1813321 ns/op Benchmark_CloneWithAppend-4 2000 735011 ns/op On Tuesday, June 27, 2017 at 10:58:28 PM UTC+8, T L wrote: > > > package main > > import ( > "testing" > ) > > const N = 1024 * 1024 // number of elements > type Element int64 > var x = make([]Element, N) > var y []Element > > > func Benchmark_CloneWithAppend(b *testing.B) { > for i := 0; i < b.N; i++ { > y = append([]Element(nil), x...) > } > } > > func Benchmark_CloneWithCopy(b *testing.B) { > b.ResetTimer() > for i := 0; i < b.N; i++ { > t := make([]Element, N) > copy(t, x) > y = t > } > } > > /* > $ go test -bench=. > Benchmark_CloneWithAppend-4 2000 738281 ns/op > Benchmark_CloneWithCopy-4 1000 1822462 ns/op > */ > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.