Francis,
And, of course,
keyVals := make([]string, b.N*10)
// ...
for _, key := range keyVals {
setTwo(s, key)
}
should be
keyVals := make([]string, b.N)
// ...
for _, key := range keyVals {
setTwo(s, key)
}
or
s /b.N*10/b.N/g
Peter
On Fri, Sep 2, 2016 at 4:38 PM, peterGo <[email protected]> wrote:
> Francis,
>
> First, fix any bugs.
>
> For example, "The benchmark function must run the target code b.N times."
> https://golang.org/pkg/testing/
>
> Therefore,
>
> keyVals := make([]string, b.N*10)
> // ...
> for _, key := range keyVals {
> setOne(s, key)
> }
>
> should be
>
> keyVals := make([]string, b.N)
> // ...
> for _, key := range keyVals {
> setOne(s, key)
> }
>
> or
>
> s /b.N*10/b.N/
>
> Then, as expected,
>
> BenchmarkSetOne-4 1000000 2058 ns/op 159 B/op
> 0 allocs/op
> BenchmarkSetTwo-4 1000000 4648 ns/op 319 B/op
> 0 allocs/op
>
> Peter
>
> On Friday, September 2, 2016 at 9:07:09 AM UTC-4, Francis wrote:
>>
>> I have been working to reduce allocations in a local cache and found some
>> confusing behaviour around the allocs/op output when benchmarking.
>>
>> A simplified reproducing version is pasted at bottom.
>>
>> The behaviour is that setting a value in a single map yields 0
>> allocations, setting a value in two maps inside the same function yields 1
>> allocation. Increasing the number of times the Set*() method is called in
>> the benchmark (below I am using b.N*10) doesn't change the number of
>> allocations.
>>
>> Trying to track down this I have used GOSSAFUNC to inspect both
>> setOne(...) and setTwo(...). I couldn't identify any allocations, although
>> I am not confident in my reading of the SSA output.
>>
>> I also ran 'go test -bench=.* -memprofile mem.out' which showed 0
>> allocations.
>>
>> So I am confused and wanted to ask for clarification on these
>> measurements. It is interesting to me that the setTwo(...) function
>> allocates where the setOne(...) does not, but also that the allocations to
>> the underlying maps don't appear to be recorded by any of the tools I have
>> used here.
>>
>>
>> package test
>>
>>
>> type server struct {
>> first map[string]string
>> second map[string]string
>> }
>>
>>
>> func new() *server {
>> return &server{
>> first: make(map[string]string),
>> second: make(map[string]string),
>> }
>> }
>>
>>
>> func setOne(s *server, key string) {
>> s.first[key] = key
>> }
>>
>>
>> func setTwo(s *server, key string) {
>> s.first[key] = key
>> s.second[key] = key
>> }
>>
>> with corresponding benchmark
>>
>>
>>
>> package test
>>
>>
>> import (
>> "strconv"
>> "testing"
>> )
>>
>>
>> func BenchmarkSetOne(b *testing.B) {
>> keyVals := make([]string, b.N*10)
>> for i := range keyVals {
>> keyVals[i] = strconv.Itoa(i)
>> }
>> s := &server{
>> first: make(map[string]string),
>> second: make(map[string]string),
>> }
>> b.ResetTimer()
>> b.ReportAllocs()
>> for _, key := range keyVals {
>> setOne(s, key)
>> }
>> }
>>
>>
>> func BenchmarkSetTwo(b *testing.B) {
>> keyVals := make([]string, b.N*10)
>> for i := range keyVals {
>> keyVals[i] = strconv.Itoa(i)
>> }
>> s := &server{
>> first: make(map[string]string),
>> second: make(map[string]string),
>> }
>> b.ResetTimer()
>> b.ReportAllocs()
>> for _, key := range keyVals {
>> setTwo(s, key)
>> }
>> }
>>
>> --
> You received this message because you are subscribed to a topic in the
> Google Groups "golang-nuts" group.
> To unsubscribe from this topic, visit https://groups.google.com/d/
> topic/golang-nuts/dasvpqes7EU/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
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 [email protected].
For more options, visit https://groups.google.com/d/optout.