Code archives/Miscellaneous/Blitz3D commands benchmark
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Article: Command speed in Blitz3D (rus) | |||||
;Blitz3D commands benchmark by Matt Merkulov ;See results in generated "btable.htm" Type T Field i,f#,s$ End Type Const tq=91, cq=100000, times=10, symq=20 Const dtim#=1000000.0/cq Dim ns#(tq) Dim name$(tq) Dim tms(tq) Dim im(symq) Dim fm#(symq) Dim sm$(symq) Dim typ.T(cq) SeedRnd MilliSecs() For n=1 To tq Read name$(n) Next For n=1 To times*tq Repeat num=Rand(1,tq) Until tms(num)<times tms(num)=tms(num)+1 ns#(num)=ns#(num)+dtim#*benchmark(name$(num)) Next n=1 f=WriteFile("btable.htm") WriteLine f,"<HTML><BODY><TABLE>" m$="<TR>" While n<=tq If x=900 Or n=2 Then x=0 y=y+12 WriteLine f,m$ m$="</TR><TR>" End If v#=ns#(n)/times m$=m$+"<TD>"+name$(n)+": "+v#+" ns</TD>" x=x+300 n=n+1 Wend WriteLine f,m$+"</TR></TABLE></BODY></HTML>" CloseFile f ExecFile "btable.htm" Data "template" Data "A=B","D#=E#","I.T=J.T" Data "A=B+C","D#=E#+F#","I.T=New T" Data "A=B-C","D#=E#-F#","Delete I.T" Data "A=B*C","D#=E#*F#","I.T=Before J.T" Data "A=B/C","D#=E#/F#","I.T=After J.T" Data "A=B^P","D#=E#^F#","I.T=First T" Data "A=Abs(B)","D#=Abs(E#)","I.T=Last T" Data "A=Sgn(B)","D#=Sgn(E#)","Insert I.T Before J.T" Data "A=Floor(E#)","D#=Sin(E#)","Insert I.T After J.T" Data "A=Int(E#)","D#=Cos(E#)","For I.T=Each T" Data "A=Ceil(E#)","D#=Tan(E#)","Delete Each T" Data "A=B And C","D#=ASin(R#)","A=Handle(J.T)" Data "A=B Or C","D#=ACos(R#)","I.T=Object(Handle)" Data "A=B Xor C","D#=ATan(E#)","L$=M$" Data "A=B Mod PP","D#=ATan2(E#,F#)","L$=M$+S$" Data "A=B Shl PP","D#=Sqr(E#)","L$=Left$(M$,SQ)" Data "A=B Sar PP","D#=Log(G#)","L$=Right$(M$,SQ)" Data "A=Asc(S$)","D#=Log10(G#)","L$=Chr$(SYM)" Data "A=Len(M$)","D#=Exp(O#)","L$=Mid$(M$,SPOS,SQ)" Data "A=Instr(M$,S$)","","L$=String$(S$,SYMQ)" Data "A=Rand()","D#=Rnd()","L$=Replace$(M$,S$,' ')" Data "A=INTF(B)","D#=FLOATF#(E#)","L$=STRINGF$(M$)" Data "A=im(spos)","D#=fm#(spos)","L$=sm$(spos)" Data "A=J\i","D#=J\f#","L$=J\s$" Data "PokeByte","PokeFloat","PokeInt" Data "PeekByte","PeekFloat","PeekInt" Data "A=D#","D#=S$","S$=A" Data "D#=A","S$=D#","A=S$" Data "IF B=C","IF E#=F#","IF I.T=J.T" Data "IF B>C","IF E#>F#","IF M$=L$" Function benchmark(name$) If First t=Null Then For n=1 To cq I.T=New T typ(n)=I Next End If B=Rand(-2000000000,2000000000) C=Rand(-2000000000,2000000000) P=Rand(-20,20) PP=Rand(1,20) SYM=Rand(0,255) E#=Rnd(-2000000000,2000000000) F#=Rnd(-2000000000,2000000000) G#=Rnd(2,2000000000) O#=Rnd(-20,20) R#=Rnd(-1,1) I.T=typ(Rand(1,cq)) J.T=typ(Rand(2,cq-1)) If i=Null Or j=Null Then Stop SPOS=Rand(1,SYMQ) s$=Chr$(sym) bnk=CreateBank(symq+4) For n=1 To SYMQ L$=Chr$(Rand(0,255)) If nn=SPOS Then S$=L$ M$=M$+L$ Next If name$="I.T=New T" Then Delete Each T k=1 tim=MilliSecs() Select name$ Case "template":For n=1 To cq:A=B:Next Case "A=B":For n=1 To cq:A=B:A=C:Next Case "D#=E#":For n=1 To cq:A=B:D#=E#:Next Case "A=E#":For n=1 To cq:A=B:A=E#:Next Case "D#=B":For n=1 To cq:A=B:D#=B:Next Case "A=B+C":For n=1 To cq:A=B+C:Next Case "D#=E#+F#":For n=1 To cq:D#=E#+F#:Next Case "A=B-C":For n=1 To cq:A=B-C:Next Case "D#=E#-F#":For n=1 To cq:D#=E#-F#:Next Case "A=B*C":For n=1 To cq:A=B*C:Next Case "D#=E#*F#":For n=1 To cq:D#=E#*F#:Next Case "A=B/C":For n=1 To cq:A=B/C:Next Case "D#=E#/F#":For n=1 To cq:D#=E#/F#:Next Case "A=B^P":For n=1 To cq/10:A=B^P:Next:k=10 Case "D#=E#^F#":For n=1 To cq/10:D#=E#^F#:Next:k=10 Case "A=Floor(E#)":For n=1 To cq:A=Floor(E#):Next Case "A=Int(E#)":For n=1 To cq:A=Int(E#):Next Case "A=Ceil(E#)":For n=1 To cq:A=Ceil(E#):Next Case "A=Abs(B)":For n=1 To cq:A=Abs(B):Next Case "D#=Abs(E#)":For n=1 To cq:D#=Abs(E#):Next Case "A=Sgn(B)":For n=1 To cq:A=Sgn(B):Next Case "D#=Sgn(E#)":For n=1 To cq:D#=Sgn(E#):Next Case "A=B Mod PP":For n=1 To cq:A=B Mod PP:Next Case "A=B And C":For n=1 To cq:A=B And C:Next Case "A=B Or C":For n=1 To cq:A=B Or C:Next Case "A=B Xor C":For n=1 To cq:A=B Xor C:Next Case "A=B Shl PP":For n=1 To cq:A=B Shl PP:Next Case "A=B Sar PP":For n=1 To cq:A=B Sar PP:Next Case "D#=Sin(E#)":For n=1 To cq:D#=Sin(E#):Next Case "D#=Cos(E#)":For n=1 To cq:D#=Cos(E#):Next Case "D#=Tan(E#)":For n=1 To cq:D#=Tan(E#):Next Case "D#=ASin(R#)":For n=1 To cq:D#=ASin(R#):Next Case "D#=ACos(R#)":For n=1 To cq:D#=ACos(R#):Next Case "D#=ATan(E#)":For n=1 To cq:D#=ATan(E#):Next Case "D#=ATan2(E#,F#)":For n=1 To cq:D#=ATan2(E#,F#):Next Case "A=Rand()":For n=1 To cq:A=Rand(0):Next Case "D#=Rnd()":For n=1 To cq:D#=Rnd(0.0):Next Case "A=INTF(B)":For n=1 To cq:A=INTF(B):Next Case "D#=FLOATF#(E#)":For n=1 To cq:D#=FLOATF#(E#):Next Case "I.T=J.T":For n=1 To cq:I.T=J.T:Next Case "I.T=New T":For n=1 To cq:I.T=New T:Next Case "Delete I.T":For n=1 To cq:Delete typ(n):Next Case "I.T=Before J.T":For n=1 To cq:I.T=Before J.T:Next Case "I.T=After J.T":For n=1 To cq:I.T=After J.T:Next Case "I.T=First T":For n=1 To cq:I.T=First T:Next Case "I.T=Last T":For n=1 To cq:I.T=Last T:Next Case "Insert I.T Before J.T":For n=1 To cq:Insert I.T Before J.T:Next Case "Insert I.T After J.T":For n=1 To cq:Insert I.T After J.T:Next Case "For I.T=Each T":For I.T=Each T:Next Case "A=Handle(J.T)":For n=1 To cq:A=Handle(J.T):Next Case "I.T=Object(Handle)":For n=1 To cq:I.T=Object.T(Handle(J.T)):Next Case "Delete Each T":Delete Each T Case "L$=M$":For n=1 To cq/10:L$=M$:Next:k=10 Case "L$=M$+S$":For n=1 To cq/10:L$=M$+S$:Next:k=10 Case "L$=Mid$(M$,SPOS,SQ)":For n=1 To cq/10:L$=Mid$(M$,SPOS,SymQ):Next:k=10 Case "D#=Sqr(E#)":For n=1 To cq:D#=Sqr(G#):Next Case "L$=Left$(M$,SQ)":For n=1 To cq/10:L$=Left$(M$,SymQ):Next:k=10 Case "D#=Log(G#)":For n=1 To cq:D#=Log(G#):Next Case "L$=Right$(M$,SQ)":For n=1 To cq/10:L$=Right$(M$,SymQ):Next:k=10 Case "A=Asc(S$)":For n=1 To cq:A=Asc(S$):Next Case "D#=Log10(G#)":For n=1 To cq:D#=Log10(G#):Next Case "L$=String$(S$,SYMQ)":For n=1 To cq/10:L$=String$(S$,SYMQ):Next:k=10 Case "A=Len(M$)":For n=1 To cq/10:A=Len(M$):Next:k=10 Case "D#=Exp(O#)":For n=1 To cq:D#=Exp(O#):Next Case "L$=Chr$(SYM)":For n=1 To cq/10:L$=Chr$(SYM):Next:k=10 Case "A=Instr(M$,S$)":For n=1 To cq/10:A=Instr(M$,S$):Next:k=10 Case "L$=Replace$(M$,S$,' ')":For n=1 To cq/10:L$=Replace$(M$,S$," "):Next:k=10 Case "L$=STRINGF$(M$)":For n=1 To cq/10:L$=STRINGF$(M$):Next:k=10 Case "PokeByte":For n=1 To cq:PokeByte(bnk,spos,sym):Next Case "PokeInt":For n=1 To cq:PokeInt(bnk,spos,a):Next Case "PokeFloat":For n=1 To cq:PokeFloat(bnk,spos,e#):Next Case "PeekByte":For n=1 To cq:a=PeekByte(bnk,spos):Next Case "PeekInt":For n=1 To cq:a=PeekInt(bnk,spos):Next Case "PeekFloat":For n=1 To cq:d#=PeekFloat(bnk,spos):Next Case "A=im(spos)":For n=1 To cq:a=im(spos):Next Case "D#=fm#(spos)":For n=1 To cq:d#=fm#(spos):Next Case "L$=sm$(spos)":For n=1 To cq:l$=sm$(spos):Next Case "A=J\i":For n=1 To cq:a=J\i:Next Case "D#=J\f#":For n=1 To cq:d#=J\f#:Next Case "L$=J\s$":For n=1 To cq:l$=J\s$:Next Case "A=D#":For n=1 To cq:A=D#:Next Case "D#=S$":For n=1 To cq:D#=S$:Next Case "S$=A":For n=1 To cq/10:S$=A:Next:k=10 Case "D#=A":For n=1 To cq:D#=A:Next:k=10 Case "S$=D#":For n=1 To cq/10:S$=D#:Next Case "A=S$":For n=1 To cq:A=S$:Next Case "IF B=C" For n=1 To cq If B=C Then End If Next Case "IF E#=F#" For n=1 To cq If E#=F# Then End If Next Case "IF I.T=J.T" For n=1 To cq If I.T=J.T Then End If Next Case "IF B>C" For n=1 To cq If B>C Then End If Next Case "IF E#>F#" For n=1 To cq If E#>F# Then End If Next Case "IF M$=L$" For n=1 To cq If M$=L$ Then End If Next End Select tim=MilliSecs()-tim If name$="I.T=New T" Then i.t=First t For n=1 To cq typ(n)=i i=After i Next End If Return tim*k End Function Function INTF(N) Return N End Function Function FLOATF#(N#) Return N# End Function Function STRINGF$(S$) Return S$ End Function |
Comments
| ||
This is most exciting. |
| ||
Thanks. I plan to make BlitzMax version too in future. |
| ||
Yikes MID is really slow!!! |
| ||
Here is results for Celeron 4A 2.2GHz: ns - nanoseconds = 1/1 000 000 000 sec template: 1.9 ns A=B: 2.8 ns D#=E#: 3.0 ns I.T=J.T: 10.7 ns A=B+C: 2.9 ns D#=E#+F#: 8.1 ns I.T=New T: 86.5 ns A=B-C: 2.9 ns D#=E#-F#: 8.2 ns Delete I.T: 83.2 ns A=B*C: 2.9 ns D#=E#*F#: 8.6 ns I.T=Before J.T: 16.9 ns A=B/C: 27.4 ns D#=E#/F#: 11.8 ns I.T=After J.T: 14.9 ns A=B^P: 469.0 ns D#=E#^F#: 1223.0 ns I.T=First T: 16.2 ns A=Abs(B): 6.1 ns D#=Abs(E#): 9.3 ns I.T=Last T: 16.1 ns A=Sgn(B): 7.0 ns D#=Sgn(E#): 11.3 ns Insert I.T Before J.T: 13.4 ns A=Floor(E#): 95.9 ns D#=Sin(E#): 84.3 ns Insert I.T After J.T: 13.6 ns A=Int(E#): 6.7 ns D#=Cos(E#): 94.5 ns For I.T=Each T: 77.4 ns A=Ceil(E#): 96.2 ns D#=Tan(E#): 100.4 ns Delete Each T: 74.6 ns A=B And C: 2.7 ns D#=ASin(R#): 260.2 ns A=Handle(J.T): 19.0 ns A=B Or C: 2.9 ns D#=ACos(R#): 261.6 ns I.T=Object(Handle): 45.5 ns A=B Xor C: 2.4 ns D#=ATan(E#): 116.0 ns L$=M$: 184.0 ns A=B Mod PP: 27.7 ns D#=ATan2(E#,F#): 92.2 ns L$=M$+S$: 732.0 ns A=B Shl PP: 4.6 ns D#=Sqr(E#): 11.0 ns L$=Left$(M$,SQ): 256.0 ns A=B Sar PP: 4.1 ns D#=Log(G#): 49.8 ns L$=Right$(M$,SQ): 262.0 ns A=Asc(S$): 582.1 ns D#=Log10(G#): 50.2 ns L$=Chr$(SYM): 538.0 ns A=Len(M$): 173.0 ns D#=Exp(O#): 106.0 ns L$=Mid$(M$,SPOS,SQ): 653.0 ns A=Instr(M$,S$): 341.0 ns : 0.0 ns L$=String$(S$,SYMQ): 1530.0 ns A=Rand(): 79.8 ns D#=Rnd(): 45.7 ns L$=Replace$(M$,S$,' '): 879.0 ns A=INTF(B): 8.2 ns D#=FLOATF#(E#): 12.5 ns L$=STRINGF$(M$): 322.0 ns A=im(spos): 4.4 ns D#=fm#(spos): 3.1 ns L$=sm$(spos): 141.0 ns A=J\i: 2.6 ns D#=J\f#: 3.0 ns L$=J\s$: 140.1 ns PokeByte: 10.1 ns PokeFloat: 11.1 ns PokeInt: 10.6 ns PeekByte: 9.6 ns PeekFloat: 11.4 ns PeekInt: 9.6 ns A=D#: 7.0 ns D#=S$: 266.5 ns S$=A: 669.0 ns D#=A: 75.0 ns S$=D#: 292.3 ns A=S$: 176.5 ns IF B=C: 2.7 ns IF E#=F#: 8.1 ns IF I.T=J.T: 9.7 ns IF B>C: 3.0 ns IF E#>F#: 8.0 ns IF M$=L$: 337.4 ns |
| ||
Opteron 165 @ 2.8ghz - 2GB DDR433 template: 1.0 ns A=B: 1.0 ns D#=E#: 5.0 ns I.T=J.T: 6.0 ns A=B+C: 2.0 ns D#=E#+F#: 7.0 ns I.T=New T: 44.0 ns A=B-C: 2.0 ns D#=E#-F#: 8.0 ns Delete I.T: 43.0 ns A=B*C: 3.0 ns D#=E#*F#: 6.0 ns I.T=Before J.T: 10.0 ns A=B/C: 16.0 ns D#=E#/F#: 8.0 ns I.T=After J.T: 9.0 ns A=B^P: 120.0 ns D#=E#^F#: 250.0 ns I.T=First T: 12.0 ns A=Abs(B): 6.0 ns D#=Abs(E#): 7.0 ns I.T=Last T: 10.0 ns A=Sgn(B): 5.0 ns D#=Sgn(E#): 5.0 ns Insert I.T Before J.T: 8.0 ns A=Floor(E#): 54.0 ns D#=Sin(E#): 40.0 ns Insert I.T After J.T: 12.0 ns A=Int(E#): 5.0 ns D#=Cos(E#): 45.0 ns For I.T=Each T: 20.0 ns A=Ceil(E#): 55.0 ns D#=Tan(E#): 56.0 ns Delete Each T: 38.0 ns A=B And C: 3.0 ns D#=ASin(R#): 142.0 ns A=Handle(J.T): 13.0 ns A=B Or C: 6.0 ns D#=ACos(R#): 147.0 ns I.T=Object(Handle): 28.0 ns A=B Xor C: 2.0 ns D#=ATan(E#): 67.0 ns L$=M$: 50.0 ns A=B Mod PP: 18.0 ns D#=ATan2(E#,F#): 65.0 ns L$=M$+S$: 270.0 ns A=B Shl PP: 2.0 ns D#=Sqr(E#): 8.0 ns L$=Left$(M$,SQ): 90.0 ns A=B Sar PP: 6.0 ns D#=Log(G#): 45.0 ns L$=Right$(M$,SQ): 100.0 ns A=Asc(S$): 181.0 ns D#=Log10(G#): 51.0 ns L$=Chr$(SYM): 170.0 ns A=Len(M$): 80.0 ns D#=Exp(O#): 27.0 ns L$=Mid$(M$,SPOS,SQ): 220.0 ns A=Instr(M$,S$): 100.0 ns : 0.0 ns L$=String$(S$,SYMQ): 600.0 ns A=Rand(): 41.0 ns D#=Rnd(): 30.0 ns L$=Replace$(M$,S$,' '): 330.0 ns A=INTF(B): 6.0 ns D#=FLOATF#(E#): 9.0 ns L$=STRINGF$(M$): 70.0 ns A=im(spos): 3.0 ns D#=fm#(spos): 4.0 ns L$=sm$(spos): 31.0 ns A=J\i: 5.0 ns D#=J\f#: 4.0 ns L$=J\s$: 30.0 ns PokeByte: 8.0 ns PokeFloat: 9.0 ns PokeInt: 9.0 ns PeekByte: 8.0 ns PeekFloat: 9.0 ns PeekInt: 8.0 ns A=D#: 4.0 ns D#=S$: 85.0 ns S$=A: 240.0 ns D#=A: 40.0 ns S$=D#: 109.0 ns A=S$: 55.0 ns IF B=C: 2.0 ns IF E#=F#: 4.0 ns IF I.T=J.T: 4.0 ns IF B>C: 2.0 ns IF E#>F#: 4.0 ns IF M$=L$: 90.0 ns |
| ||
Athlon x2 64 duo - 2.2Ghz - 1GB ram 667 template: 1.0 ns A=B: 1.0 ns D#=E#: 3.0 ns I.T=J.T: 8.0 ns A=B+C: 2.0 ns D#=E#+F#: 6.0 ns I.T=New T: 58.0 ns A=B-C: 4.0 ns D#=E#-F#: 11.0 ns Delete I.T: 58.0 ns A=B*C: 5.0 ns D#=E#*F#: 10.0 ns I.T=Before J.T: 15.0 ns A=B/C: 21.0 ns D#=E#/F#: 10.0 ns I.T=After J.T: 15.0 ns A=B^P: 140.0 ns D#=E#^F#: 330.0 ns I.T=First T: 12.0 ns A=Abs(B): 5.0 ns D#=Abs(E#): 8.0 ns I.T=Last T: 16.0 ns A=Sgn(B): 3.0 ns D#=Sgn(E#): 10.0 ns Insert I.T Before J.T: 10.0 ns A=Floor(E#): 70.0 ns D#=Sin(E#): 55.0 ns Insert I.T After J.T: 14.0 ns A=Int(E#): 8.0 ns D#=Cos(E#): 58.0 ns For I.T=Each T: 26.0 ns A=Ceil(E#): 71.0 ns D#=Tan(E#): 72.0 ns Delete Each T: 54.0 ns A=B And C: 3.0 ns D#=ASin(R#): 188.0 ns A=Handle(J.T): 18.0 ns A=B Or C: 4.0 ns D#=ACos(R#): 189.0 ns I.T=Object(Handle): 39.0 ns A=B Xor C: 4.0 ns D#=ATan(E#): 88.0 ns L$=M$: 60.0 ns A=B Mod PP: 25.0 ns D#=ATan2(E#,F#): 91.0 ns L$=M$+S$: 310.0 ns A=B Shl PP: 4.0 ns D#=Sqr(E#): 6.0 ns L$=Left$(M$,SQ): 120.0 ns A=B Sar PP: 5.0 ns D#=Log(G#): 61.0 ns L$=Right$(M$,SQ): 120.0 ns A=Asc(S$): 225.0 ns D#=Log10(G#): 62.0 ns L$=Chr$(SYM): 210.0 ns A=Len(M$): 60.0 ns D#=Exp(O#): 34.0 ns L$=Mid$(M$,SPOS,SQ): 340.0 ns A=Instr(M$,S$): 140.0 ns : 0.0 ns L$=String$(S$,SYMQ): 760.0 ns A=Rand(): 62.0 ns D#=Rnd(): 39.0 ns L$=Replace$(M$,S$,' '): 420.0 ns A=INTF(B): 8.0 ns D#=FLOATF#(E#): 10.0 ns L$=STRINGF$(M$): 120.0 ns A=im(spos): 6.0 ns D#=fm#(spos): 3.0 ns L$=sm$(spos): 48.0 ns A=J\i: 3.0 ns D#=J\f#: 6.0 ns L$=J\s$: 46.0 ns PokeByte: 10.0 ns PokeFloat: 6.0 ns PokeInt: 10.0 ns PeekByte: 8.0 ns PeekFloat: 11.0 ns PeekInt: 8.0 ns A=D#: 6.0 ns D#=S$: 114.0 ns S$=A: 300.0 ns D#=A: 90.0 ns S$=D#: 131.0 ns A=S$: 72.0 ns IF B=C: 3.0 ns IF E#=F#: 8.0 ns IF I.T=J.T: 7.0 ns IF B>C: 3.0 ns IF E#>F#: 8.0 ns IF M$=L$: 112.0 ns |
| ||
Interesting: Ordered slowest>fastest. Some simple stuff like A=B seems *slower* than A=B AND C? :S |
| ||
There are some infelcities depending of checks' quantity (precision). Sometimes even template (no operations at all, just plain cycle) is slower than equation. Try to raise checks quantity. |
| ||
here is P4 2.4GHz, 1 Gig Ram, nVidia 7600GT, 256MB VRAM, WinXP Pro SP2 |
| ||
Matt Merkulov, have you got a BlitzMax version of this test? I tried to convert it but got stuck with the way Types are declared and used in BM, and I have little time to study BM as I'm focusing my energy on my project. |
Code Archives Forum