BMAX vs B3D

BlitzMax Forums/BlitzMax Programming/BMAX vs B3D

JBR(Posted 2005) [#1]
Hi, just playing around with the demo version of BMAX.

Been searching the site for speed differences with B3D and it seems BMAX is faster for maths etc. but what I'm finding is that commands such as PeekByte are 5 to 6 times slower!

Is this due to the way BMAX works compared with B3D?
i.e. are all 'highlighted' commands slower?

Any advice appreciated
Marg


FlameDuck(Posted 2005) [#2]
Have some example code (and preferably a binary too since I no longer have a working version of Blitz3D)?


skidracer(Posted 2005) [#3]
Using a bank's byte pointer directly will be faster in BlitzMax (see the BankBuf function).


Tom(Posted 2005) [#4]
Writing then reading, 100 million Integers to/from Banks

2057ms in Blitz3D
841ms in Max
;B3D...
b=CreateBank(100000000*4)
time=MilliSecs()
For i=0 To 99999999
  PokeInt b,i*4,i
Next
For i=0 To 99999999
  x=PeekInt(b,i*4)
Next
time=MilliSecs() - time
Print time
WaitKey


'Max...
Local b:TBank=CreateBank(100000000*4)
Local buf:Int Ptr=Int Ptr(BankBuf(b)) 'recasting OWNS! :)

Local time=MilliSecs()
Local i:Int,x:Int

For i=0 To 99999999
  buf[i]=i
Next
For i=0 To 99999999
  x=buf[i]
Next
time=MilliSecs() - time
Print time



ImaginaryHuman(Posted 2005) [#5]
I've been using this way here as well ... probably not a great idea to rely heavily on Poke and Peek in max. .. especially as you have to pass the number/handle of the memory bank every time (for memory protection purposes). It is much faster to cast it with pointer[0] or whatever, as above.

Also with the `Long` type, you can move 8 bytes at a time.


JBR(Posted 2005) [#6]
Thanks, does this mean that byte access is not possible using this method?

(looks like it is treated like an array)

Marg


Who was John Galt?(Posted 2005) [#7]
You just use a byte ptr instead of int ptr to read by the byte. It's all well and good saying it's faster in max with pointers, but the higher level stuff should work reasonably well, too. Can you post your original max code, Marg?


MrCredo(Posted 2005) [#8]
tip:

do not write

bank:int=createbank(...)

write

bank:Tbank=createbank(...)

this is much faster - and a bit faster than in bb-classic...


JBR(Posted 2005) [#9]
Thanks,

Nomen luni, the code is just like Toms earlier in the thread. The B3D bit run in BMax.

Does this mean we have to access Byte,Short,Int, etc like in an array? But if using peek/poke we can load/store any byte,short,int anywhere?

Marg


JBR(Posted 2005) [#10]
Hi,

Did some speed tests.

1) B3D with Toms Code takes 177
2) BMax with Toms 'BankBuf' Code takes 52
3) BMax with Toms poke/peek code takes 902

However as MrCredo says about :TBank reduces 3) down to 232 which is much nearer B3D time. Thanks MrCredo.

Here is the peek/poke using :TBank for BMax

Local b:TBank=CreateBank(10000000*4)
Local time:Int=MilliSecs()
Local i,x:Int

For i=0 To 9999999
PokeInt b,i*4,i
Next
For i=0 To 9999999
x=PeekInt(b,i*4)
Next

time=MilliSecs() - time
Print time

Thanks everyone
Marg


Who was John Galt?(Posted 2005) [#11]
Well done all - you got to the bottom of it. In answer to your question 'Do we have to read it like an array (if using pointers)' - the answer is you can read it how you like.

Say you wanted to read an int, then a byte. Get an int pointer as per Tom's max code. Read an int from the start using buf[0]. Add one to buf. As max knows buf is a pointer to int, it moves forward in memory the size of an int (4 bytes I think), to the address directly after the int. Now cast buf to a byte pointer. Buf[0] returns the value of the byte. Add one to buf skips to the memory directly after the byte. The beauty of pointers is that they know the size of what they point to, so you dont have to worry what the size of an int, byte,float etc is. This type of recasting can become a pain and banks are ideal for reading data of varied types.


Suco-X(Posted 2005) [#12]
@Marg:

Use

Local b:TBank=CreateBank(10000000*4)
Local time:Int=MilliSecs()
Local i,x:Int

For i=0 To 9999999
b.PokeInt i*4,i
Next
For i=0 To 9999999
x=b.PeekInt(i*4)
Next

time=MilliSecs() - time
Print time


Pure OO for Speed...
Because with PokeInt(Bank,...) Bmax must look intern to int handles.
If you need speed, use only the Object Oriented version, not pieces like MrCredo said....
Mfg Suco


JBR(Posted 2005) [#13]
Hi, just a note to say that the code from Suco-X runs at 155 ms which is actually faster than B3D using poke/peek in both.

Thanks all
Marg