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;