T L,

For equivalency, why did you write,

func Benchmark_CloneWithCopy(b *testing.B) {
    for i := 0; i < b.N; i++ {
        t := make([]Element, N)
        copy(t, x)
        y = t
    }
}

instaed of

func Benchmark_CloneWithCopy(b *testing.B) {
    for i := 0; i < b.N; i++ {
        y = make([]Element, N)
        copy(y, x)
    }
}

?

Peter

On Tuesday, June 27, 2017 at 5:59:25 PM UTC-4, peterGo wrote:
>
> 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.

Reply via email to