Manually unlock the mutex in ClientMap.SendQueue.

Rather than use defer. It is only a tiny amount faster, but this
function is frequently called.

Before:
	$ go test -bench=BenchmarkSendQueue -benchtime=2s
	BenchmarkSendQueue-4    15901834               151 ns/op
After:
	$ go test -bench=BenchmarkSendQueue -benchtime=2s
	BenchmarkSendQueue-4    15859948               147 ns/op

https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/snowflake/-/issues/40177
This commit is contained in:
David Fifield 2022-09-24 10:05:17 -06:00
parent 8e5af50bdb
commit 64491466ce
2 changed files with 21 additions and 2 deletions

View file

@ -57,8 +57,9 @@ func NewClientMap(timeout time.Duration) *ClientMap {
// necessary.
func (m *ClientMap) SendQueue(addr net.Addr) chan []byte {
m.lock.Lock()
defer m.lock.Unlock()
return m.inner.SendQueue(addr, time.Now())
queue := m.inner.SendQueue(addr, time.Now())
m.lock.Unlock()
return queue
}
// clientMapInner is the inner type of ClientMap, implementing heap.Interface.

View file

@ -0,0 +1,18 @@
package turbotunnel
import (
"testing"
"time"
)
// Benchmark the ClientMap.SendQueue function. This is mainly measuring the cost
// of the mutex operations around the call to clientMapInner.SendQueue.
func BenchmarkSendQueue(b *testing.B) {
m := NewClientMap(1 * time.Hour)
id := NewClientID()
m.SendQueue(id) // populate the entry for id
b.ResetTimer()
for i := 0; i < b.N; i++ {
m.SendQueue(id)
}
}