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