diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-28 00:49:31 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2021-01-28 15:22:34 +0100 |
commit | 34c047c762c31911333833c56a6dc50c52c84f5f (patch) | |
tree | dca8ea6dc6fb03d939f0f012f6a61f44b6688a1e | |
parent | d4725bc45685187088c84234a6d2be396a1373e5 (diff) |
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 <Jason@zx2c4.com>
-rw-r--r-- | device/noise-types.go | 12 | ||||
-rw-r--r-- | 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()) |