Skip to main content

[JSR-354] Number representation on MonetaryAmount

  • From: Anatole Tresch <atsticks@...>
  • To: Jsr 354 JavaMoney Public Mailinglist <jcurrency_mail@...>
  • Subject: [JSR-354] Number representation on MonetaryAmount
  • Date: Mon, 30 Sep 2013 01:58:00 +0200

Hi all/Stephen/Werner

I was playing aroung with different variants of money implementations, one
using BD, one using a single long hereby using s scale of 5 digits for
representation of the minor units.

I then measured performance for 1.000.000 executions of some arithmetic
functions as follows:

Money money1 = Money.of(EURO, BigDecimal.ONE);
for (int i = 0; i < NUM; i++) {
money1 = money1.add(Money.of(EURO, 1234567.3444));
 money1 = money1.subtract(Money.of(EURO, 232323));
money1 = money1.multiply(3.4);
 money1 = money1.divide(5.456);
}

FastMoney money1 = FastMoney.of(EURO, BigDecimal.ONE);
for (int i = 0; i < NUM; i++) {
money1 = money1.add(FastMoney.of(EURO, 1234567.3444));
 money1 = money1.subtract(FastMoney.of(EURO, 232323));
 money1 = money1.multiply(3.4);
money1 = money1.divide(5.456);
}

This gaves me different execution times (and results):

Duration for 1000000 operations (Money/BD): 3557 ms (3 ns per loop) -> EUR
1657407.962529182
Duration for 1000000 operations (FastMoney/long): 178 ms (0 ns per loop) ->
EUR 1657407.96251

When only slightly adapting the code above to:

FastMoney money1 = FastMoney.of(EURO, BigDecimal.ONE);
for (int i = 0; i < NUM; i++) {
money1 = money1.add(*Money*.of(EURO, 1234567.3444));
 money1 = money1.subtract(FastMoney.of(EURO, 232323));
 money1 = money1.multiply(3.4);
money1 = money1.divide(5.456);
}

we have quite an unexpected impact (we are ten times slower!):

Duration for 1000000 operations (FastMoney/Money mixed): 1524 ms (1 ns per
loop) -> EUR 1657407.96251

The issue is, that FastMoney must convert from Money in the
FastMoney.from(MoneytaryAmount)  using the numeric representation as *
whole,nominator/denominator* . The acceptable result shown above, was
possible, beacuse I added temporarely the method

*Number asNumber()*

**to the interface and used this one, instead of creating a new Number 
instance
myself. When using BigDecimal within from you are significantly slower
(about 12 ns/loop).

So question: WDYT on using asNumber() instead of the methods returning
longs for whole, fraction nominator, fraction denominator? This would allow
us to support a real high speed money implementation (compared to only fast
one).

Or can somebody provide me with code that is capable of creating a
Number*real fast
* from the current interface...?

Or other ideas, hints?

Cheers,
Anatole

PS.: Hope all is clear, its late now, and I have to end my night's hacking
tour......


-- 
*Anatole Tresch*
Java Lead Engineer, JSR Spec Lead
Gl√§rnischweg 10
CH - 8620 Wetzikon

*Switzerland, Europe Zurich, GMT+1*
*Twitter:  @atsticks*
*Blogs: **http://javaremarkables.blogspot.ch/*
*Google: atsticks
Mobile  +41-76 344 62 79*


[JSR-354] Number representation on MonetaryAmount

Anatole Tresch 09/29/2013

[JSR-354] Re: Number representation on MonetaryAmount

Stephen Colebourne 09/30/2013

[JSR-354] Re: Number representation on MonetaryAmount

Anatole Tresch 09/30/2013
 
 
Close
loading
Please Confirm
Close