Feature #10326
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
Concatenating literal strings to existing strings seems fairly common practice, so avoid extra garbage when doing it. I don't know if escape analysis is coming to Ruby, but this seems easier-to-do for now: vm2_strcat ~~~ruby i = 0 str = "" while i<6_000_000 # benchmark loop 2 i += 1 str << "const" str.clear end ~~~ ~~~ trunk 1.020890216 trunk 1.018797116 trunk 0.992393447 built 0.626914306 built 0.627910138 built 0.644469095 ~~~ ----------------------------------------------------------- benchmark results: minimum results in each 3 measurements. Execution time (sec) name |trunk trunk |built built --------+-------+------ loop_whileloop2 |0.160 0.160 |0.159 0.159 vm2_strcat* |0.833 0.833 |0.468 0.468 Speedup ratio: compare with the result of `trunk' (greater is better) name |built built --------+------- loop_whileloop2 |1.006 1.006 vm2_strcat* |1.779 1.779 Future optimizations: * recv << "interpolated #{dstr}" (immediate free + force recycle) * elide allocation for equality comparisons: str == "literal" and "literal" == str * optimize << recv is IO << (str|dstr) (maybe)