Faster access to multi-dimensional arrays...

Share your advanced PureBasic knowledge/code with the community.
Kale
PureBasic Expert
PureBasic Expert
Posts: 3000
Joined: Fri Apr 25, 2003 6:03 pm
Location: Lincoln, UK
Contact:

Faster access to multi-dimensional arrays...

Post by Kale »

Code updated for 5.20+

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))
You can see that when run, there is a big time difference writing using column ordered and row ordered access. I've usually used row access anyway in my programs but it's nice to know what speed is gained rather than using column access.

This tip only applies to Purebasic, other languages may differ. :)
--Kale

Image
KarLKoX
Enthusiast
Enthusiast
Posts: 677
Joined: Mon Oct 06, 2003 7:13 pm
Location: France
Contact:

Post by KarLKoX »

Very nice tips :!:
"Qui baise trop bouffe un poil." P. Desproges

http://karlkox.blogspot.com/
User avatar
Flype
Addict
Addict
Posts: 1542
Joined: Tue Jul 22, 2003 5:02 pm
Location: In a long distant galaxy

Post by Flype »

surely, good to know :o
No programming language is perfect. There is not even a single best language.
There are only languages well suited or perhaps poorly suited for particular purposes. Herbert Mayer
User avatar
Joakim Christiansen
Addict
Addict
Posts: 2452
Joined: Wed Dec 22, 2004 4:12 pm
Location: Norway
Contact:

Post by Joakim Christiansen »

That's usually how I do it, but I didn't know that it's faster.
Thank you for this tip it's always good to know how you can make things fastest possible. :)
I like logic, hence I dislike humans but love computers.
inc.
Enthusiast
Enthusiast
Posts: 406
Joined: Thu May 06, 2004 4:28 pm
Location: Cologne/GER

Post by inc. »

Imho cause an Array is row ordered in memory so thats why row based acess makes accessing elements faster. *just imho!*

I recognised that when doing parsing pixels in a Bitmap-array.
Normally the coordinates in pictures are seen as x,y but using y,x in the array parsing routine made it working properly.
Check out OOP support for PB here!
Post Reply