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

Reply via email to