But if I changed the line
type MyInt int32
to 
type MyInt int
then again, the memclr version becomes slower, or no advantage, for cases 
of slice lengths larger than 2000000.

On Thursday, December 15, 2016 at 10:05:23 AM UTC+8, T L wrote:
>
>
>
> On Wednesday, December 14, 2016 at 10:12:08 PM UTC+8, T L wrote:
>>
>> I just read this issue thread: https://github.com/golang/go/issues/5373
>> and this https://codereview.appspot.com/137880043
>> which says:
>>
>> for i := range a { 
>> a[i] = [zero val] 
>> }
>>
>> will be replaced with memclr. 
>> I made some benchmarks, but the results are disappointing. 
>> When the length of slice/array is very large, memclr is slower.
>>
>> Result
>>
>> BenchmarkMemclr_100-4           100000000            37.2 ns/op
>> BenchmarkLoop_100-4             100000000            70.7 ns/op
>> BenchmarkMemclr_1000-4          20000000           351 ns/op
>> BenchmarkLoop_1000-4            10000000           464 ns/op
>> BenchmarkMemclr_10000-4          1000000          3623 ns/op
>> BenchmarkLoop_10000-4            1000000          4940 ns/op
>> BenchmarkMemclr_100000-4          100000         49230 ns/op
>> BenchmarkLoop_100000-4            100000         58761 ns/op
>> BenchmarkMemclr_200000-4           50000         98165 ns/op
>> BenchmarkLoop_200000-4             50000        115833 ns/op
>> BenchmarkMemclr_300000-4           30000        170617 ns/op
>> BenchmarkLoop_300000-4             20000        190193 ns/op
>> BenchmarkMemclr_400000-4           20000        275676 ns/op
>> BenchmarkLoop_400000-4             20000        288729 ns/op
>> BenchmarkMemclr_500000-4           10000        410280 ns/op
>> BenchmarkLoop_500000-4             10000        416195 ns/op
>> BenchmarkMemclr_1000000-4           5000       1025504 ns/op
>> BenchmarkLoop_1000000-4             5000       1012198 ns/op
>> BenchmarkMemclr_2000000-4           2000       2071861 ns/op
>> BenchmarkLoop_2000000-4             2000       2032703 ns/op
>>
>> test code:
>>
>> package main
>>
>> import "testing"
>>
>> func memclr(a []int) {
>>     for i := range a {
>>         a[i] = 0
>>     }
>> }
>>
>> func memsetLoop(a []int, v int) {
>>     for i := range a {
>>         a[i] = v
>>     }
>> }
>>
>> var i = 0
>>
>> func BenchmarkMemclr_100(b *testing.B) {
>>     var a = make([]int, 100)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_100(b *testing.B) {
>>     var a = make([]int, 100)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_1000(b *testing.B) {
>>     var a = make([]int, 1000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_1000(b *testing.B) {
>>     var a = make([]int, 1000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_10000(b *testing.B) {
>>     var a = make([]int, 10000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_10000(b *testing.B) {
>>     var a = make([]int, 10000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_100000(b *testing.B) {
>>     var a = make([]int, 100000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_100000(b *testing.B) {
>>     var a = make([]int, 100000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_200000(b *testing.B) {
>>     var a = make([]int, 200000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_200000(b *testing.B) {
>>     var a = make([]int, 200000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_300000(b *testing.B) {
>>     var a = make([]int, 300000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_300000(b *testing.B) {
>>     var a = make([]int, 300000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_400000(b *testing.B) {
>>     var a = make([]int, 400000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_400000(b *testing.B) {
>>     var a = make([]int, 400000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_500000(b *testing.B) {
>>     var a = make([]int, 500000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_500000(b *testing.B) {
>>     var a = make([]int, 500000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_1000000(b *testing.B) {
>>     var a = make([]int, 1000000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_1000000(b *testing.B) {
>>     var a = make([]int, 1000000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>> func BenchmarkMemclr_2000000(b *testing.B) {
>>     var a = make([]int, 2000000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memclr(a)
>>     }
>> }
>>
>> func BenchmarkLoop_2000000(b *testing.B) {
>>     var a = make([]int, 2000000)
>>     b.ResetTimer()
>>     for i := 0; i < b.N; i++ {
>>         memsetLoop(a, i)
>>     }
>> }
>>
>>
>>
> I'm sorry, there is a mistake in the test code, a fixed version:
>
> package main
>
> import "testing"
>
> type MyInt int32
>
> var initialValue MyInt = 0
>
> func memclr(a []MyInt) {
>     for i := range a {
>         a[i] = 0
>     }
> }
>
> func memsetLoop(a []MyInt, v MyInt) {
>     for i := range a {
>         a[i] = v
>     }
> }
>
> func BenchmarkMemclr_10(b *testing.B) {
>     var a = make([]MyInt, 10)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_10(b *testing.B) {
>     var a = make([]MyInt, 10)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_100(b *testing.B) {
>     var a = make([]MyInt, 100)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_100(b *testing.B) {
>     var a = make([]MyInt, 100)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_1000(b *testing.B) {
>     var a = make([]MyInt, 1000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_1000(b *testing.B) {
>     var a = make([]MyInt, 1000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_10000(b *testing.B) {
>     var a = make([]MyInt, 10000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_10000(b *testing.B) {
>     var a = make([]MyInt, 10000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_100000(b *testing.B) {
>     var a = make([]MyInt, 100000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_100000(b *testing.B) {
>     var a = make([]MyInt, 100000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_200000(b *testing.B) {
>     var a = make([]MyInt, 200000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_200000(b *testing.B) {
>     var a = make([]MyInt, 200000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_300000(b *testing.B) {
>     var a = make([]MyInt, 300000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_300000(b *testing.B) {
>     var a = make([]MyInt, 300000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_400000(b *testing.B) {
>     var a = make([]MyInt, 400000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_400000(b *testing.B) {
>     var a = make([]MyInt, 400000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_500000(b *testing.B) {
>     var a = make([]MyInt, 500000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_500000(b *testing.B) {
>     var a = make([]MyInt, 500000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_1000000(b *testing.B) {
>     var a = make([]MyInt, 1000000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_1000000(b *testing.B) {
>     var a = make([]MyInt, 1000000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> func BenchmarkMemclr_2000000(b *testing.B) {
>     var a = make([]MyInt, 2000000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memclr(a)
>     }
> }
>
> func BenchmarkLoop_2000000(b *testing.B) {
>     var a = make([]MyInt, 2000000)
>     b.ResetTimer()
>     for i := 0; i < b.N; i++ {
>         memsetLoop(a, initialValue)
>     }
> }
>
> The memclr versions are really better, 
> but its advantage really becomes smaller for large size slices.
>

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