Project

General

Profile

Feature #10326

Updated by nobu (Nobuyoshi Nakada) over 9 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) 

Back