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.

Reply via email to