T L, Why didn't you show us the output from
$ go tool compile -m -m clone_test.go ? Peter On Tuesday, June 27, 2017 at 11:33:30 AM UTC-4, T L wrote: > > 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.