On Thursday, December 15, 2016 at 10:18:57 AM UTC+8, T L wrote: > > 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. >
Tried other types, looks the situation is more possible happening for types with value size equal to 8 (on amd64). > > 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.