[Mono-dev] ToString() performace in Mono revisited
Atsushi Eno
atsushi at ximian.com
Sun Dec 30 10:19:07 EST 2007
Hello,
Kazuki pointed out that the static initialization part of
NumberFormatter allocates 300KB. It is probably here:
public static readonly DblRep[] DblExpTab = new DblRep [ExponentMax + 1];
It does not look good.
Atsushi Eno
Eyal Alaluf wrote:
>
>
> With the attchments zipped to reduce size.
>
>
>
> * From: * mono-devel-list-bounces at lists.ximian.com
> [mailto:mono-devel-list-bounces at lists.ximian.com] *On Behalf Of *Eyal Alaluf
> *Sent:* 27 December 2007 17:28
> *To:* mono-devel-list at lists.ximian.com
> *Cc:* Miguel de Icaza
> *Subject:* [Mono-dev] ToString() performace in Mono revisited
>
>
>
> I got complaints that the font color within the table is white so this
> is a resent J
>
>
>
> Hi, all.
>
>
>
> Attached is a redesigned implementation of the NumberFormatter class.
> The patch includes a new algorithm for float and double ToString
> implementation that improves performance by a factor of 25(!) and upto
> 440(!!!). The patch includes further improvements to integer /ToString/
> as well as Andreas suggestion of avoiding calling
> /NumberFormatInfo.CurrentInfo/ in the case of integer types default
> /ToString()/ implementation.
>
> This patch should improve Mono’s performance in important use cases such
> as web-services where primitive /ToString/ performance is an important
> factor.
>
>
>
> The following is a table showing the improvements for the different
> primitive types using the patch. All the results are in milliseconds and
> for a run of 10,000,000 iterations with warm-up of 10,000,000 iterations
> as well.
>
>
>
>
>
>
>
> Mono 1.2.6
>
>
>
> Patch
>
>
>
> Improvement
>
> 12345.ToString(“G”)
>
>
>
> 10079
>
>
>
> 7328
>
>
>
> 1.37
>
> 12345L.ToString(“G”)
>
>
>
> 13203
>
>
>
> 7297
>
>
>
> 1.81
>
> 0.12345.ToString(“G”)
>
>
>
> 323750
>
>
>
> 13047
>
>
>
> 24.8(!)
>
> 1.2345E-200.ToString(“G”)
>
>
>
> 6376500
>
>
>
> 14328
>
>
>
> 445(!!!)
>
> 0.12345m.ToString(“G”)
>
>
>
> 51078
>
>
>
> 9875
>
>
>
> 5.2
>
> 12345.ToString()
>
>
>
> 12406/7781
>
>
>
> 5687
>
>
>
> 2.2/1.37
>
> 12345L.ToString()
>
>
>
> 15703/11016
>
>
>
> 5750
>
>
>
> 2.7/1.9
>
>
>
> Note that for Mono 1.2.6 /12345/./ToString()/ there are two numbers –
> the first is Mono 1.2.6 version (which is slower then
> /12345.ToString(“G”)/!) and the second is after applying Andreas
> suggestion on top of Mono 1.2.6.
>
>
>
> The following are the results of the new algorithm compared to the old
> Mono algorithm and the .Net 2.0 native ToString performance, all three
> running on Microsoft .Net 2.0. The results show that the new code
> matches and even out-performs .Net /ToString/ implementation.
>
>
>
>
>
> Mono 1.2.6 algorithm
>
>
>
> Microsoft .Net 2.0
>
>
>
> New Patch algorithm
>
>
>
> Improvement over Mono 1.2.6
>
>
>
> Improvement over .Net 2.0
>
> 12345.ToString(“G”)
>
>
>
> 3700
>
>
>
> 2291
>
>
>
> 1827
>
>
>
> 2.0
>
>
>
> 1.25
>
> 12345L.ToString(“G”)
>
>
>
> 4559
>
>
>
> 2242
>
>
>
> 1919
>
>
>
> 2.38
>
>
>
> 1.17
>
> 0.12345.ToString(“G”)
>
>
>
> 281090
>
>
>
> 4006
>
>
>
> 3897
>
>
>
> 72.1(!!)
>
>
>
> 1.03
>
> 1.2345E-200.ToString(“G”)
>
>
>
> 5686000
>
>
>
> 4634
>
>
>
> 4613
>
>
>
> 1233(!!!)
>
>
>
> 1.00
>
> 0.12345m.ToString(“G”)
>
>
>
> 14562
>
>
>
> 3095
>
>
>
> 2294
>
>
>
> 6.3
>
>
>
> 1.35
>
> 12345.ToString()
>
>
>
> 3900/3002
>
>
>
> 2344
>
>
>
> 1313
>
>
>
> 3.0/2.3
>
>
>
> 1.79
>
> 12345L.ToString()
>
>
>
> 4684/3823
>
>
>
> 2245
>
>
>
> 1383
>
>
>
> 3.4/2.8
>
>
>
> 1.62
>
>
>
> It should be noted that the new code performance improvement are even
> more visible on top of .Net.
>
> It should also be noted that .Net runs the same algorithm 4 times faster
> then Mono. Since this code is self contained and almost completely
> algorithmic – I believe that it may serve as a good practical test case
> for improving Mono’s JIT.
>
>
>
> The redesign is composed of three main changes
>
> · An O(1) arithmetic transformation of a double (composed of
> sign, 2’s exponent and mantissa bits) to sign, long and 10’s exponent.
>
> · Using a character array instead of a string buffer to construct
> the string result.
>
> · Representing the number digits using hexadecimal values. That
> is /12345/ will be represented by /0x12345/.
>
>
>
> The patch passes Mono’s unit tests on both 1.1 and 2.0.
>
>
>
> Please review and provide us with your feedback as soon as possible.
>
>
>
> Sasha, Roei & Eyal.
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
More information about the Mono-devel-list
mailing list