Files
harbour-core/harbour/tests/speedtst.prg
Przemyslaw Czerpak d99b93ad14 2006-11-13 03:40 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/bin/hb-func.sh
    + pass GTK paths to GCC in hb* scripts when -xbgtk switch is used

  * harbour/contrib/rdd_ads/rddads.h
  * harbour/contrib/rdd_ads/adsfunc.c
    * indenting and casting

  * harbour/source/rdd/dbfcdx/dbfcdx1.c
    * cleaned typos in comments

  + harbour/tests/speedtst.prg
    + added speed test

  * harbour/include/hbpp.h
  * harbour/source/pp/ppcore.c
    + added HB_PP_TOKEN_ISNEUTRAL() macro to make code a little bit more
      readable

  * harbour/include/std.ch
    + added some missing old PP commands

  * harbour/source/Makefile
    * minor modification in order of compiled libraries

  * harbour/source/pp/pplib.c
    * changed the PP interface for .prg code.
      Now following functions are supported:

         __PP_INIT( [<cIncludePath>] [, <cStdChFile> ] ) -> <pPP>
            initialize new PP context and return pointer to it.
            when <cStdChFile> is empty string ("") then no default rules are
            used  only the dynamically created #defines like __HARBOUR__,
            __DATE__, __TIME__, __PLATFORM__*

         __PP_FREE( <pPP> )
            free PP context.

         __PP_PATH( <pPP>, <cPath> [, <lClearPrev>] )
            add new (or replace previous) include paths.

         __PP_RESET( <pPP> )
            reset the PP context (remove all rules added by user or
            preprocessed code)

         __PP_ADDRULE( <pPP>, <cDirective> )
            preprocess and execute new preprocessor directive

         __PREPROCESS( <pPP>, <cCode> ) -> <cPreprocessedCode>
            preprocess given code and return result

      User can create more then one PP context and then use each of them
      separately. Any modification in one context have no effect in other.
2006-11-13 02:40:33 +00:00

515 lines
8.8 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 __XHARBOUR__
#define ASSOC_ARRAY Hash()
#undef REAL_TIME
#endif
#ifdef __HARBOUR__
#undef REAL_TIME
#endif
#ifdef REAL_TIME
#xtranslate secondscpu([<x>]) => seconds()
#endif
#ifndef EOL
#define EOL chr(10)
#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, cFi
#ifdef ASSOC_ARRAY
local aAssoc := ASSOC_ARRAY
#endif
private M_C := dtos(date()),;
M_N := 112345.67,;
M_D := date()
#ifndef __CLIP__
//#ifdef __XHARBOUR__
// 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
? ""
? VERSION()+", "+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
? ""
aDb:={ {"F_C", "C", 10, 0},;
{"F_N", "N", 10, 2},;
{"F_D", "D", 8, 0} }
cFi:="tst_tmp.dbf"
if file(cFi)
ferase(cFi)
endif
#ifndef NO_DBF_TEST
dbcreate(cFi, aDb)
select(1)
use &cFi shared
dbappend()
replace F_C with dtos(date())
replace F_N with 112345.67
replace F_D with date()
dbcommit()
dbunlock()
cFi:="tst_tmp2.dbf"
if file(cFi)
ferase(cFi)
endif
dbcreate(cFi, aDb)
select(2)
use &cFi 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 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}) -> ", 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
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
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)
?
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(50000)
#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