On Tue, Nov 18, 2014 at 3:24 PM, phil@highoctane.be <phil@highoctane.be> wrote:
Le 18 nov. 2014 22:52, "Sven Van Caekenberghe" <sven@stfx.eu> a écrit :
On 18 Nov 2014, at 22:28, Andreas Wacknitz <A.Wacknitz@gmx.de> wrote:
Am 18.11.14 22:12, schrieb phil@highoctane.be:
See https://news.ycombinator.com/item?id=8625280
[ (1 to: 100000000) sum ] timeToRun
Here we get out of the SmallInteger range...
Apart FFI'ing the thing, do we have other options?
Phil Choose a better algorithm: [100000000 * 10000001 / 2] timeToRun should beat yours by several orders of magnitude.
Andreas
Haha, great !
Sure cool.
Now Pharo is slow on these loops with arithmetics and it is painful.
Yes, but that particular loop is low because in part it uses the sum convenience. e.g. Collection>>sum "Compute the sum of all the elements in the receiver" ^self reduce:[:a :b| a + b] Collection>>reduce: binaryBlock "Apply the argument, binaryBlock cumulatively to the elements of the receiver. For sequenceable collections the elements will be used in order, for unordered collections the order is unspecified." | first nextValue | first := true. self do: [ :each | first ifTrue: [ nextValue := each. first := false ] ifFalse: [ nextValue := binaryBlock value: nextValue value: each ] ]. first ifTrue: [ self errorEmptyCollection ]. ^nextValue | n | n := 100000000. { [ (1 to: n) sum ] timeToRun. [| s | s := 0. (1 to: n) do: [:i| s := s + i]] timeToRun. [| s | s := 0. 1 to: n do: [:i| s := s + i]] timeToRun. [n * (n + 1) / 2] timeToRun} #(10112 9538 8432 0)
Eliot, why is a class variable faster?
The expression is a constant. You can e.g. compute it at class initialization and for descriptive purposes store the result in a class variable. That's usually quicker than computing anything every time. Standard examples are specialized dispatch tables, dictionaries, etc. Class variables are a convenient way of holding onto precomputed objects. Alex, I'll a look at OpenCL.
Also, I tried with a whileTrue: loop which was 3 times faster than the sum on Collection.
How to profile these kinds of tight loops? The standard profiler is kind of useless. Is AndreasProfiler the way to go
IMO yes. It is much more accurate about primitives than the standard profiler. -- best, Eliot