diff options
author | Eric Wong <e@80x24.org> | 2017-01-17 19:34:25 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2017-02-15 22:28:21 +0000 |
commit | 029d072d420f0adf98c620913fe05eba3222e244 (patch) | |
tree | 69c1fe46cff76ccb7997c1bc8c801ab047338cba /ext | |
parent | e9baac1c4f912d6394b021af9037441b1602f431 (diff) | |
download | clogger-029d072d420f0adf98c620913fe05eba3222e244.tar.gz |
Using rb_global_variable excessively can be expensive since it uses a singly-linked list to track addresses. Since these strings are all frozen and constant, put them into an array instead and only mark the array as a global to improve locality. Ruby 1.9+ has rb_gc_register_mark_object but it is not part of the documented, public API, so we're not using it, yet.
Diffstat (limited to 'ext')
-rw-r--r-- | ext/clogger_ext/clogger.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c index 83ce76a..481dd61 100644 --- a/ext/clogger_ext/clogger.c +++ b/ext/clogger_ext/clogger.c @@ -29,6 +29,7 @@ * under. */ static clockid_t hopefully_CLOCK_MONOTONIC; +static VALUE mark_ary; static void check_clock(void) { @@ -949,7 +950,7 @@ static VALUE clogger_init_copy(VALUE clone, VALUE orig) #define CONST_GLOBAL_STR2(var, val) do { \ g_##var = rb_obj_freeze(rb_str_new(val, sizeof(val) - 1)); \ - rb_global_variable(&g_##var); \ + rb_ary_push(mark_ary, g_##var); \ } while (0) #define CONST_GLOBAL_STR(val) CONST_GLOBAL_STR2(val, #val) @@ -1015,6 +1016,9 @@ void Init_clogger_ext(void) { VALUE tmp; + mark_ary = rb_ary_new(); + rb_global_variable(&mark_ary); + check_clock(); write_id = rb_intern("write"); @@ -1060,4 +1064,6 @@ void Init_clogger_ext(void) tmp = rb_const_get(rb_cObject, rb_intern("Rack")); tmp = rb_const_get(tmp, rb_intern("Utils")); cHeaderHash = rb_const_get(tmp, rb_intern("HeaderHash")); + + rb_obj_freeze(mark_ary); } |