PROTON-2229: Try to improve codec performance by reducing unnecessary allocations
diff --git a/c/src/core/codec.c b/c/src/core/codec.c
index b50f286..34f9d35 100644
--- a/c/src/core/codec.c
+++ b/c/src/core/codec.c
@@ -434,9 +434,6 @@
 
 static ssize_t pni_data_intern(pn_data_t *data, const char *start, size_t size)
 {
-  if (data->buf == NULL) {
-    data->buf = pn_buffer(size);
-  }
   size_t offset = pn_buffer_size(data->buf);
   int err = pn_buffer_append(data->buf, start, size);
   if (err) return err;
@@ -472,7 +469,10 @@
   pn_bytes_t *bytes = pni_data_bytes(data, node);
   if (!bytes) return 0;
   if (data->buf == NULL) {
-    data->buf = pn_buffer(bytes->size);
+    // Heuristic to avoid growing small buffers too much
+    // size + 1 to allow for zero termination
+    size_t size = pn_max(bytes->size+1, PNI_INTERN_MINSIZE);
+    data->buf = pn_buffer(size);
   }
   size_t oldcap = pn_buffer_capacity(data->buf);
   ssize_t offset = pni_data_intern(data, bytes->start, bytes->size);
diff --git a/c/src/core/data.h b/c/src/core/data.h
index 442760e..59e60d1 100644
--- a/c/src/core/data.h
+++ b/c/src/core/data.h
@@ -29,6 +29,7 @@
 
 typedef uint16_t pni_nid_t;
 #define PNI_NID_MAX ((pni_nid_t)-1)
+#define PNI_INTERN_MINSIZE 64
 
 typedef struct {
   char *start;