summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <[email protected]>2023-12-27 15:57:02 +0900
committergit <[email protected]>2024-10-17 08:54:47 +0000
commit64c24f6971ba0341a189eefb64368cf009fbb79d (patch)
tree4b3ac4fd0d5d917cd436c1eda9d1143dd9284575
parent186e77209e74c3f7643ae6396ad3dbba8a5c6977 (diff)
[ruby/json] Stop prebuilding object_delim2
Also, remove static functions that are no longer used. This speeds up `JSON.generate` by about 5% in a benchmark. https://github.com/ruby/json/commit/4c984b2017
-rw-r--r--ext/json/fbuffer/fbuffer.h15
-rw-r--r--ext/json/generator/generator.c18
-rw-r--r--ext/json/generator/generator.h1
3 files changed, 7 insertions, 27 deletions
diff --git a/ext/json/fbuffer/fbuffer.h b/ext/json/fbuffer/fbuffer.h
index 1fb9d66700..aed96d4e20 100644
--- a/ext/json/fbuffer/fbuffer.h
+++ b/ext/json/fbuffer/fbuffer.h
@@ -55,14 +55,15 @@ typedef struct FBufferStruct {
static FBuffer *fbuffer_alloc(unsigned long initial_length);
static void fbuffer_free(FBuffer *fb);
+#ifndef JSON_GENERATOR
static void fbuffer_clear(FBuffer *fb);
+#endif
static void fbuffer_append(FBuffer *fb, const char *newstr, unsigned long len);
#ifdef JSON_GENERATOR
static void fbuffer_append_long(FBuffer *fb, long number);
#endif
static void fbuffer_append_char(FBuffer *fb, char newchr);
#ifdef JSON_GENERATOR
-static FBuffer *fbuffer_dup(FBuffer *fb);
static VALUE fbuffer_to_s(FBuffer *fb);
#endif
@@ -86,10 +87,12 @@ static void fbuffer_free(FBuffer *fb)
ruby_xfree(fb);
}
+#ifndef JSON_GENERATOR
static void fbuffer_clear(FBuffer *fb)
{
fb->len = 0;
}
+#endif
static inline void fbuffer_inc_capa(FBuffer *fb, unsigned long requested)
{
@@ -168,16 +171,6 @@ static void fbuffer_append_long(FBuffer *fb, long number)
fbuffer_append(fb, buf, len);
}
-static FBuffer *fbuffer_dup(FBuffer *fb)
-{
- unsigned long len = fb->len;
- FBuffer *result;
-
- result = fbuffer_alloc(len);
- fbuffer_append(result, FBUFFER_PAIR(fb));
- return result;
-}
-
static VALUE fbuffer_to_s(FBuffer *fb)
{
VALUE result = rb_str_new(FBUFFER_PTR(fb), FBUFFER_LEN(fb));
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index 3432317ad8..cd0ae4055a 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_delim2) fbuffer_free(state->object_delim2);
ruby_xfree(state);
}
@@ -434,7 +433,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_delim2) size += FBUFFER_CAPA(state->object_delim2);
return size;
}
@@ -648,8 +646,6 @@ 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 *delim2 = FBUFFER_PTR(state->object_delim2);
- long delim2_len = FBUFFER_LEN(state->object_delim2);
long depth = state->depth;
int j;
@@ -677,7 +673,9 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
}
generate_json_string(buffer, Vstate, state, key_to_s);
- fbuffer_append(buffer, delim2, delim2_len);
+ if (RB_UNLIKELY(state->space_before)) fbuffer_append(buffer, state->space_before, state->space_before_len);
+ fbuffer_append_char(buffer, ':');
+ if (RB_UNLIKELY(state->space)) fbuffer_append(buffer, state->space, state->space_len);
generate_json(buffer, Vstate, state, val);
arg->iter++;
@@ -885,15 +883,6 @@ static FBuffer *cState_prepare_buffer(VALUE self)
GET_STATE(self);
buffer = fbuffer_alloc(state->buffer_initial_length);
- if (state->object_delim2) {
- fbuffer_clear(state->object_delim2);
- } else {
- state->object_delim2 = fbuffer_alloc(16);
- }
- if (state->space_before) fbuffer_append(state->object_delim2, state->space_before, state->space_before_len);
- fbuffer_append_char(state->object_delim2, ':');
- if (state->space) fbuffer_append(state->object_delim2, state->space, state->space_len);
-
return buffer;
}
@@ -1006,7 +995,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_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 213e94a9c6..535f2c9f98 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_delim2;
long max_nesting;
char allow_nan;
char ascii_only;