On Jan 6, 2022, at 4:35 PM, Jimmie Houchin <[email protected]> wrote:
>
> No, it is an array of floats. The only integers in the test are in the
> indexes of the loops.
>
> Number random. "generates a float 0.8188008774329387"
>
> So in the randarray below it is an array of 28800 floats.
>
> It just felt so wrong to me that Python3 was so much faster. I don't care if
> Nim, Crystal, Julia are faster. But...
>
>
> I am new to Iceberg and have never shared anything on Github so this is all
> new to me. I uploaded my language test so you can see what it does. It is a
> micro-benchmark. It does things that are not realistic in an app. But it does
> stress a language in areas important to my app.
>
>
> https://github.com/jlhouchin/LanguageTestPharo
>
>
> Let me know if there is anything else I can do to help solve this problem.
>
> I am a lone developer in my spare time. So my apologies for any ugly code.
>
Are you sure that you have the same algorithm in Python? You are calling sum
and average inside the loop where you are modifying the array:
1 to: nsize do: [ :j || n |
n := narray at: j.
narray at: j put: (self loop1calc: i j: j n: n).
nsum := narray sum.
navg := narray average ]
As a result, you are calculating the sum of the 28,800 size array 28,800 times
(plus another 28,800 times for the average). If I write a similar loop in
Python, it looks like it would take almost 9 minutes on my machine without
using numpy to calculate the sum. The Pharo code takes ~40 seconds. If this is
really how the code should be, then I would change it to not call sum twice
(once for sum and once in average). This will almost result in a 2x speedup.
You could also modify the algorithm to update the nsum value in the loop
instead of summing the array each time. I think the updating would require
<120,000 math ops vs the >1.6 billion that you are performing.
John Brant