[erlang-questions] Erlang arithmetics

Morten Krogh <>
Mon Nov 1 08:50:35 CET 2010


Richard,

my comment was for arithmetic on same type integers between 1 and 1000. 
Clearly for bignums, the performance depends on the values.
By type I mean a fixed memory size and machine type. The OP was 
generating random integers between 0 and 1000, so I would assume that
both js and erlang would run with the same speed inpedendently of 
whether he multiplied 500 * 500, say, a million times or random1 * 
random2 a million times.
There could be a difference in the accumulator however, when the 
accumulator reached a critical size.

This statement is interesting.

The actual number of clocks depends on the position of the most
significant bit in the ... multiplier."


I tried testing on a C program that would multiply and sum (and subtract 
to avoid overflow of the accumulator).
The type was int.
It runs with exact same speed whether it is 0 * 0 or 1000 * 1000.

I also tried float multiplication and couldn't see the slightest 
difference between

0*0 and 1000000 * 1000000

in a loop of billions of iterations.

The test was on a intel core duo chip.

But I would be interested in seeing an example of such a difference. I 
guess your link shows that such examples exist.

Cheers

Morten.




On 11/1/10 4:16 AM, Richard O'Keefe wrote:
> On 30/10/2010, at 10:55 PM, Morten Krogh wrote:
>
>> Sorry, I just realized that you are only timing the inner loop, not the random number generation.
>>
>> But why bother with the random numbers then? Shouldn't multiplication and addition run with the same speed for all values of numbers of a given type?
> No.
>
> For example, according to
> http://pdos.csail.mit.edu/6.828/2007/readings/i386/IMUL.htm
> "The 80386 uses an early-out multiply algorithm.
>   The actual number of clocks depends on the position of the most
>   significant bit in the ... multiplier."
>
> Look for "early-out multiply".
>
> Since these numbers were the results of random:uniform(1000)
> they should be particularly nice cases for an early-out multiplier.
> Had they been random:uniform(1000000) the products would have
> been bignums on a 32-bit machine and thus *much* slower;
> bignum operations *definitely* depend on the size of the number.
>
> Nor can you expect the cost of + and * to be uniform for
> floats.  Operations that overflow to +/-infinity may well be
> *very* expensive on some machines.  One popular implementation
> strategy for IEEE arithmetic was to do the easy cases in hardware
> and let the operating system finish the tough jobs.
>
>
> ________________________________________________________________
> erlang-questions (at) erlang.org mailing list.
> See http://www.erlang.org/faq.html
> To unsubscribe; mailto:
>



More information about the erlang-questions mailing list