Skip to content

Commit 8d635c6

Browse files
committed
feat: reduce string allocation for decompression
1 parent 7ced341 commit 8d635c6

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

ext/zstdruby/zstdruby.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,23 +88,22 @@ static VALUE rb_compress_using_dict(int argc, VALUE *argv, VALUE self)
8888
static VALUE decompress_buffered(ZSTD_DCtx* dctx, const char* input_data, size_t input_size)
8989
{
9090
ZSTD_inBuffer input = { input_data, input_size, 0 };
91-
VALUE result = rb_str_new(0, 0);
92-
91+
size_t const buffOutSize = ZSTD_DStreamOutSize();
92+
VALUE output_string = rb_str_buf_new(buffOutSize);
93+
ZSTD_outBuffer output = { RSTRING_PTR(output_string), buffOutSize, 0 };
9394
while (input.pos < input.size) {
94-
ZSTD_outBuffer output = { NULL, 0, 0 };
95-
output.size += ZSTD_DStreamOutSize();
96-
VALUE output_string = rb_str_new(NULL, output.size);
97-
output.dst = RSTRING_PTR(output_string);
98-
9995
size_t ret = zstd_stream_decompress(dctx, &output, &input, false);
10096
if (ZSTD_isError(ret)) {
10197
ZSTD_freeDCtx(dctx);
10298
rb_raise(rb_eRuntimeError, "%s: %s", "ZSTD_decompressStream failed", ZSTD_getErrorName(ret));
10399
}
104-
rb_str_cat(result, output.dst, output.pos);
100+
rb_str_modify_expand(output_string, buffOutSize);
101+
output.dst = RSTRING_PTR(output_string) + output.size;
102+
output.size += buffOutSize;
105103
}
104+
rb_str_set_len(output_string, output.pos);
106105
ZSTD_freeDCtx(dctx);
107-
return result;
106+
return output_string;
108107
}
109108

110109
static VALUE rb_decompress(int argc, VALUE *argv, VALUE self)

0 commit comments

Comments
 (0)