OK, my current implementation for integers [int Erjang] is

  class EInteger extends ENumber { ... }
  class ESmall extends EInteger { int value; }
  class EBig extends EInteger { BigInteger value; }

With this, I run the bench_tak at

   MacOSX 16.3-b01-279 -server 385ms/loop
   soylatte16-i386-1.0.3 -server 500ms/loop

I tried to implement your data structure, ...

  class EInteger extends ENumber { int ival; BigInteger bival; ... }

   MacOSX 16.3-b01-279 -server 485ms/loop
   soylatte16-i386-1.0.3 -server 497ms/loop (-XX:+DoEscapeAnalysis)
   soylatte16-i386-1.0.3 -server 606ms/loop (-XX:-DoEscapeAnalysis)

With escape analysis it runs more stable, i.e. it looks like there is
much less GC going on.

Kresten

Erlang test code looks like this

-----------------------------------------------------------
tak(X,Y,Z) when Y >= X ->
    Z;
tak(X,Y,Z) ->
    tak( tak(X-1, Y, Z),
         tak(Y-1, Z, X),
         tak(Z-1, X, Y) ).

main(N) ->
    Body = fun() ->
                   Before = erlang:now(),
                   times(10, fun() -> tak(24,16,8) end),
                   After = erlang:now(),
                   Diff = timer:now_diff(After, Before),
                   io:format("run: ~pms~n", [Diff div 1000])
    end,

    timer:tc(?MODULE, times, [N, Body]).
-----------------------------------------------------------





So I tried to re-do it with essentially your



On May 29, 5:15 am, Per Bothner <[email protected]> wrote:
> On 05/28/2010 03:24 AM, Kresten Krab Thorup wrote:
>
>
>
>
>
>
>
> > On May 27, 1:17 am, Per Bothner<[email protected]>  wrote:
> >> This is another example of where structs would be helpful.  That would
> >> allow:
>
> >> struct Integer {
> >>     int ivalue;
> >>     int[] iwords;
>
> >> }
> > ....
>
> >> Kawa basically does this using a regular class gnu.math.Integer,
> >> and "small" Integers pre-allocated.  That is one reason Kawa's
> >> arbitrary-precision handling is (mostly) noticeably faster than BigInteger.
> >> (Some of that could be achieved by further tweaking BigInteger.)
>
> > 1: I'm intrigued.  How much does this give you?
>
> I don't have numbers convenient, but even with the current JVM (i.e.
> no "struct" support) the big advantage is that in most cases you
> don't allocate a "data" array, as long as the integer fits in 32 bits.
> That same you a lot of memory and gc time.  It means you have to explicitly
> check for the immediate vs array modes (i.e. words==null or not), but
> once determined you have a 32-bit number the actual work is quick,
> and requires fewer memory accesses (and hence cache misses).
>
> BigInteger could (and perhaps should) do the same optimization.
> But BigInteger has a some further overheads, including some
> seldomly-used fields.
>
> > I can see that you avoid a virtual call for all math operators where
> > you can determine the integer-ness of operands; so it does not have to
> > choose between SmallInt and BigInt objects.  But it comes at the
> > overhead of an extra word per integer.
>
> Right, but that is modest compared to the space used by BigInteger.
>
>
>
>
>
> > Integer arithmetic (most notably X+1, X-1, and X==<constant>) used in
> > loops is currently a noticeable performance issue in Erjang (when
> > comparing to the normal erlang implementation using tags).  In many
> > such cases, I could avoid a virtual call and that does sound
> > appealing.
>
> > 2: What is the motivation in Kawa to make your own bignum
> > implementation.  Why not just have
>
> > class KawaInteger {
> >     int ival;
> >     BigInteger bval;
>
> >     ...
> > }
>
> > i.e., fall back on the standard bignum implementation?
>
> That was not an option at the time: gnu.math.IntNum was implemented
> before java.math.BigInteger was available.  If I started from scratch
> that would probably have made sense to do what you're suggesting. But
> since the current implementation is faster and more space efficient
> than using BigInteger I don't see much point in ripping it out.
>
> You're free to use gnu.math.IntNum (and gnu.math in general); it has
> no dependencies on the rest of Kawa.
> --
>         --Per Bothner
> [email protected]  http://per.bothner.com/

-- 
You received this message because you are subscribed to the Google Groups "JVM 
Languages" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/jvm-languages?hl=en.

Reply via email to