Hi,

Mindaugas Kavaliauskas wrote:
BTW how expensive (time consuming) is WINSOCK initialization in MS-Windows?

      HB_ULONG ulTime = hb_dateMilliSeconds();
      hb_socketInit();
HB_TRACE( HB_TR_ALWAYS, ("hb_socketInit() time=%d", hb_dateMilliSeconds() - ulTime) );

prints:

netiocli.c:470: HB_TR_ALWAYS hb_socketInit() time=0

Do you have any other test code for it?

Some time ago I was testing Python, Ruby, Java, etc speed. I was surprised about how Python's clock() function. It returns a lot of decimals on Windows. I've looked into the source and found a useful Win32 API function QueryPerformanceCounter for implementation of a high precision timer in Windows.

Here is the simplest version:
#include "windows.h"
static LARGE_INTEGER iStart;
static LARGE_INTEGER iFreq = {0};
double hpclock( void )
{
  LARGE_INTEGER iTime;
  if( iFreq.QuadPart == 0 )
  {
    QueryPerformanceCounter( &iStart );
    QueryPerformanceFrequency( &iFreq );
  }
  QueryPerformanceCounter( &iTime );
return ( double )( iTime.QuadPart - iStart.QuadPart ) / ( double ) iFreq.QuadPart;
}

The modified s_netio_init() code:
      double dTime = hpclock();
      hb_socketInit();
HB_TRACE( HB_TR_ALWAYS, ("hb_socketInit() time=%g", hpclock() - dTime) );
      dTime = hpclock();
      Sleep(1000);
      HB_TRACE( HB_TR_ALWAYS, ("1 second =%g", hpclock() - dTime) );
HB_TRACE( HB_TR_ALWAYS, ("hpclock() overhead=%g", hpclock() - hpclock()) );

prints:

C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00185554
netiocli.c:492: HB_TR_ALWAYS 1 second =1.00001
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.67619e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00119596
netiocli.c:492: HB_TR_ALWAYS 1 second =0.999618
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.67619e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00146946
netiocli.c:492: HB_TR_ALWAYS 1 second =0.999511
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.39683e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00144739
netiocli.c:492: HB_TR_ALWAYS 1 second =0.999809
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.67619e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00116998
netiocli.c:492: HB_TR_ALWAYS 1 second =0.999526
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.67619e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00183431
netiocli.c:492: HB_TR_ALWAYS 1 second =0.99934
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.39683e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00191924
netiocli.c:492: HB_TR_ALWAYS 1 second =0.99944
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.95556e-06

.T.
C:\harbour\contrib\hbnetio\tests>rpctest.exe
netiocli.c:489: HB_TR_ALWAYS hb_socketInit() time=0.00148734
netiocli.c:492: HB_TR_ALWAYS 1 second =0.999669
netiocli.c:493: HB_TR_ALWAYS hpclock() overhead=-1.67619e-06

.T.

We already have two time functions that return seconds from midnight and milliseconds (absolute UTC), but sometimes it is useful to have a higher precision time function and a function that "ignores" adjustment of computer time. The proposed function has these properties, but I do not know if such implementation is possible in another platforms. I guess this clock uses CPU clock counter, so, I do not know how it works in real multi-CPU environment.


Regards,
Mindaugas
_______________________________________________
Harbour mailing list (attachment size limit: 40KB)
Harbour@harbour-project.org
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to