diff --git a/lib/zap/buf.go b/lib/zap/buf.go
index 097626c7fa3fd1efc57931c0de5912e7e5d1da42..bf9200b6f7e3bce8583f73e249081c52a96016af 100644
--- a/lib/zap/buf.go
+++ b/lib/zap/buf.go
@@ -202,15 +202,27 @@ func (T *Buf) readFloat64() (float64, bool) {
 	return math.Float64frombits(v), true
 }
 
-func (T *Buf) readString() (string, bool) {
+func (T *Buf) readUnsafeString() ([]byte, bool) {
 	rem := T.remaining()
 	for i, c := range rem {
 		if c == 0 {
 			T.pos += i + 1
-			return string(rem[:i]), true
+			return rem[:i], true
 		}
 	}
-	return "", false
+	return nil, false
+}
+
+func (T *Buf) readStringBytes(v []byte) ([]byte, bool) {
+	str, ok := T.readUnsafeString()
+	v = slices.Resize(v, len(str))
+	copy(v, str)
+	return v, ok
+}
+
+func (T *Buf) readString() (string, bool) {
+	str, ok := T.readUnsafeString()
+	return string(str), ok
 }
 
 func (T *Buf) readBytes(b []byte) bool {
@@ -283,6 +295,11 @@ func (T *Buf) writeFloat64(v float64) {
 	T.writeUint64(math.Float64bits(v))
 }
 
+func (T *Buf) writeStringBytes(v []byte) {
+	T.buf = append(T.buf, v...)
+	T.buf = append(T.buf, 0)
+}
+
 func (T *Buf) writeString(v string) {
 	T.buf = append(T.buf, v...)
 	T.buf = append(T.buf, 0)
diff --git a/lib/zap/in.go b/lib/zap/in.go
index 6cc3b9f62a58a3a412aa723b7db551ff509d502e..5eecf6258d924ab3f7af27ad9c0ca09b75f64470 100644
--- a/lib/zap/in.go
+++ b/lib/zap/in.go
@@ -70,6 +70,11 @@ func (T In) Float64() (float64, bool) {
 	return T.buf.readFloat64()
 }
 
+func (T In) StringBytes(b []byte) ([]byte, bool) {
+	T.buf.assertRev(T.rev)
+	return T.buf.readStringBytes(b)
+}
+
 func (T In) String() (string, bool) {
 	T.buf.assertRev(T.rev)
 	return T.buf.readString()
diff --git a/lib/zap/out.go b/lib/zap/out.go
index 9aec94afd08cd8aaf7a9a3c95a28aa59b5a6de1a..551f9d8c1405c9a9c9282bad9244b9af9066943c 100644
--- a/lib/zap/out.go
+++ b/lib/zap/out.go
@@ -70,6 +70,11 @@ func (T Out) Float64(v float64) {
 	T.buf.writeFloat64(v)
 }
 
+func (T Out) StringBytes(v []byte) {
+	T.buf.assertRev(T.rev)
+	T.buf.writeStringBytes(v)
+}
+
 func (T Out) String(v string) {
 	T.buf.assertRev(T.rev)
 	T.buf.writeString(v)
diff --git a/lib/zap/zio/readwriter.go b/lib/zap/zio/readwriter.go
index b5abf5ac4f2fc8ed8af0e91a99c143e55cf15323..0f09732e6b6bdcbbbbc3ba02cecfbe536f9c9331 100644
--- a/lib/zap/zio/readwriter.go
+++ b/lib/zap/zio/readwriter.go
@@ -9,7 +9,8 @@ import (
 )
 
 type ReadWriter struct {
-	rw  dio.ReadWriter
+	rw dio.ReadWriter
+	// they are seperated out to prevent an expensive runtime.convI2I (which causes runtime.getitab)
 	r   io.Reader
 	w   io.Writer
 	buf zap.Buf