From 34c047c762c31911333833c56a6dc50c52c84f5f Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 28 Jan 2021 00:49:31 +0100 Subject: device: avoid hex allocations in IpcGet benchmark old ns/op new ns/op delta BenchmarkUAPIGet-16 2872 2157 -24.90% benchmark old allocs new allocs delta BenchmarkUAPIGet-16 30 18 -40.00% benchmark old bytes new bytes delta BenchmarkUAPIGet-16 737 256 -65.26% Signed-off-by: Jason A. Donenfeld --- device/noise-types.go | 12 ------------ device/uapi.go | 17 ++++++++++++++--- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/device/noise-types.go b/device/noise-types.go index 90108d4..3688f7d 100644 --- a/device/noise-types.go +++ b/device/noise-types.go @@ -60,18 +60,10 @@ func (key *NoisePrivateKey) FromMaybeZeroHex(src string) (err error) { return } -func (key NoisePrivateKey) ToHex() string { - return hex.EncodeToString(key[:]) -} - func (key *NoisePublicKey) FromHex(src string) error { return loadExactHex(key[:], src) } -func (key NoisePublicKey) ToHex() string { - return hex.EncodeToString(key[:]) -} - func (key NoisePublicKey) IsZero() bool { var zero NoisePublicKey return key.Equals(zero) @@ -84,7 +76,3 @@ func (key NoisePublicKey) Equals(tar NoisePublicKey) bool { func (key *NoisePresharedKey) FromHex(src string) error { return loadExactHex(key[:], src) } - -func (key NoisePresharedKey) ToHex() string { - return hex.EncodeToString(key[:]) -} diff --git a/device/uapi.go b/device/uapi.go index bfef877..6f7fb2a 100644 --- a/device/uapi.go +++ b/device/uapi.go @@ -57,6 +57,17 @@ func (device *Device) IpcGetOperation(w io.Writer) error { fmt.Fprintf(buf, format, args...) buf.WriteByte('\n') } + keyf := func(prefix string, key *[32]byte) { + buf.Grow(len(key)*2 + 2 + len(prefix)) + buf.WriteString(prefix) + buf.WriteByte('=') + const hex = "0123456789abcdef" + for i := 0; i < len(key); i++ { + buf.WriteByte(hex[key[i]>>4]) + buf.WriteByte(hex[key[i]&0xf]) + } + buf.WriteByte('\n') + } func() { @@ -74,7 +85,7 @@ func (device *Device) IpcGetOperation(w io.Writer) error { // serialize device related values if !device.staticIdentity.privateKey.IsZero() { - sendf("private_key=%s", device.staticIdentity.privateKey.ToHex()) + keyf("private_key", (*[32]byte)(&device.staticIdentity.privateKey)) } if device.net.port != 0 { @@ -91,8 +102,8 @@ func (device *Device) IpcGetOperation(w io.Writer) error { peer.RLock() defer peer.RUnlock() - sendf("public_key=%s", peer.handshake.remoteStatic.ToHex()) - sendf("preshared_key=%s", peer.handshake.presharedKey.ToHex()) + keyf("public_key", (*[32]byte)(&peer.handshake.remoteStatic)) + keyf("preshared_key", (*[32]byte)(&peer.handshake.presharedKey)) sendf("protocol_version=1") if peer.endpoint != nil { sendf("endpoint=%s", peer.endpoint.DstToString()) -- cgit v1.2.3