Hi everyone,

I have a piece of code which is behaving a bit strangely in benchmarks. 
Here is a simplified version of it.

The only difference is that in one case, the destination is a different 
slice. On the other case, its the same slice as source.


func BenchmarkStringCreate(b *testing.B) {
    for n := 0; n < b.N; n++ {
        DecodeStringCreate("ab")
    }
}

func BenchmarkStringNoCreate(b *testing.B) {
    for n := 0; n < b.N; n++ {
        DecodeStringNoCreate("ab")
    }
}

func DecodeStringCreate(str string) []byte {
    dst := make([]byte, 2)
    src := []byte(str)
    Decode(dst, src)
    return dst
}

func DecodeStringNoCreate(str string) []byte {
    src := []byte(str)
    Decode(src, src)
    return src
}

func Decode(dst, src []byte) {
    for i := 0; i < 1; i++ {
        dst[0] = src[0]
    }
}



BenchmarkStringCreate-4         50000000            37.2 ns/op           2 
B/op           1 allocs/op
BenchmarkStringNoCreate-4       30000000            44.3 ns/op           8 
B/op           1 allocs/op
PASS
ok      stdtest    3.279s

It seems very strange to me that on the case where I am not allocating any 
slice, allocates 8 bytes of memory, whereas, when I create the slice of 2, 
it clearly allocates only 2 bytes.

Now here is the fun part, if I change the Decode function to remove the for 
loop, all allocations go down to zero.

func Decode(dst, src []byte) {
  dst[0] = src[0]
}


BenchmarkStringCreate-4 100000000 10.2 ns/op 0 B/op 0 allocs/op
BenchmarkStringNoCreate-4 200000000 9.85 ns/op 0 B/op 0 allocs/op
PASS
ok stdtest 4.000s

How come removing the for loop changes the no. of allocations ? And the 
loop always runs only 1 iteration anyway. I have no clue as to what is 
happening here. 

Any help will be appreciated. Thanks.

-- 
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