I wrote a test function that makes various speed-checks. The number Ireport are in Rosetta emulation, but it does not matter, since they are"good enough" and the point is not to bench RB against other "native"languages, but to test RB against itself.However, running in Windows gaves about a 2x improvement respect toRosetta code.
All loops involve 1000000(10e6) iterations (double loop make 1000 * 1000iterations). I also tried with 10000000 (10e7) iterations and it tookabout 10 times more than the 1000000(10e6) iteration. That is to saybechmarks are linear with number of elements (as expected). I didn't trybigger values as it involved paging, thus making quite useless the test.
The first one is a void loop. It takes 0.09 seconds on my MacIntel. Then I made a double void loop. It takes the same time. That is to sayusing two nested for does not take more time.
Then I made a simple loop that copies a variable into another variable.This runs in 0.17 seconds. Good.The third loop puts in the variable array elements. 0.17 seconds. Thesame. So arrays are well optimized: accessing an element of an arraytakes the very same time than accessing a single variable.
I then tried using two dimensional arrays: we get to 0.22 seconds. Sothis is slower, but not a *lot* slower (even if for large objects this+33% can make the difference).
And then memory blocks. I was surprised: 0.3 seconds. It seems thatusing memory blocks is slower than using arrays (and in fact there is arationale behind this: a lot of people use arrays to store large amountsof data, they *must* be ultra optimized. I think that MemoryBlocks areused more often in a different fashion).
#pragma DisableBackgroundTasks #pragma DisableBoundsChecking Const LoopSize = 1000000 Const SmallerLoop = 1000 Dim void_start, void_end, arr_start, arr_end As Double Dim var_start, var_end, mat_start, mat_end As Double Dim block_start, block_end, dvoid_start, dvoid_end As Double Dim var As Double Dim value As Double = 1.0 Dim arr(LoopSize) As Double Dim mat(SmallerLoop, SmallerLoop) As Double Dim block As MemoryBlock for i As Integer = 0 to UBound(arr) arr(i) = value next for i As Integer = 0 to SmallerLoop for j As Integer = 0 to SmallerLoop mat(i, j) = 1.0 next next block = NewMemoryBlock(LoopSize * 8) for i As Integer = 0 To (LoopSize-1) * 8 Step 8 block.DoubleValue(i) = 1.0 next void_start = Microseconds() for i As Integer = 0 to LoopSize next void_end = Microseconds() MsgBox "Void loop(" + Str(LoopSize) + "): " + Str((void_end - void_start)/1000000) dvoid_start = Microseconds() for i As Integer = 0 to SmallerLoop for j As Integer = 0 to SmallerLoop next next dvoid_end = Microseconds() MsgBox "Double void loop(" + Str(LoopSize) + "): " + Str((dvoid_end - dvoid_start)/1000000) var_start = Microseconds() for i As Integer = 0 to LoopSize var = value next var_end = Microseconds() MsgBox "Var loop(" + Str(LoopSize) + "): " + Str((var_end - var_start)/1000000) arr_start = Microseconds() for i As Integer = 0 to LoopSize var = value next arr_end = Microseconds() MsgBox "Arr loop(" + Str(LoopSize) + "): " + Str((arr_end - arr_start)/1000000) mat_start = Microseconds() for i As Integer = 0 to SmallerLoop for j As Integer = 0 to SmallerLoop var = mat(i, j) next next mat_end = Microseconds() MsgBox "Mat loop(" + Str(LoopSize) + "): " + Str((mat_end - mat_start)/1000000) block_start = Microseconds() for i As Integer = 0 To (LoopSize-1) * 8 Step 8 var = block.DoubleValue(i) next block_end = Microseconds() MsgBox "Block loop(" + Str(LoopSize) + "): " + Str((block_end - block_start)/1000000) block_start = Microseconds() for i As Integer = 0 To (LoopSize-1) var = block.DoubleValue(i*8) next block_end = Microseconds() MsgBox "Block loop(" + Str(LoopSize) + "): " + Str((block_end - block_start)/1000000)
No comments:
Post a Comment