Conversion to string + string building benchmark
Robert Jacques
sandford at jhu.edu
Sat Mar 19 18:13:57 PDT 2011
On Thu, 17 Mar 2011 11:06:34 -0400, bearophile <bearophileHUGS at lycos.com>
wrote:
> About the versions:
>
> This benchmark (test1/Test1) comes from a reduction of some code of
> mine, it converts integer numbers to string and builds a single very
> long string with them. I have seen the Java code significantly faster
> than the D one.
>
> The successive benchmarks are experiments to better understand where the
> low performance comes from:
>
> test2a/Test2a just build the string, without integer conversions.
>
> test2b/Test2b just convert ints to strings.
>
> test3 is a try to perform a faster int to string conversion using the C
> library.
>
> test4 is my faster D solution, it shows that there are ways to write a D
> program faster than the Java code, but they aren't handy.
Hi bearophile,
Since I've been working on this problem recently, here's an analysis of
what's happening: Both Appender and your test cases work by growing an
array in a 'smart' manner. The issue with this approach is that once the
arrays get big the conservative GC starts pinning them due to false
pointers. This slows down the GC a lot (due to some naivety in the GC,
which is being patched) and creates excessive memory usage. And I would
hazard that Java's StringBuilder isn't giving you O(1) access to the
underlying array like Appender is, which would allow it to drastically
reduce memory churn.
In the future, you should also include program ram usages in these kind of
benchmarks.
More information about the Digitalmars-d
mailing list