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.