2008-10-03 21:53 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
- harbour/tests/speedtst.prg
+ harbour/tests/speedold.prg
* renamed old speed test - I left it because some other xbase compiler
cannot compiple the new one due to not Clipper compatible PP
+ harbour/tests/speedtst.prg
* added new speed test which can also measure mutlithread performance.
When linked with MT HVM version then it can be executed with optional
parameter which causes that each test loop is executed by separate
thread. Please make such tests on different platforms.
This commit is contained in:
@@ -8,6 +8,18 @@
|
||||
2008-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org)
|
||||
*/
|
||||
|
||||
2008-10-03 21:53 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
- harbour/tests/speedtst.prg
|
||||
+ harbour/tests/speedold.prg
|
||||
* renamed old speed test - I left it because some other xbase compiler
|
||||
cannot compiple the new one due to not Clipper compatible PP
|
||||
|
||||
+ harbour/tests/speedtst.prg
|
||||
* added new speed test which can also measure mutlithread performance.
|
||||
When linked with MT HVM version then it can be executed with optional
|
||||
parameter which causes that each test loop is executed by separate
|
||||
thread. Please make such tests on different platforms.
|
||||
|
||||
2008-10-03 20:20 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
|
||||
* harbour/source/vm/garbage.c
|
||||
* Use spinlock instead of mutex in OS2 builds - performance test.
|
||||
|
||||
589
harbour/tests/speedold.prg
Normal file
589
harbour/tests/speedold.prg
Normal file
@@ -0,0 +1,589 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* a small speed test program
|
||||
*
|
||||
* Copyright 2006 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
*/
|
||||
|
||||
#define ARR_LEN 16
|
||||
#define N_LOOPS 1000000
|
||||
|
||||
//#define NO_DBF_TEST
|
||||
#define NO_KEYBOARD_TEST
|
||||
#define NO_ASSOC_TEST
|
||||
|
||||
#define REAL_TIME
|
||||
|
||||
#ifdef __CLIP__
|
||||
#define ASSOC_ARRAY map()
|
||||
#undef REAL_TIME
|
||||
#endif
|
||||
#ifdef FlagShip
|
||||
#undef REAL_TIME
|
||||
#xtranslate seconds() => fs_seconds()
|
||||
#endif
|
||||
#ifdef __HARBOUR__
|
||||
#include "hbmemory.ch"
|
||||
#define ASSOC_ARRAY { => }
|
||||
#undef REAL_TIME
|
||||
#endif
|
||||
|
||||
#ifdef REAL_TIME
|
||||
#xtranslate secondscpu([<x>]) => seconds()
|
||||
#endif
|
||||
#ifndef EOL
|
||||
#define EOL hb_OSNewLine()
|
||||
#endif
|
||||
#command ? => outstd(EOL)
|
||||
#command ? <xx,...> => outstd(<xx>, EOL)
|
||||
|
||||
#ifdef NO_ASSOC_TEST
|
||||
#undef ASSOC_ARRAY
|
||||
#endif
|
||||
|
||||
function main()
|
||||
#ifndef NO_DBF_TEST
|
||||
field F_C, F_N, F_D
|
||||
#endif
|
||||
memvar M_C, M_N, M_D
|
||||
local L_C, L_N, L_D
|
||||
local i, j, t, c, c2, n, d, o, bc, tn, total, totalr, aa,;
|
||||
a[ARR_LEN], a2[ARR_LEN], a3[ARR_LEN], aDb, cFi1, cFi2
|
||||
#ifdef ASSOC_ARRAY
|
||||
local aAssoc := ASSOC_ARRAY
|
||||
#endif
|
||||
private M_C := dtos(date()),;
|
||||
M_N := 112345.67,;
|
||||
M_D := date()
|
||||
|
||||
#ifndef __CLIP__
|
||||
//#ifdef __HARBOUR__
|
||||
// setcancel(.f.)
|
||||
// altd(0)
|
||||
//#endif
|
||||
#endif
|
||||
#ifdef __CLIP__
|
||||
SET MACRO_IN_STRING OFF
|
||||
//CLEAR SCREEN
|
||||
#endif
|
||||
#ifdef FlagShip
|
||||
FS_SET( "zerobyte", .t. )
|
||||
FS_SET( "devel", .f. )
|
||||
// FS_SET( "break", 0 )
|
||||
// FS_SET( "debug", 0 )
|
||||
#endif
|
||||
|
||||
for i:=1 to len(a)
|
||||
a[i]:=i
|
||||
a2[i]:=dtos(date())+chr(i%64+32)+chr(i%64+64)+str(i,10)
|
||||
a3[i]:=stuff(dtos(date()),7,0,".")
|
||||
next
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
if MEMORY( HB_MEM_USEDMAX ) != 0
|
||||
?
|
||||
? "Warning !!! Memory statistic enabled."
|
||||
endif
|
||||
#endif
|
||||
?
|
||||
? "Startup loop to increase CPU clock..."
|
||||
t:=seconds()+5; while t > seconds(); enddo
|
||||
|
||||
?
|
||||
? date(), time(), VERSION()+build_mode()+", "+OS()
|
||||
? "ARR_LEN =", ARR_LEN
|
||||
? "N_LOOPS =", N_LOOPS
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
next
|
||||
tn:=secondscpu()-t
|
||||
? "empty loops overhead =", tn
|
||||
#ifdef REAL_TIME
|
||||
? "real time -> seconds()"
|
||||
#else
|
||||
? "CPU usage -> secondsCPU()"
|
||||
#endif
|
||||
? ""
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
|
||||
aDb:={ {"F_C", "C", 10, 0},;
|
||||
{"F_N", "N", 10, 2},;
|
||||
{"F_D", "D", 8, 0} }
|
||||
|
||||
cFi1:="tst_tmp.dbf"
|
||||
if file(cFi1)
|
||||
ferase(cFi1)
|
||||
endif
|
||||
dbcreate(cFi1, aDb)
|
||||
select(1)
|
||||
use &cFi1 shared
|
||||
dbappend()
|
||||
replace F_C with dtos(date())
|
||||
replace F_N with 112345.67
|
||||
replace F_D with date()
|
||||
dbcommit()
|
||||
dbunlock()
|
||||
|
||||
cFi2:="tst_tmp2.dbf"
|
||||
if file(cFi2)
|
||||
ferase(cFi2)
|
||||
endif
|
||||
dbcreate(cFi2, aDb)
|
||||
select(2)
|
||||
use &cFi2 exclusive
|
||||
dbappend()
|
||||
replace F_C with dtos(date())
|
||||
replace F_N with 112345.67
|
||||
replace F_D with date()
|
||||
dbcommit()
|
||||
dbunlock()
|
||||
|
||||
#endif
|
||||
|
||||
L_C := dtos(date())
|
||||
L_N := 112345.67
|
||||
L_D := date()
|
||||
|
||||
|
||||
total:=secondscpu()
|
||||
totalr:=seconds()
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=L_C
|
||||
next
|
||||
dsp_time( "c:=L_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=L_N
|
||||
next
|
||||
dsp_time( "n:=L_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=L_D
|
||||
next
|
||||
dsp_time( "d:=L_D -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=M_C
|
||||
next
|
||||
dsp_time( "c:=M_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=M_N
|
||||
next
|
||||
dsp_time( "n:=M_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=M_D
|
||||
next
|
||||
dsp_time( "d:=M_D -> ", t, tn)
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
select(1)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=F_C
|
||||
next
|
||||
dsp_time( "(sh) c:=F_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=F_N
|
||||
next
|
||||
dsp_time( "(sh) n:=F_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=F_D
|
||||
next
|
||||
dsp_time( "(sh) d:=F_D -> ", t, tn)
|
||||
|
||||
select(2)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=F_C
|
||||
next
|
||||
dsp_time( "(ex) c:=F_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=F_N
|
||||
next
|
||||
dsp_time( "(ex) n:=F_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=F_D
|
||||
next
|
||||
dsp_time( "(ex) d:=F_D -> ", t, tn)
|
||||
#endif
|
||||
|
||||
o:=errorNew()
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=o:GenCode
|
||||
next
|
||||
dsp_time( "n:=o:GenCode -> ", t, tn)
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=o[8]
|
||||
next
|
||||
dsp_time( "n:=o[8] -> ", t, tn)
|
||||
#endif
|
||||
|
||||
#ifdef ASSOC_ARRAY
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100))]:=i
|
||||
next
|
||||
dsp_time( "aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100)]:=i -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100))]
|
||||
next
|
||||
dsp_time( "c:=aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100)] -> ", t, tn)
|
||||
#endif
|
||||
|
||||
#ifndef NO_KEYBOARD_TEST
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
inkey()
|
||||
next
|
||||
dsp_time( "inkey() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
nextkey()
|
||||
next
|
||||
dsp_time( "nextkey() -> ", t, tn)
|
||||
#endif
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
round(i/1000,2)
|
||||
next
|
||||
dsp_time( "round(i/1000,2) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
str(i/1000)
|
||||
next
|
||||
dsp_time( "str(i/1000) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
val(a3[i%ARR_LEN+1])
|
||||
next
|
||||
dsp_time( "val(a3[i%ARR_LEN+1]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
j:=date()
|
||||
for i:=1 to N_LOOPS
|
||||
dtos(j+i%10000-5000)
|
||||
next
|
||||
dsp_time( "dtos(j+i%10000-5000) -> ", t, tn)
|
||||
|
||||
bc:={||i%ARR_LEN}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc)
|
||||
next
|
||||
dsp_time( "eval({||i%ARR_LEN}) -> ", t, tn)
|
||||
|
||||
bc:={|x|x%ARR_LEN}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval({|x|x%ARR_LEN},i) -> ", t, tn)
|
||||
|
||||
bc:={|x|f1(x)}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval({|x|f1(x)},i) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=&("f1("+str(i)+")")
|
||||
next
|
||||
dsp_time( "&('f1('+str(i)+')') -> ", t, tn)
|
||||
|
||||
bc:=&("{|x|f1(x)}")
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval([&('{|x|f1(x)}')]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j:=valtype(a)+valtype(i)
|
||||
next
|
||||
dsp_time( "j := valtype(a)+valtype(i) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := str(i%100,2) $ a2[i%ARR_LEN+1]
|
||||
next
|
||||
dsp_time( "j := str(i%100,2) $ a2[i%ARR_LEN+1] -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := val(a2[i%ARR_LEN+1])
|
||||
next
|
||||
dsp_time( "j := val(a2[i%ARR_LEN+1]) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] == c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] == s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] = c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] = s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] >= c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] >= s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] < c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] < s -> ", t, tn)
|
||||
|
||||
aa:={}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
if i%1000 == 0
|
||||
aa:={}
|
||||
endif
|
||||
aadd(aa,{i,j,c,a,a2,t,bc})
|
||||
next
|
||||
dsp_time( "aadd(aa,{i,j,s,a,a2,t,bc}) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f0()
|
||||
next
|
||||
dsp_time( "f0() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f1(i)
|
||||
next
|
||||
dsp_time( "f1(i) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
c:=replicate(c,5000)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(@c)
|
||||
next
|
||||
dsp_time( "f2(@c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
c2:=c
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]); c2:=c -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(@c)
|
||||
c2:=c
|
||||
next
|
||||
dsp_time( "f2(@c["+ltrim(str(len(c)))+"]); c2:=c -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f3(a,a2,c,i,j,t,bc)
|
||||
next
|
||||
dsp_time( "f3(a,a2,c,i,j,t,bc) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(a2)
|
||||
next
|
||||
dsp_time( "f2(a2) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=f4()
|
||||
next
|
||||
dsp_time( "s:=f4() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=f5()
|
||||
next
|
||||
dsp_time( "s:=f5() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a,i%ARR_LEN)
|
||||
next
|
||||
dsp_time( "ascan(a,i%ARR_LEN) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a2,c+chr(i%64+64))
|
||||
next
|
||||
dsp_time( "ascan(a2,c+chr(i%64+64)) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a,{|x|x==i%ARR_LEN})
|
||||
next
|
||||
dsp_time( "ascan(a,{|x|x==i%ARR_LEN}) -> ", t, tn)
|
||||
|
||||
? replicate("=",60)
|
||||
dsp_time( "total application time:", total, 0)
|
||||
? padr( "total real time:",50)+str(seconds()-totalr,8,2)
|
||||
?
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
|
||||
if file(cFi1)
|
||||
ferase(cFi1)
|
||||
endif
|
||||
if file(cFi2)
|
||||
ferase(cFi2)
|
||||
endif
|
||||
|
||||
#endif
|
||||
|
||||
return nil
|
||||
|
||||
function dsp_time(s,t,tn)
|
||||
? padr(s,50)+str(max(secondscpu()-t-tn,0),8,2)
|
||||
return nil
|
||||
|
||||
function f0(x)
|
||||
return nil
|
||||
|
||||
function f1(x)
|
||||
return x+1
|
||||
|
||||
function f2(s)
|
||||
return nil
|
||||
|
||||
function f3(a,b,c,d,e,f,g,h,i)
|
||||
return nil
|
||||
|
||||
function f4()
|
||||
return space(4000)
|
||||
|
||||
function f5()
|
||||
return space(5)
|
||||
|
||||
function build_mode()
|
||||
#ifdef __CLIP__
|
||||
return " (MT)"
|
||||
#else
|
||||
#ifdef __XHARBOUR__
|
||||
return iif( HB_MULTITHREAD(), " (MT)", "" ) + ;
|
||||
iif( MEMORY( HB_MEM_USEDMAX ) != 0, " (FMSTAT)", "" )
|
||||
#else
|
||||
#ifdef __HARBOUR__
|
||||
return iif( HB_MTVM(), " (MT)", "" ) + ;
|
||||
iif( MEMORY( HB_MEM_USEDMAX ) != 0, " (FMSTAT)", "" )
|
||||
#else
|
||||
#ifdef __XPP__
|
||||
return " (MT)"
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
return ""
|
||||
|
||||
#ifdef FlagShip
|
||||
function fs_seconds()
|
||||
LOCAL_DOUBLE nret := 0
|
||||
#Cinline
|
||||
{
|
||||
#include <sys/time.h>
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
if( !gettimeofday(&tv, NULL) )
|
||||
nret = (double) tv.tv_sec + (double) (tv.tv_usec) / 1000000;
|
||||
/*
|
||||
nret = (double) (tv.tv_sec - tz.tz_minuteswest * 60 ) % 86400 +
|
||||
(double) tv.tv_usec / 1000000;
|
||||
*/
|
||||
}
|
||||
#endCinline
|
||||
return ( nret )
|
||||
|
||||
#ifndef FlagShip5
|
||||
FUNCTION cursesinit()
|
||||
CALL fgsIoctl2
|
||||
#Cinline
|
||||
{
|
||||
#include <fcntl.h>
|
||||
int arg;
|
||||
if ((arg = fcntl(0, F_GETFL, 0)) != -1)
|
||||
fcntl(0, F_SETFL, arg | O_NONBLOCK);
|
||||
}
|
||||
#endCinline
|
||||
return nil
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if __HARBOUR__ < 0x010100
|
||||
STATIC FUNCTION HB_MTVM()
|
||||
RETURN .F.
|
||||
#endif
|
||||
|
||||
#ifndef __HARBOUR__
|
||||
STATIC FUNCTION hb_OSNewLine()
|
||||
#ifdef FlagShip
|
||||
RETURN Chr( 10 )
|
||||
#elif __CLIP__
|
||||
RETURN Chr( 10 )
|
||||
#else
|
||||
RETURN Chr( 13 ) + Chr( 10 )
|
||||
#endif
|
||||
#endif
|
||||
@@ -4,513 +4,374 @@
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* a small speed test program
|
||||
* HVM speed test program
|
||||
*
|
||||
* Copyright 2006 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||
* Copyright 2008 Przemyslaw Czerpak <druzus / at / priv.onet.pl>
|
||||
* www - http://www.harbour-project.org
|
||||
*
|
||||
*/
|
||||
|
||||
#define ARR_LEN 16
|
||||
|
||||
#define N_TESTS 53
|
||||
#define N_LOOPS 1000000
|
||||
#define ARR_LEN 16
|
||||
|
||||
//#define NO_DBF_TEST
|
||||
#define NO_KEYBOARD_TEST
|
||||
#define NO_ASSOC_TEST
|
||||
|
||||
#define REAL_TIME
|
||||
|
||||
#ifdef __CLIP__
|
||||
#define ASSOC_ARRAY map()
|
||||
#undef REAL_TIME
|
||||
#endif
|
||||
#ifdef FlagShip
|
||||
#undef REAL_TIME
|
||||
#xtranslate seconds() => fs_seconds()
|
||||
#endif
|
||||
#ifdef __HARBOUR__
|
||||
#include "hbmemory.ch"
|
||||
#define ASSOC_ARRAY { => }
|
||||
#undef REAL_TIME
|
||||
#endif
|
||||
|
||||
#ifdef REAL_TIME
|
||||
#xtranslate secondscpu([<x>]) => seconds()
|
||||
#endif
|
||||
#ifndef EOL
|
||||
#define EOL hb_OSNewLine()
|
||||
#endif
|
||||
#command ? => outstd(EOL)
|
||||
#command ? <xx,...> => outstd(<xx>, EOL)
|
||||
#command ? <xx,...> => outstd(EOL);outstd(<xx>)
|
||||
|
||||
#ifdef NO_ASSOC_TEST
|
||||
#undef ASSOC_ARRAY
|
||||
#endif
|
||||
|
||||
function main()
|
||||
#ifndef NO_DBF_TEST
|
||||
field F_C, F_N, F_D
|
||||
#endif
|
||||
memvar M_C, M_N, M_D
|
||||
local L_C, L_N, L_D
|
||||
local i, j, t, c, c2, n, d, o, bc, tn, total, totalr, aa,;
|
||||
a[ARR_LEN], a2[ARR_LEN], a3[ARR_LEN], aDb, cFi1, cFi2
|
||||
#ifdef ASSOC_ARRAY
|
||||
local aAssoc := ASSOC_ARRAY
|
||||
#endif
|
||||
private M_C := dtos(date()),;
|
||||
M_N := 112345.67,;
|
||||
M_D := date()
|
||||
|
||||
#ifndef __CLIP__
|
||||
//#ifdef __HARBOUR__
|
||||
// setcancel(.f.)
|
||||
// altd(0)
|
||||
//#endif
|
||||
#endif
|
||||
#ifdef __CLIP__
|
||||
SET MACRO_IN_STRING OFF
|
||||
//CLEAR SCREEN
|
||||
#endif
|
||||
#ifdef FlagShip
|
||||
FS_SET( "zerobyte", .t. )
|
||||
FS_SET( "devel", .f. )
|
||||
// FS_SET( "break", 0 )
|
||||
// FS_SET( "debug", 0 )
|
||||
#endif
|
||||
|
||||
for i:=1 to len(a)
|
||||
a[i]:=i
|
||||
a2[i]:=dtos(date())+chr(i%64+32)+chr(i%64+64)+str(i,10)
|
||||
a3[i]:=stuff(dtos(date()),7,0,".")
|
||||
next
|
||||
#include "common.ch"
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#define EOL hb_OSNewLine()
|
||||
#else
|
||||
#define HB_SYMBOL_UNUSED( symbol ) ( ( symbol ) )
|
||||
#ifndef __CLIP__
|
||||
#xtranslate secondsCPU() => seconds()
|
||||
#endif
|
||||
#ifndef EOL
|
||||
#define EOL chr(10)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#xcommand _( [<cmds,...>] ) => [<cmds>]
|
||||
|
||||
#xcommand TEST <testfunc> ;
|
||||
[ WITH <locals,...> ] ;
|
||||
[ INIT <init> ] ;
|
||||
[ EXIT <exit> ] ;
|
||||
[ INFO <info> ] ;
|
||||
CODE [<*testExp*>] => ;
|
||||
func <testfunc> ; ;
|
||||
local time, i, x := nil ; ;
|
||||
[ local <locals> ; ] ;
|
||||
[ <init> ; ] ;
|
||||
time := secondscpu() ; ;
|
||||
for i:=1 to N_LOOPS ; ;
|
||||
[<testExp>;] ;
|
||||
next ; ;
|
||||
time := secondscpu() - time ; ;
|
||||
[ <exit> ; ] ;
|
||||
return { iif( <.info.>, <(info)>, #<testExp> ), time }
|
||||
|
||||
|
||||
proc main(mt)
|
||||
test(mt)
|
||||
return
|
||||
|
||||
|
||||
#ifdef __XHARBOUR__
|
||||
|
||||
#xtranslate hb_mtvm() => hb_multiThread()
|
||||
|
||||
#ifndef __ST__
|
||||
|
||||
/* do not expect that this code will work with xHarbour.
|
||||
* xHarbour has many race conditions which are exploited quite fast
|
||||
* on real multi CPU machines so it crashes in different places :-(
|
||||
* probably this code should be forwared to xHarbour developers as
|
||||
* some type of MT test
|
||||
*/
|
||||
|
||||
static function results( nTest, xResult )
|
||||
static s_aResults[ N_TESTS + 1 ]
|
||||
if xResult == NIL
|
||||
xResult := s_aResults[ nTest ]
|
||||
else
|
||||
s_aResults[ nTest ] := xResult
|
||||
endif
|
||||
return xResult
|
||||
|
||||
/* I used function wrappers to simulate thread join which can
|
||||
* return thread results
|
||||
*/
|
||||
static function do_test( cFunc )
|
||||
local x
|
||||
? "starting: " + cFunc + "()"
|
||||
// if you set .f. then tests will be skipped but you can check
|
||||
// if this test code is executed because it greatly reduces
|
||||
// the race conditions inside xHarbour HVM
|
||||
if .t.
|
||||
x := &cFunc()
|
||||
//dsp_result( x )
|
||||
else
|
||||
x := { "skipped test " + cFunc, val( substr( cFunc, 2 ) ) + 0.99 }
|
||||
endif
|
||||
results( val( substr( cFunc, 2 ) ), x )
|
||||
return nil
|
||||
|
||||
function hb_threadStart( cFunc )
|
||||
return StartThread( @do_test(), cFunc )
|
||||
|
||||
function hb_threadJoin( thId, xResult )
|
||||
static s_n := 0
|
||||
local lOK
|
||||
/* in xHarbour there is race condition in JoinThread() which
|
||||
* fails if thread end before we call it so we cannot use it :-(
|
||||
*/
|
||||
//lOK := JoinThread( thId )
|
||||
lOK := .t.
|
||||
if s_n == 0
|
||||
HB_SYMBOL_UNUSED( thId )
|
||||
WaitForThreads()
|
||||
endif
|
||||
xResult := results( ++s_n )
|
||||
return lOK
|
||||
|
||||
#else
|
||||
|
||||
function hb_threadStart()
|
||||
return nil
|
||||
function hb_threadJoin()
|
||||
return nil
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
TEST t000 INFO "empty loop overhead" CODE
|
||||
|
||||
TEST t001 WITH L_C:=dtos(date()) CODE x := L_C
|
||||
|
||||
TEST t002 WITH L_N:=112345.67 CODE x := L_N
|
||||
|
||||
TEST t003 WITH L_D:=date() CODE x := L_D
|
||||
|
||||
TEST t004 INIT _( static S_C ) INIT S_C:=dtos(date()) CODE x := S_C
|
||||
|
||||
TEST t005 INIT _( static S_N ) INIT S_N:=112345.67 CODE x := S_N
|
||||
|
||||
TEST t006 INIT _( static S_D ) INIT S_D:=date() CODE x := S_D
|
||||
|
||||
TEST t007 INIT _( memvar M_C ) INIT _( private M_C:=dtos(date()) ) ;
|
||||
CODE x := M_C
|
||||
|
||||
TEST t008 INIT _( memvar M_N ) INIT _( private M_N:=112345.67 ) ;
|
||||
CODE x := M_N
|
||||
|
||||
TEST t009 INIT _( memvar M_D ) INIT _( private M_D:=date() ) ;
|
||||
CODE x := M_D
|
||||
|
||||
TEST t010 INIT _( memvar P_C ) INIT _( public P_C:=dtos(date()) ) ;
|
||||
CODE x := P_C
|
||||
|
||||
TEST t011 INIT _( memvar P_N ) INIT _( public P_N:=112345.67 ) ;
|
||||
CODE x := P_N
|
||||
|
||||
TEST t012 INIT _( memvar P_D ) INIT _( public P_D:=date() ) ;
|
||||
CODE x := P_D
|
||||
|
||||
TEST t013 INIT _( field F_C ) INIT use_dbsh() EXIT close_db() ;
|
||||
CODE x := F_C
|
||||
|
||||
TEST t014 INIT _( field F_N ) INIT use_dbsh() EXIT close_db() ;
|
||||
CODE x := F_N
|
||||
|
||||
TEST t015 INIT _( field F_D ) INIT use_dbsh() EXIT close_db() ;
|
||||
CODE x := F_D
|
||||
|
||||
TEST t016 WITH o := errorNew() CODE x := o:GenCode
|
||||
|
||||
TEST t017 WITH o := errorNew() CODE x := 0 //o[8]
|
||||
|
||||
TEST t018 CODE round( i / 1000, 2 )
|
||||
|
||||
TEST t019 CODE str( i / 1000 )
|
||||
|
||||
TEST t020 WITH s := stuff( dtos( date() ), 7, 0, "." ) CODE val( s )
|
||||
|
||||
TEST t021 WITH a := afill( array( ARR_LEN ), ;
|
||||
stuff( dtos( date() ), 7, 0, "." ) ) ;
|
||||
CODE val( a [ i % ARR_LEN + 1 ] )
|
||||
|
||||
TEST t022 WITH d := date() CODE dtos( d - i % 10000 )
|
||||
|
||||
TEST t023 CODE eval( { || i % ARR_LEN } )
|
||||
|
||||
TEST t024 WITH bc := { || i % ARR_LEN } ;
|
||||
INFO eval( bc := { || i % ARR_LEN } ) ;
|
||||
CODE eval( bc )
|
||||
|
||||
TEST t025 CODE eval( { |x| x % ARR_LEN }, i )
|
||||
|
||||
TEST t026 WITH bc := { |x| x % ARR_LEN } ;
|
||||
INFO eval( bc := { |x| x % ARR_LEN }, i ) ;
|
||||
CODE eval( bc, i )
|
||||
|
||||
TEST t027 CODE eval( { |x| f1( x ) }, i )
|
||||
|
||||
TEST t028 WITH bc := { |x| f1( x ) } ;
|
||||
INFO eval( bc := { |x| f1( x ) }, i ) ;
|
||||
CODE eval( bc, i )
|
||||
|
||||
TEST t029 CODE x := &( "f1(" + str(i) + ")" )
|
||||
|
||||
TEST t030 WITH bc CODE bc := &( "{|x|f1(x)}" ); eval( bc, i )
|
||||
|
||||
TEST t031 CODE x := valtype( x ) + valtype( i )
|
||||
|
||||
TEST t032 WITH a := afill( array( ARR_LEN ), ;
|
||||
stuff( dtos( date() ), 7, 0, "." ) ) ;
|
||||
CODE x := strzero( i % 100, 2 ) $ a[ i % ARR_LEN + 1 ]
|
||||
|
||||
TEST t033 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] == s
|
||||
|
||||
TEST t034 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] = s
|
||||
|
||||
TEST t035 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] >= s
|
||||
|
||||
TEST t036 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] <= s
|
||||
|
||||
TEST t037 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] < s
|
||||
|
||||
TEST t038 WITH a := array( ARR_LEN ), s := dtos( date() ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := left( s + s, i ), x } ) ;
|
||||
CODE x := a[ i % ARR_LEN + 1 ] > s
|
||||
|
||||
TEST t039 WITH a := array( ARR_LEN ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := i, x } ) ;
|
||||
CODE ascan( a, i % ARR_LEN )
|
||||
|
||||
TEST t040 WITH a := array( ARR_LEN ) ;
|
||||
INIT aeval( a, { |x,i| a[i] := i, x } ) ;
|
||||
CODE ascan( a, { |x| x == i % ARR_LEN } )
|
||||
|
||||
TEST t041 WITH a := {}, a2 := { 1, 2, 3 }, bc := { |x| f1(x) }, ;
|
||||
s := dtos( date() ), s2 := "static text" ;
|
||||
CODE if i%1000==0;a:={};end; aadd(a,{i,1,.t.,s,s2,a2,bc})
|
||||
|
||||
TEST t042 WITH a := {} CODE x := a
|
||||
|
||||
TEST t043 CODE x := {}
|
||||
|
||||
TEST t044 CODE f0()
|
||||
|
||||
TEST t045 CODE f1( i )
|
||||
|
||||
TEST t046 WITH c := dtos( date() ) ;
|
||||
INFO f2( c[1...8] ) ;
|
||||
CODE f2( c )
|
||||
|
||||
TEST t047 WITH c := repl( dtos( date() ), 5000 ) ;
|
||||
INFO f2( c[1...40000] ) ;
|
||||
CODE f2( c )
|
||||
|
||||
TEST t048 WITH c := repl( dtos( date() ), 5000 ) ;
|
||||
INFO f2( @c[1...40000] ) ;
|
||||
CODE f2( c )
|
||||
|
||||
TEST t049 WITH c := repl( dtos( date() ),5000 ), c2 ;
|
||||
INFO "f2( @c[1...40000] ), c2 := c" ;
|
||||
CODE f2( @c ); c2 := c
|
||||
|
||||
TEST t050 WITH a := {}, a2 := { 1, 2, 3 }, bc := { |x| f1(x) }, ;
|
||||
s := dtos( date() ), s2 := "static text", n := 1.23 ;
|
||||
CODE f3( a, a2, s, i, s2, bc, i, n, x )
|
||||
|
||||
TEST t051 WITH a := { 1, 2, 3 } CODE f2( a )
|
||||
|
||||
TEST t052 CODE x := f4()
|
||||
|
||||
TEST t053 CODE x := f5()
|
||||
|
||||
|
||||
proc test(mt)
|
||||
local nLoopOverHead, nTimes, nSeconds, x, i, aThreads:={}
|
||||
|
||||
create_db()
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
#include "hbmemory.ch"
|
||||
if MEMORY( HB_MEM_USEDMAX ) != 0
|
||||
?
|
||||
? "Warning !!! Memory statistic enabled."
|
||||
?
|
||||
endif
|
||||
#endif
|
||||
?
|
||||
? "Startup loop to increase CPU clock..."
|
||||
t:=seconds()+5; while t > seconds(); enddo
|
||||
|
||||
?
|
||||
? date(), time(), VERSION()+build_mode()+", "+OS()
|
||||
? "ARR_LEN =", ARR_LEN
|
||||
? "Startup loop to increase CPU clock..."
|
||||
x := seconds() + 5; while x > seconds(); enddo
|
||||
|
||||
? date(), time(), os()
|
||||
#ifdef __HARBOUR__
|
||||
? version() + iif( hb_mtvm(), " (MT)", "" ), hb_compiler()
|
||||
#else
|
||||
? version()
|
||||
#endif
|
||||
? "N_LOOPS =", N_LOOPS
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
next
|
||||
tn:=secondscpu()-t
|
||||
? "empty loops overhead =", tn
|
||||
#ifdef REAL_TIME
|
||||
? "real time -> seconds()"
|
||||
#else
|
||||
? "CPU usage -> secondsCPU()"
|
||||
#endif
|
||||
? ""
|
||||
x :=t000()
|
||||
? dsp_result( x, 0 )
|
||||
nLoopOverHead := x[2]
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
? replicate("=",68)
|
||||
|
||||
aDb:={ {"F_C", "C", 10, 0},;
|
||||
{"F_N", "N", 10, 2},;
|
||||
{"F_D", "D", 8, 0} }
|
||||
|
||||
cFi1:="tst_tmp.dbf"
|
||||
if file(cFi1)
|
||||
ferase(cFi1)
|
||||
endif
|
||||
dbcreate(cFi1, aDb)
|
||||
select(1)
|
||||
use &cFi1 shared
|
||||
dbappend()
|
||||
replace F_C with dtos(date())
|
||||
replace F_N with 112345.67
|
||||
replace F_D with date()
|
||||
dbcommit()
|
||||
dbunlock()
|
||||
|
||||
cFi2:="tst_tmp2.dbf"
|
||||
if file(cFi2)
|
||||
ferase(cFi2)
|
||||
endif
|
||||
dbcreate(cFi2, aDb)
|
||||
select(2)
|
||||
use &cFi2 exclusive
|
||||
dbappend()
|
||||
replace F_C with dtos(date())
|
||||
replace F_N with 112345.67
|
||||
replace F_D with date()
|
||||
dbcommit()
|
||||
dbunlock()
|
||||
|
||||
#endif
|
||||
|
||||
L_C := dtos(date())
|
||||
L_N := 112345.67
|
||||
L_D := date()
|
||||
|
||||
|
||||
total:=secondscpu()
|
||||
totalr:=seconds()
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=L_C
|
||||
next
|
||||
dsp_time( "c:=L_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=L_N
|
||||
next
|
||||
dsp_time( "n:=L_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=L_D
|
||||
next
|
||||
dsp_time( "d:=L_D -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=M_C
|
||||
next
|
||||
dsp_time( "c:=M_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=M_N
|
||||
next
|
||||
dsp_time( "n:=M_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=M_D
|
||||
next
|
||||
dsp_time( "d:=M_D -> ", t, tn)
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
select(1)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=F_C
|
||||
next
|
||||
dsp_time( "(sh) c:=F_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=F_N
|
||||
next
|
||||
dsp_time( "(sh) n:=F_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=F_D
|
||||
next
|
||||
dsp_time( "(sh) d:=F_D -> ", t, tn)
|
||||
|
||||
select(2)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=F_C
|
||||
next
|
||||
dsp_time( "(ex) c:=F_C -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=F_N
|
||||
next
|
||||
dsp_time( "(ex) n:=F_N -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
d:=F_D
|
||||
next
|
||||
dsp_time( "(ex) d:=F_D -> ", t, tn)
|
||||
#endif
|
||||
|
||||
o:=errorNew()
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=o:GenCode
|
||||
next
|
||||
dsp_time( "n:=o:GenCode -> ", t, tn)
|
||||
nSeconds := seconds()
|
||||
nTimes := secondsCPU()
|
||||
|
||||
#ifdef __HARBOUR__
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=o[8]
|
||||
next
|
||||
dsp_time( "n:=o[8] -> ", t, tn)
|
||||
if !empty(mt) .and. hb_mtvm()
|
||||
aThreads := array( N_TESTS )
|
||||
for i:=1 to N_TESTS
|
||||
aThreads[ i ] := hb_threadStart( "t" + strzero( i, 3 ) )
|
||||
next
|
||||
for i:=1 to N_TESTS
|
||||
if hb_threadJoin( aThreads[ i ], @x )
|
||||
? dsp_result( x, nLoopOverHead )
|
||||
endif
|
||||
next
|
||||
else
|
||||
for i:=1 to N_TESTS
|
||||
? dsp_result( &( "t" + strzero( i, 3 ) )(), nLoopOverHead )
|
||||
next
|
||||
endif
|
||||
#else
|
||||
for i:=1 to N_TESTS
|
||||
? dsp_result( &( "t" + strzero( i, 3 ) )(), nLoopOverHead )
|
||||
next
|
||||
#endif
|
||||
|
||||
#ifdef ASSOC_ARRAY
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100))]:=i
|
||||
next
|
||||
dsp_time( "aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100)]:=i -> ", t, tn)
|
||||
nTimes := secondsCPU() - nTimes
|
||||
nSeconds := seconds() - nSeconds
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100))]
|
||||
next
|
||||
dsp_time( "c:=aAssoc[a2[i%ARR_LEN+1]+ltrim(str(i%100)] -> ", t, tn)
|
||||
#endif
|
||||
|
||||
#ifndef NO_KEYBOARD_TEST
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
inkey()
|
||||
next
|
||||
dsp_time( "inkey() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
nextkey()
|
||||
next
|
||||
dsp_time( "nextkey() -> ", t, tn)
|
||||
#endif
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
round(i/1000,2)
|
||||
next
|
||||
dsp_time( "round(i/1000,2) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
str(i/1000)
|
||||
next
|
||||
dsp_time( "str(i/1000) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
val(a3[i%ARR_LEN+1])
|
||||
next
|
||||
dsp_time( "val(a3[i%ARR_LEN+1]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
j:=date()
|
||||
for i:=1 to N_LOOPS
|
||||
dtos(j+i%10000-5000)
|
||||
next
|
||||
dsp_time( "dtos(j+i%10000-5000) -> ", t, tn)
|
||||
|
||||
bc:={||i%ARR_LEN}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc)
|
||||
next
|
||||
dsp_time( "eval({||i%ARR_LEN}) -> ", t, tn)
|
||||
|
||||
bc:={|x|x%ARR_LEN}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval({|x|x%ARR_LEN},i) -> ", t, tn)
|
||||
|
||||
bc:={|x|f1(x)}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval({|x|f1(x)},i) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
n:=&("f1("+str(i)+")")
|
||||
next
|
||||
dsp_time( "&('f1('+str(i)+')') -> ", t, tn)
|
||||
|
||||
bc:=&("{|x|f1(x)}")
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
eval(bc,i)
|
||||
next
|
||||
dsp_time( "eval([&('{|x|f1(x)}')]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j:=valtype(a)+valtype(i)
|
||||
next
|
||||
dsp_time( "j := valtype(a)+valtype(i) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := str(i%100,2) $ a2[i%ARR_LEN+1]
|
||||
next
|
||||
dsp_time( "j := str(i%100,2) $ a2[i%ARR_LEN+1] -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := val(a2[i%ARR_LEN+1])
|
||||
next
|
||||
dsp_time( "j := val(a2[i%ARR_LEN+1]) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] == c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] == s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] = c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] = s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] >= c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] >= s -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
j := a2[i%ARR_LEN+1] < c
|
||||
next
|
||||
dsp_time( "j := a2[i%ARR_LEN+1] < s -> ", t, tn)
|
||||
|
||||
aa:={}
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
if i%1000 == 0
|
||||
aa:={}
|
||||
endif
|
||||
aadd(aa,{i,j,c,a,a2,t,bc})
|
||||
next
|
||||
dsp_time( "aadd(aa,{i,j,s,a,a2,t,bc}) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f0()
|
||||
next
|
||||
dsp_time( "f0() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f1(i)
|
||||
next
|
||||
dsp_time( "f1(i) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
c:=replicate(c,5000)
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(@c)
|
||||
next
|
||||
dsp_time( "f2(@c["+ltrim(str(len(c)))+"]) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(c)
|
||||
c2:=c
|
||||
next
|
||||
dsp_time( "f2(c["+ltrim(str(len(c)))+"]); c2:=c -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(@c)
|
||||
c2:=c
|
||||
next
|
||||
dsp_time( "f2(@c["+ltrim(str(len(c)))+"]); c2:=c -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f3(a,a2,c,i,j,t,bc)
|
||||
next
|
||||
dsp_time( "f3(a,a2,c,i,j,t,bc) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
f2(a2)
|
||||
next
|
||||
dsp_time( "f2(a2) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=f4()
|
||||
next
|
||||
dsp_time( "s:=f4() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
c:=f5()
|
||||
next
|
||||
dsp_time( "s:=f5() -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a,i%ARR_LEN)
|
||||
next
|
||||
dsp_time( "ascan(a,i%ARR_LEN) -> ", t, tn)
|
||||
|
||||
c:=dtos(date())
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a2,c+chr(i%64+64))
|
||||
next
|
||||
dsp_time( "ascan(a2,c+chr(i%64+64)) -> ", t, tn)
|
||||
|
||||
t:=secondscpu()
|
||||
for i:=1 to N_LOOPS
|
||||
ascan(a,{|x|x==i%ARR_LEN})
|
||||
next
|
||||
dsp_time( "ascan(a,{|x|x==i%ARR_LEN}) -> ", t, tn)
|
||||
|
||||
? replicate("=",60)
|
||||
dsp_time( "total application time:", total, 0)
|
||||
? padr( "total real time:",50)+str(seconds()-totalr,8,2)
|
||||
? replicate("=",68)
|
||||
? dsp_result( { "total application time:", nTimes }, 0)
|
||||
? dsp_result( { "total real time:", nSeconds }, 0 )
|
||||
?
|
||||
|
||||
#ifndef NO_DBF_TEST
|
||||
remove_db()
|
||||
return
|
||||
|
||||
if file(cFi1)
|
||||
ferase(cFi1)
|
||||
endif
|
||||
if file(cFi2)
|
||||
ferase(cFi2)
|
||||
endif
|
||||
|
||||
#endif
|
||||
|
||||
return nil
|
||||
|
||||
function dsp_time(s,t,tn)
|
||||
? padr(s,50)+str(max(secondscpu()-t-tn,0),8,2)
|
||||
return nil
|
||||
|
||||
function f0(x)
|
||||
function f0()
|
||||
return nil
|
||||
|
||||
function f1(x)
|
||||
return x+1
|
||||
return x
|
||||
|
||||
function f2(s)
|
||||
function f2(x)
|
||||
HB_SYMBOL_UNUSED( x )
|
||||
return nil
|
||||
|
||||
function f3(a,b,c,d,e,f,g,h,i)
|
||||
HB_SYMBOL_UNUSED( a )
|
||||
HB_SYMBOL_UNUSED( b )
|
||||
HB_SYMBOL_UNUSED( c )
|
||||
HB_SYMBOL_UNUSED( d )
|
||||
HB_SYMBOL_UNUSED( e )
|
||||
HB_SYMBOL_UNUSED( f )
|
||||
HB_SYMBOL_UNUSED( g )
|
||||
HB_SYMBOL_UNUSED( h )
|
||||
HB_SYMBOL_UNUSED( i )
|
||||
return nil
|
||||
|
||||
function f4()
|
||||
@@ -519,71 +380,34 @@ return space(4000)
|
||||
function f5()
|
||||
return space(5)
|
||||
|
||||
function build_mode()
|
||||
#ifdef __CLIP__
|
||||
return " (MT)"
|
||||
#else
|
||||
#ifdef __XHARBOUR__
|
||||
return iif( HB_MULTITHREAD(), " (MT)", "" ) + ;
|
||||
iif( MEMORY( HB_MEM_USEDMAX ) != 0, " (FMSTAT)", "" )
|
||||
#else
|
||||
#ifdef __HARBOUR__
|
||||
return iif( HB_MTVM(), " (MT)", "" ) + ;
|
||||
iif( MEMORY( HB_MEM_USEDMAX ) != 0, " (FMSTAT)", "" )
|
||||
#else
|
||||
#ifdef __XPP__
|
||||
return " (MT)"
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
return ""
|
||||
|
||||
#ifdef FlagShip
|
||||
function fs_seconds()
|
||||
LOCAL_DOUBLE nret := 0
|
||||
#Cinline
|
||||
{
|
||||
#include <sys/time.h>
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
if( !gettimeofday(&tv, NULL) )
|
||||
nret = (double) tv.tv_sec + (double) (tv.tv_usec) / 1000000;
|
||||
/*
|
||||
nret = (double) (tv.tv_sec - tz.tz_minuteswest * 60 ) % 86400 +
|
||||
(double) tv.tv_usec / 1000000;
|
||||
*/
|
||||
}
|
||||
#endCinline
|
||||
return ( nret )
|
||||
static func dsp_result( aResult, nLoopOverHead )
|
||||
return padr( "[ " + left( aResult[1], 56 ) + " ]", 60, "." ) + ;
|
||||
strtran( str( max( aResult[2] - nLoopOverHead, 0 ), 8, 2 ), " ", "." )
|
||||
|
||||
#ifndef FlagShip5
|
||||
FUNCTION cursesinit()
|
||||
CALL fgsIoctl2
|
||||
#Cinline
|
||||
{
|
||||
#include <fcntl.h>
|
||||
int arg;
|
||||
if ((arg = fcntl(0, F_GETFL, 0)) != -1)
|
||||
fcntl(0, F_SETFL, arg | O_NONBLOCK);
|
||||
}
|
||||
#endCinline
|
||||
return nil
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if __HARBOUR__ < 0x010100
|
||||
STATIC FUNCTION HB_MTVM()
|
||||
RETURN .F.
|
||||
#endif
|
||||
#define TMP_FILE "_tst_tmp.dbf"
|
||||
static proc create_db()
|
||||
remove_db()
|
||||
dbcreate( TMP_FILE, { {"F_C", "C", 10, 0},;
|
||||
{"F_N", "N", 10, 2},;
|
||||
{"F_D", "D", 8, 0} } )
|
||||
use TMP_FILE exclusive
|
||||
dbappend()
|
||||
replace F_C with dtos(date())
|
||||
replace F_N with 112345.67
|
||||
replace F_D with date()
|
||||
close
|
||||
return
|
||||
|
||||
#ifndef __HARBOUR__
|
||||
STATIC FUNCTION hb_OSNewLine()
|
||||
#ifdef FlagShip
|
||||
RETURN Chr( 10 )
|
||||
#elif __CLIP__
|
||||
RETURN Chr( 10 )
|
||||
#else
|
||||
RETURN Chr( 13 ) + Chr( 10 )
|
||||
#endif
|
||||
#endif
|
||||
static proc remove_db()
|
||||
ferase( TMP_FILE )
|
||||
return
|
||||
|
||||
static proc close_db()
|
||||
close
|
||||
return
|
||||
|
||||
static proc use_dbsh()
|
||||
use TMP_FILE shared
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user