Code: Select all
function v1(l as double ptr,r as double ptr,s as uinteger,e as uinteger) as double
dim as double result
for i as uinteger = s to e
result += l[i] * r[i]
next
return result
end function
function v2(l as double ptr,r as double ptr,n as uinteger) as double
dim as double result
for i as uinteger = 0 to n
result += l[i] * r[i]
next
return result
end function
function v3(l as double ptr,r as double ptr,n as uinteger) as double
dim as double result
for i as uinteger = 0 to n
result += *l * *r : l+=1 : r+=1
next
return result
end function
function v4(l as double ptr,r as double ptr,n as uinteger) as double
dim as double result
dim as double ptr e=l+n+1
while l<e : result += *l * *r : l+=1 : r+=1 : wend
return result
end function
#ifndef __FB_64BIT__
' 32-bit used the stack
' 64-bit params: rcx=@a, rdx=@b, r8=n
sub v5 cdecl(byval a as double ptr, _
byval b as double ptr, _
byval n as uinteger, _
byval r as double ptr)
#define BASIS 8
asm
#if 1
push ebx
push edx
mov ebx,[ebp+BASIS]
lea ebx,[ebx]
mov edx,[ebp+BASIS+4]
lea edx,[edx]
mov ecx,[ebp+BASIS+8]
inc ecx
xorpd xmm0, xmm0
xor eax,eax
loop_v5:
movsd xmm1, QWORD PTR [ebx+eax*8]
mulsd xmm1, QWORD PTR [edx+eax*8]
addsd xmm0, xmm1
inc eax
dec ecx
jnz loop_v5
mov edx,[ebp+BASIS+12]
lea edx,[edx]
movsd QWORD PTR [edx],xmm0
pop edx
pop ebx
#endif
end asm
end sub
#else
' 64-bit params: rcx=@a, rdx=@b, r8=n
function v5 (byval a as double ptr, _
byval b as double ptr, _
byval n as uinteger) as double
asm
push rbx
push rdx
lea rbx,[rcx]
lea rdx,[rdx]
mov rcx,r8
inc rcx
xorpd xmm0, xmm0
xor rax,rax
loop_v5:
movsd xmm1, QWORD PTR [rbx+rax*8]
mulsd xmm1, QWORD PTR [rdx+rax*8]
addsd xmm0, xmm1
inc rax
dec rcx
jnz loop_v5
pop rdx
pop rbx
movsd [function],xmm0
end asm
end function
#endif
const as uinteger N = 100000
const as uinteger S = 1000 ' first item
const as uinteger E = 99000 ' last item
dim shared as double a(N-1),b(N-1)
for i as uinteger = 0 to N-1
a(i)=i:b(i)=i
next
const as uinteger NLOOPS = 10000
print "please wait while run 5 tests ..."
dim as double result
var t1 = timer()
for i as uinteger = 1 to NLOOPS
result = v1(@a(0),@b(0),S,E)
next
t1=timer()-t1
print "result v1: " & result
var t2 = timer()
for i as uinteger = 1 to NLOOPS
result = v2(@a(s),@b(s),E-S)
next
t2=timer()-t2
print "result v2: " & result
var t3 = timer()
for i as uinteger = 1 to NLOOPS
result = v3(@a(s),@b(s),E-S)
next
t3=timer()-t3
print "result v3: " & result
var t4 = timer()
for i as uinteger = 1 to NLOOPS
result = v4(@a(s),@b(s),E-S)
next
t4=timer()-t4
print "result v4: " & result
result=0
var t5=timer()
for i as uinteger = 1 to NLOOPS
#ifndef __FB_64BIT__
' on 32.bit implemented as sub
v5(@a(s),@b(s),E-S,@result)
#else
result = v5(@a(s),@b(s),E-S)
#endif
next
t5=timer()-t5
print "result v5: " & result
print
print "time v1: " & t1
print "time v2: " & t2
print "time v3: " & t3
print "time v4: " & t4
print "time v5: " & t5
sleep