Skip to content

Commit ed47a10

Browse files
mamebyroot
authored andcommitted
Stop prebuilding object_delim
This speeds up `JSON.generate` by about 4% in a benchmark
1 parent 445de6e commit ed47a10

File tree

2 files changed

+1
-13
lines changed

2 files changed

+1
-13
lines changed

ext/json/ext/generator/generator.c

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,6 @@ static void State_free(void *ptr)
421421
if (state->space_before) ruby_xfree(state->space_before);
422422
if (state->object_nl) ruby_xfree(state->object_nl);
423423
if (state->array_nl) ruby_xfree(state->array_nl);
424-
if (state->object_delim) fbuffer_free(state->object_delim);
425424
if (state->object_delim2) fbuffer_free(state->object_delim2);
426425
ruby_xfree(state);
427426
}
@@ -435,7 +434,6 @@ static size_t State_memsize(const void *ptr)
435434
if (state->space_before) size += state->space_before_len + 1;
436435
if (state->object_nl) size += state->object_nl_len + 1;
437436
if (state->array_nl) size += state->array_nl_len + 1;
438-
if (state->object_delim) size += FBUFFER_CAPA(state->object_delim);
439437
if (state->object_delim2) size += FBUFFER_CAPA(state->object_delim2);
440438
return size;
441439
}
@@ -650,14 +648,12 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
650648
long object_nl_len = state->object_nl_len;
651649
char *indent = state->indent;
652650
long indent_len = state->indent_len;
653-
char *delim = FBUFFER_PTR(state->object_delim);
654-
long delim_len = FBUFFER_LEN(state->object_delim);
655651
char *delim2 = FBUFFER_PTR(state->object_delim2);
656652
long delim2_len = FBUFFER_LEN(state->object_delim2);
657653
long depth = state->depth;
658654
int j;
659655

660-
if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len);
656+
if (arg->iter > 0) fbuffer_append_char(buffer, ',');
661657
if (object_nl) {
662658
fbuffer_append(buffer, object_nl, object_nl_len);
663659
}
@@ -889,12 +885,6 @@ static FBuffer *cState_prepare_buffer(VALUE self)
889885
GET_STATE(self);
890886
buffer = fbuffer_alloc(state->buffer_initial_length);
891887

892-
if (state->object_delim) {
893-
fbuffer_clear(state->object_delim);
894-
} else {
895-
state->object_delim = fbuffer_alloc(16);
896-
}
897-
fbuffer_append_char(state->object_delim, ',');
898888
if (state->object_delim2) {
899889
fbuffer_clear(state->object_delim2);
900890
} else {
@@ -1016,7 +1006,6 @@ static VALUE cState_init_copy(VALUE obj, VALUE orig)
10161006
objState->space_before = fstrndup(origState->space_before, origState->space_before_len);
10171007
objState->object_nl = fstrndup(origState->object_nl, origState->object_nl_len);
10181008
objState->array_nl = fstrndup(origState->array_nl, origState->array_nl_len);
1019-
if (origState->object_delim) objState->object_delim = fbuffer_dup(origState->object_delim);
10201009
if (origState->object_delim2) objState->object_delim2 = fbuffer_dup(origState->object_delim2);
10211010
return obj;
10221011
}

ext/json/ext/generator/generator.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ typedef struct JSON_Generator_StateStruct {
5555
long object_nl_len;
5656
char *array_nl;
5757
long array_nl_len;
58-
FBuffer *object_delim;
5958
FBuffer *object_delim2;
6059
long max_nesting;
6160
char allow_nan;

0 commit comments

Comments
 (0)