• Miek Gieben's avatar
    pkg/replace: make it more efficient. (#2544) · e47d8814
    Miek Gieben authored
    * pkg/replace: make it more efficient.
    
    Remove the map that is allocated on every write and make it more static,
    but just defining a function that gets called for a label and returns
    its value.
    
    Remove the interface definition and just implement what is needed in our
    case. Add benchmark test for replace as well.
    
    Extend metadata test to test multiple values (pretty sure this didn't
    work, but there wasn't a test for it, so can't be sure).
    
    Update all callers to use it - concurrent use should be fine as we pass
    everything by value.
    
    Benchmarks in replacer:
    
    new: BenchmarkReplacer-4   300000      4717 ns/op     240 B/op       8 allocs/op
    old: BenchmarkReplacer-4   300000      4368 ns/op     384 B/op      11 allocs/op
    
    Added benchmark function to the old code to test it.
    
    ~~~
    func BenchmarkReplacer(b *testing.B) {
    	w := dnstest.NewRecorder(&test.ResponseWriter{})
    	r := new(dns.Msg)
    	r.SetQuestion("example.org.", dns.TypeHINFO)
    	r.MsgHdr.AuthenticatedData = true
    	b.ResetTimer()
    	b.ReportAllocs()
    	repl := New(context.TODO(), r, w, "")
    	for i := 0; i < b.N; i++ {
    		repl.Replace("{type} {name} {size}")
    	}
    }
    ~~~
    
    New code contains (of course a different one). The amount of ops is
    more, which might be good to look at some more. For all the allocations
    is seems it was quite performant.
    
    This looks to be 50% faster, and there is less allocations in log
    plugin:
    
    old: BenchmarkLogged-4   	   20000	     70526 ns/op
    new: BenchmarkLogged-4   	   30000	     57558 ns/op
    Signed-off-by: default avatarMiek Gieben <miek@miek.nl>
    
    * Stickler bot
    Signed-off-by: default avatarMiek Gieben <miek@miek.nl>
    
    * Improve test coverage
    Signed-off-by: default avatarMiek Gieben <miek@miek.nl>
    
    * typo
    Signed-off-by: default avatarMiek Gieben <miek@miek.nl>
    
    * Add test for malformed log lines
    Signed-off-by: default avatarMiek Gieben <miek@miek.nl>
    e47d8814
replacer.go 4.44 KB