Thanks for these tests.

Local results:

  __I18N_LOADFROMMEMORY:         9.86 sec.
  hb_deserialize:                9.02 sec.
  other code overhead:           4.95 sec.
  __I18N_GETTEXT:               18.84 sec.
  HB_HKEY:                      16.05 sec.
  Native hash .prg access:      24.36 sec.

Very good results here also.

And there is a cKey assignment which could
still be optimized out in the function call
loops.

Brgds,
Viktor

On 2008.11.05., at 19:01, Przemyslaw Czerpak wrote:

On Wed, 05 Nov 2008, Szak�ts Viktor wrote:

Hi Viktor,

[...]
I'll do some tests a bit later.

Below is small test code I've just created.
Here I my results:

  __I18N_LOADFROMMEMORY:         5.93 sec.
  hb_deserialize:                6.63 sec.
  other code overhead:           2.28 sec.
  __I18N_GETTEXT:               16.11 sec.
  HB_HKEY:                      12.08 sec.
  Native hash .prg access:      20.03 sec.

Looks that function call overhead is not too big in this test.

best regards,
Przemek


#define N_LOOP 1000
#define N_SIZE 10000
proc main()
  local a, h, aMem, hMem, i, n, t, tn, cKey, aKeys

  ? "Building arrays..."
  h := {=>}
  hb_hAllocate( h, N_SIZE )
  a := array( N_SIZE )
  aKeys := array( N_SIZE )
  for i:=1 to N_SIZE
     cKey := repl("text.", 9) + "[" + str(i,10) + " ]" + ;
             repl( "*", i % 20 )
     aKeys[ i ] := cKey
     a[ i ] := { cKey, upper( cKey ) }
     h[ cKey ] := upper( cKey )
  next
  aSort( a,,, { |x,y| x[1] < y[1] } )
  ? "Saving arrays to files"
  __I18N_SAVE( "data.arr", a )
  hb_memowrit( "data.hsh", hb_serialize( h ) )

  aMem := memoread( "data.arr" )
  hMem := memoread( "data.hsh" )

  t := secondsCPU()
  for i := 1 TO N_LOOP
     a := __I18N_LOADFROMMEMORY( aMem )
  next
  ? "__I18N_LOADFROMMEMORY:", secondsCPU() - t, "sec."

  t := secondsCPU()
  for i := 1 TO N_LOOP
     h := hb_deserialize( hMem )
  next
  ? "hb_deserialize:", secondsCPU() - t, "sec."

  t := secondsCPU()
  for i := 1 TO N_LOOP
     for n := 1 to N_SIZE
        cKey := aKeys[ n ]
     next
  next
  ? "other code overhead:", tn := secondsCPU() - t, "sec."


  t := secondsCPU()
  for i := 1 TO N_LOOP
     for n := 1 to N_SIZE
        cKey := aKeys[ n ]
        cKey := __I18N_GETTEXT( cKey, a )
     next
  next
  ? "__I18N_GETTEXT:", secondsCPU() - t - tn, "sec."

  t := secondsCPU()
  for i := 1 TO N_LOOP
     for n := 1 to N_SIZE
        cKey := aKeys[ n ]
        cKey := HB_HKEY( h, cKey )
     next
  next
  ? "HB_HKEY:", secondsCPU() - t - tn, "sec."

  t := secondsCPU()
  for i := 1 TO N_LOOP
     for n := 1 to N_SIZE
        cKey := aKeys[ n ]
        if cKey $ h
           cKey := h[ cKey ]
        endif
     next
  next
  ? "Native hash .prg access:", secondsCPU() - t - tn, "sec."

return

#pragma begindump
#include "hbapi.h"
#include "hbapierr.h"

HB_FUNC( HB_HKEY )
{
  PHB_ITEM pHash = hb_param( 1, HB_IT_HASH );
  PHB_ITEM pKey = hb_param( 2, HB_IT_HASHKEY );

  if( pHash && pKey )
  {
     ULONG ulPos;
     hb_hashScan( pHash, pKey, &ulPos );
     if( ulPos )
        pKey = hb_hashGetValueAt( pHash, ulPos );
     hb_itemReturn( pKey );
  }
  else
     hb_errRT_BASE( EG_ARG, 1123, NULL, HB_ERR_FUNCNAME,
                    HB_ERR_ARGS_BASEPARAMS );
}
#pragma enddump
_______________________________________________
Harbour mailing list
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour

_______________________________________________
Harbour mailing list
[email protected]
http://lists.harbour-project.org/mailman/listinfo/harbour

Reply via email to