From: Yusuke ENDOH Date: 2010-03-08T12:39:42+09:00 Subject: [ruby-core:28551] Re: [Feature #905] Add String.new(fixnum) to preallocate large buffer Hi, 2010/3/8 Charles Oliver Nutter : >> Indeed, there is room for optimization in MRI, but in this case, >> it is not in string concatenation, I guess. > > My numbers came out somewhat differently. Make sure you're running > with the JVM's "server" mode if you run on Hotspot (Sun/OpenJDK): Ah, I didn't specify the option: user system total real loop 1.471000 0.000000 1.471000 ( 1.248000) '' << 5.906000 0.000000 5.906000 ( 5.906000) JRuby is great :-) > Here's numbers with a prototypical String.buffer implementation: > *snip* > > Of course, this 10-15% improvement could simply be because the JVM > does not provide a "realloc" for its arrays (for various reasons, some > of them presumably because it moves objects around in memory a lot). > In order to grow a string, we have to allocate a new array and copy > its contents. Under those circumstances, String.buffer makes a lot of > sense, since the copying can get expensive at large sizes. Ok, we finally grasped the situation. To sum up: - This feature is meaningless with MRI, at least, on Linux. - But it serves as a workaround for slow string concatenation of JRuby that cannot be optimized due to JVM. - Does MRI provide the feature just for script compatibility? I cannot make the judgment. Please wait for matz. -- Yusuke ENDOH