I've been reading up on game programming recently and have come across a nice little tip when using large multi-dimensional arrays.
When reading or writing values to such arrays and you need to optimise your code for maximum speed, you must make sure you write and read in 'Row Order' using Purebasic. This is because the arrays are stored in memory with the right most index's elements next to each other.
Check out this code:
Code: Select all
#ELEMENTS = 250
Global Dim TestData.f(#ELEMENTS, #ELEMENTS, #ELEMENTS)
StartTime = ElapsedMilliseconds()
;Column Ordered
For z = 0 To #ELEMENTS
For y = 0 To #ELEMENTS
For x = 0 To #ELEMENTS
TestData(x, y, z) = 0.0
Next x
Next y
Next z
ColumnTime = ElapsedMilliseconds() - StartTime
StartTime = ElapsedMilliseconds()
;Row Ordered
For x = 0 To #ELEMENTS
For y = 0 To #ELEMENTS
For z = 0 To #ELEMENTS
TestData(x, y, z) = 0.0
Next z
Next y
Next x
RowTime = ElapsedMilliseconds() - StartTime
MessageRequester("Timings", "Column Ordered: " + Str(ColumnTime) + " ms" + #LF$ + "Row Ordered: " + Str(RowTime) + " ms" + #LF$ + "Delta: " + Str(ColumnTime - RowTime))
This tip only applies to Purebasic, other languages may differ.