Skip to content

Commit 67bf536

Browse files
committed
Unpacker: always feed string references
Unless you are feeding the unpacker with lots of very small chunks, there is really nothing to gain in copying these strings in the buffer. We're much better to just hold a CoW string reference that we'll free very soon.
1 parent d6ab69a commit 67bf536

3 files changed

Lines changed: 3 additions & 24 deletions

File tree

ext/msgpack/buffer.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,14 +330,12 @@ static inline void _msgpack_buffer_append_reference(msgpack_buffer_t* b, VALUE s
330330

331331
void _msgpack_buffer_append_long_string(msgpack_buffer_t* b, VALUE string)
332332
{
333-
size_t length = RSTRING_LEN(string);
334-
335333
if(b->io != Qnil) {
336334
msgpack_buffer_flush(b);
337335
if (ENCODING_GET(string) == msgpack_rb_encindex_ascii8bit) {
338336
rb_funcall(b->io, b->io_write_all_method, 1, string);
339337
} else {
340-
msgpack_buffer_append(b, RSTRING_PTR(string), length);
338+
msgpack_buffer_append(b, RSTRING_PTR(string), RSTRING_LEN(string));
341339
}
342340
} else {
343341
_msgpack_buffer_append_reference(b, string);

ext/msgpack/buffer.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,7 @@ static inline size_t msgpack_buffer_append_string(msgpack_buffer_t* b, VALUE str
267267
static inline size_t msgpack_buffer_append_string_reference(msgpack_buffer_t* b, VALUE string)
268268
{
269269
size_t length = RSTRING_LEN(string);
270-
271-
if(length > MSGPACK_BUFFER_STRING_WRITE_REFERENCE_MINIMUM) {
272-
_msgpack_buffer_append_long_string(b, string);
273-
274-
} else {
275-
msgpack_buffer_append(b, RSTRING_PTR(string), length);
276-
}
277-
270+
_msgpack_buffer_append_long_string(b, string);
278271
return length;
279272
}
280273

ext/msgpack/unpacker_class.c

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -249,18 +249,6 @@ static VALUE Unpacker_read_map_header(VALUE self)
249249
return ULONG2NUM(size); // long at least 32 bits
250250
}
251251

252-
253-
static VALUE Unpacker_feed(VALUE self, VALUE data)
254-
{
255-
msgpack_unpacker_t *uk = MessagePack_Unpacker_get(self);
256-
257-
StringValue(data);
258-
259-
msgpack_buffer_append_string(UNPACKER_BUFFER_(uk), data);
260-
261-
return self;
262-
}
263-
264252
static VALUE Unpacker_feed_reference(VALUE self, VALUE data)
265253
{
266254
msgpack_unpacker_t *uk = MessagePack_Unpacker_get(self);
@@ -457,7 +445,7 @@ void MessagePack_Unpacker_module_init(VALUE mMessagePack)
457445
rb_define_method(cMessagePack_Unpacker, "skip_nil", Unpacker_skip_nil, 0);
458446
rb_define_method(cMessagePack_Unpacker, "read_array_header", Unpacker_read_array_header, 0);
459447
rb_define_method(cMessagePack_Unpacker, "read_map_header", Unpacker_read_map_header, 0);
460-
rb_define_method(cMessagePack_Unpacker, "feed", Unpacker_feed, 1);
448+
rb_define_method(cMessagePack_Unpacker, "feed", Unpacker_feed_reference, 1);
461449
rb_define_method(cMessagePack_Unpacker, "feed_reference", Unpacker_feed_reference, 1);
462450
rb_define_method(cMessagePack_Unpacker, "each", Unpacker_each, 0);
463451
rb_define_method(cMessagePack_Unpacker, "feed_each", Unpacker_feed_each, 1);

0 commit comments

Comments
 (0)