Files
harbour-core/harbour/tests/speedold.prg
Przemyslaw Czerpak 2f6634cd2a 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 19:53:57 +00:00

590 lines
10 KiB
Plaintext

/*
* $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