* 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.
515 lines
8.8 KiB
Plaintext
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
|