summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <[email protected]>2023-12-27 16:06:17 +0900
committergit <[email protected]>2024-10-17 08:54:47 +0000
commit0b4257efa3bd01fceefa51f2eef14d2c38e8fab8 (patch)
treefcd9f553109980dd02991c09c38a7ff826a98e76
parent64c24f6971ba0341a189eefb64368cf009fbb79d (diff)
[ruby/json] Apply RB_UNLIKELY for less frequently used options
This speeds up `JSON.generate` by about 4% in a benchmark. https://github.com/ruby/json/commit/6471710cfc
-rw-r--r--ext/json/generator/generator.c42
1 files changed, 15 insertions, 27 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index cd0ae4055a..487fc68f4d 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -642,20 +642,16 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
JSON_Generator_State *state = arg->state;
VALUE Vstate = arg->Vstate;
- char *object_nl = state->object_nl;
- long object_nl_len = state->object_nl_len;
- char *indent = state->indent;
- long indent_len = state->indent_len;
long depth = state->depth;
int j;
if (arg->iter > 0) fbuffer_append_char(buffer, ',');
- if (object_nl) {
- fbuffer_append(buffer, object_nl, object_nl_len);
+ if (RB_UNLIKELY(state->object_nl)) {
+ fbuffer_append(buffer, state->object_nl, state->object_nl_len);
}
- if (indent) {
+ if (RB_UNLIKELY(state->indent)) {
for (j = 0; j < depth; j++) {
- fbuffer_append(buffer, indent, indent_len);
+ fbuffer_append(buffer, state->indent, state->indent_len);
}
}
@@ -684,10 +680,6 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
{
- char *object_nl = state->object_nl;
- long object_nl_len = state->object_nl_len;
- char *indent = state->indent;
- long indent_len = state->indent_len;
long max_nesting = state->max_nesting;
long depth = ++state->depth;
int j;
@@ -705,11 +697,11 @@ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
rb_hash_foreach(obj, json_object_i, (VALUE)&arg);
depth = --state->depth;
- if (object_nl) {
- fbuffer_append(buffer, object_nl, object_nl_len);
- if (indent) {
+ if (RB_UNLIKELY(state->object_nl)) {
+ fbuffer_append(buffer, state->object_nl, state->object_nl_len);
+ if (RB_UNLIKELY(state->indent)) {
for (j = 0; j < depth; j++) {
- fbuffer_append(buffer, indent, indent_len);
+ fbuffer_append(buffer, state->indent, state->indent_len);
}
}
}
@@ -718,10 +710,6 @@ static void generate_json_object(FBuffer *buffer, VALUE Vstate, JSON_Generator_S
static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_State *state, VALUE obj)
{
- char *array_nl = state->array_nl;
- long array_nl_len = state->array_nl_len;
- char *indent = state->indent;
- long indent_len = state->indent_len;
long max_nesting = state->max_nesting;
long depth = ++state->depth;
int i, j;
@@ -729,25 +717,25 @@ static void generate_json_array(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
rb_raise(eNestingError, "nesting of %ld is too deep", --state->depth);
}
fbuffer_append_char(buffer, '[');
- if (array_nl) fbuffer_append(buffer, array_nl, array_nl_len);
+ if (RB_UNLIKELY(state->array_nl)) fbuffer_append(buffer, state->array_nl, state->array_nl_len);
for(i = 0; i < RARRAY_LEN(obj); i++) {
if (i > 0) {
fbuffer_append_char(buffer, ',');
if (RB_UNLIKELY(state->array_nl)) fbuffer_append(buffer, state->array_nl, state->array_nl_len);
}
- if (indent) {
+ if (RB_UNLIKELY(state->indent)) {
for (j = 0; j < depth; j++) {
- fbuffer_append(buffer, indent, indent_len);
+ fbuffer_append(buffer, state->indent, state->indent_len);
}
}
generate_json(buffer, Vstate, state, RARRAY_AREF(obj, i));
}
state->depth = --depth;
- if (array_nl) {
- fbuffer_append(buffer, array_nl, array_nl_len);
- if (indent) {
+ if (RB_UNLIKELY(state->array_nl)) {
+ fbuffer_append(buffer, state->array_nl, state->array_nl_len);
+ if (RB_UNLIKELY(state->indent)) {
for (j = 0; j < depth; j++) {
- fbuffer_append(buffer, indent, indent_len);
+ fbuffer_append(buffer, state->indent, state->indent_len);
}
}
}