Skip to content
  • Jean Boussier's avatar
    fae86a70
    string.c: Directly create strings with the correct encoding · fae86a70
    Jean Boussier authored
    While profiling msgpack-ruby I noticed a very substantial amout of time
    spent in `rb_enc_associate_index`, called by `rb_utf8_str_new`.
    
    On that benchmark, `rb_utf8_str_new` is 33% of the total runtime,
    in big part because it cause GC to trigger often, but even then
    `5.3%` of the total runtime is spent in `rb_enc_associate_index`
    called by `rb_utf8_str_new`.
    
    After closer inspection, it appears that it's performing a lot of
    safety check we can assert we don't need, and other extra useless
    operations, because strings are first created and filled as ASCII-8BIT
    and then later reassociated to the desired encoding.
    
    By directly allocating the string with the right encoding, it allow
    to skip a lot of duplicated and useless operations.
    
    After this change, the time spent in `rb_utf8_str_new` is down
    to `28.4%` of total runtime, and most of that is GC.
    fae86a70
    string.c: Directly create strings with the correct encoding
    Jean Boussier authored
    While profiling msgpack-ruby I noticed a very substantial amout of time
    spent in `rb_enc_associate_index`, called by `rb_utf8_str_new`.
    
    On that benchmark, `rb_utf8_str_new` is 33% of the total runtime,
    in big part because it cause GC to trigger often, but even then
    `5.3%` of the total runtime is spent in `rb_enc_associate_index`
    called by `rb_utf8_str_new`.
    
    After closer inspection, it appears that it's performing a lot of
    safety check we can assert we don't need, and other extra useless
    operations, because strings are first created and filled as ASCII-8BIT
    and then later reassociated to the desired encoding.
    
    By directly allocating the string with the right encoding, it allow
    to skip a lot of duplicated and useless operations.
    
    After this change, the time spent in `rb_utf8_str_new` is down
    to `28.4%` of total runtime, and most of that is GC.
Loading