summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <[email protected]>2023-12-27 15:48:17 +0900
committergit <[email protected]>2024-10-17 08:54:47 +0000
commit186e77209e74c3f7643ae6396ad3dbba8a5c6977 (patch)
treeaad00bdf51f3b0c08844c67f6b5306af0b23e786
parent88719fb300e0c6f5d8269224a3322e9871ad29b2 (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
-rw-r--r--ext/json/generator/generator.c13
-rw-r--r--ext/json/generator/generator.h1
2 files changed, 1 insertions, 13 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;
}
diff --git a/ext/json/generator/generator.h b/ext/json/generator/generator.h
index b1a19df730..213e94a9c6 100644
--- a/ext/json/generator/generator.h
+++ b/ext/json/generator/generator.h
@@ -55,7 +55,6 @@ typedef struct JSON_Generator_StateStruct {
long object_nl_len;
char *array_nl;
long array_nl_len;
- FBuffer *object_delim;
FBuffer *object_delim2;
long max_nesting;
char allow_nan;