diff options
author | Yusuke Endoh <[email protected]> | 2023-12-27 15:48:17 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-10-17 08:54:47 +0000 |
commit | 186e77209e74c3f7643ae6396ad3dbba8a5c6977 (patch) | |
tree | aad00bdf51f3b0c08844c67f6b5306af0b23e786 /ext/json/generator/generator.c | |
parent | 88719fb300e0c6f5d8269224a3322e9871ad29b2 (diff) |
[ruby/json] Stop prebuilding object_delim
This speeds up `JSON.generate` by about 4% in a benchmark
https://github.com/ruby/json/commit/ed47a10e4f
Diffstat (limited to 'ext/json/generator/generator.c')
-rw-r--r-- | ext/json/generator/generator.c | 13 |
1 files changed, 1 insertions, 12 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index c0efb78e18..3432317ad8 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -421,7 +421,6 @@ static void State_free(void *ptr) if (state->space_before) ruby_xfree(state->space_before); if (state->object_nl) ruby_xfree(state->object_nl); if (state->array_nl) ruby_xfree(state->array_nl); - if (state->object_delim) fbuffer_free(state->object_delim); if (state->object_delim2) fbuffer_free(state->object_delim2); ruby_xfree(state); } @@ -435,7 +434,6 @@ static size_t State_memsize(const void *ptr) if (state->space_before) size += state->space_before_len + 1; if (state->object_nl) size += state->object_nl_len + 1; if (state->array_nl) size += state->array_nl_len + 1; - if (state->object_delim) size += FBUFFER_CAPA(state->object_delim); if (state->object_delim2) size += FBUFFER_CAPA(state->object_delim2); return size; } @@ -650,14 +648,12 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) long object_nl_len = state->object_nl_len; char *indent = state->indent; long indent_len = state->indent_len; - char *delim = FBUFFER_PTR(state->object_delim); - long delim_len = FBUFFER_LEN(state->object_delim); char *delim2 = FBUFFER_PTR(state->object_delim2); long delim2_len = FBUFFER_LEN(state->object_delim2); long depth = state->depth; int j; - if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); + if (arg->iter > 0) fbuffer_append_char(buffer, ','); if (object_nl) { fbuffer_append(buffer, object_nl, object_nl_len); } @@ -889,12 +885,6 @@ static FBuffer *cState_prepare_buffer(VALUE self) GET_STATE(self); buffer = fbuffer_alloc(state->buffer_initial_length); - if (state->object_delim) { - fbuffer_clear(state->object_delim); - } else { - state->object_delim = fbuffer_alloc(16); - } - fbuffer_append_char(state->object_delim, ','); if (state->object_delim2) { fbuffer_clear(state->object_delim2); } else { @@ -1016,7 +1006,6 @@ static VALUE cState_init_copy(VALUE obj, VALUE orig) objState->space_before = fstrndup(origState->space_before, origState->space_before_len); objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len); objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len); - if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim); if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2); return obj; } |