[AccessD] Array faster in DLL?

Shamil Salakhetdinov shamil at users.mns.ru
Mon Oct 31 06:56:42 CST 2005


With variables moved to (static) memory out of stack the code works for ~6
seconds slower (yes, that was stupid of me to expect it running faster -
when getting/putting variable from/to stack Intel processors should work
faster). Well, one can see 6 seconds difference on 10,000,000,000 cycle runs
only - for usual programming this difference doesn't matter. Here is C++
sample code, which runs 19 seconds on my PC:

#include "stdafx.h"
#include <time.h>

typedef long COUNTER_TYPE;

const long lngItems = 100;
long alngTmp[lngItems][2];
long lngLoop;
long lngItem;
long lngResult = 0;
time_t /*double*/ dblStart;
time_t /*double*/ dblStop;
long lngSeconds;
COUNTER_TYPE lngCnt;

static long ArrayTimeLocal(long lngLoopMax, COUNTER_TYPE& lngTotalCnt, bool
useTracePrinting = false);
int _tmain(int argc, _TCHAR* argv[])
{
 _int64 lngTotalCnt = 0;
 COUNTER_TYPE lngCnt = 0;
 time_t /*double*/ dblStart;
 time_t /*double*/ dblStop;
 long lngSeconds = 0;

 time(&dblStart);
 for (int i=1; i<=100; i++) {
    ArrayTimeLocal(1000000, lngCnt);
    lngTotalCnt += lngCnt;
 }
 time(&dblStop);
 lngSeconds = (long)difftime(dblStop,dblStart);;
 printf("Final Result = %ld, Final Counter = %I64d\n",
     lngSeconds, lngTotalCnt);
}

static long ArrayTimeLocal(long lngLoopMax, COUNTER_TYPE& lngTotalCnt, bool
useTracePrinting) {
 lngCnt=0;
 if (useTracePrinting) printf("Array looping test started..\n");
 time(&dblStart);
 for (lngLoop=0; lngLoop < lngLoopMax; lngLoop++) {
  for (lngItem=0; lngItem < lngItems; lngItem++) {
   alngTmp[lngItem][0] = lngLoop * 10;
   if (alngTmp[lngItem][0] / 10 == 100) lngResult = 1;
   else lngResult = 0;
   lngCnt++;
  }
 }
 time(&dblStop);
 if (useTracePrinting) printf("Array looping test ended.\n");
 lngSeconds = (long)difftime(dblStop,dblStart);;
 if (useTracePrinting) printf("Result = %lf, Counter = %ld\n",
     lngSeconds, lngTotalCnt);
 lngTotalCnt = lngCnt;
 return lngSeconds;
}

Shamil

----- Original Message ----- 
From: "Shamil Salakhetdinov" <shamil at users.mns.ru>
To: "Access Developers discussion and problem solving"
<accessd at databaseadvisors.com>
Sent: Monday, October 31, 2005 3:22 PM
Subject: Re: [AccessD] Array faster in DLL?


> Gustav,
>
> Yes, I can make a C++ dll but maybe you first (re)define your test
function
> call interface because even if you call very quick C++ function 1000 times
> from VB6 you can loose all the advantages this C++ function gives.
>
> Currently - here is C++ (non managed) console applications results for a
> function similar to yours:
>
> 10,000,000,000 your cycles in 13 seconds (ot looks like I did some
mistakes
> in my previous time calculations - I have to recheck)
>
> =====================================
> Final Result = 13, Final Counter = 10000000000
> =====================================
>
> Here is the C++ code for the last test:
>
> #include "stdafx.h"
> #include <time.h>
>
> static long ArrayTimeLocal(long lngLoopMax, long& lngTotalCnt, bool
> useTracePrinting = false);
> int _tmain(int argc, _TCHAR* argv[])
> {
>  _int64 lngTotalCnt = 0;
>  long lngCnt = 0;
>  time_t /*double*/ dblStart;
>  time_t /*double*/ dblStop;
>  long lngSeconds = 0;
>
>  time(&dblStart);
>  for (int i=1; i<=10; i++) {
>     ArrayTimeLocal(10000000, lngCnt);
>     lngTotalCnt += lngCnt;
>  }
>  time(&dblStop);
>  lngSeconds = (long)difftime(dblStop,dblStart);;
>  printf("Final Result = %ld, Final Counter = %I64d\n",
>      lngSeconds, lngTotalCnt);
> }
>
> static long ArrayTimeLocal(long lngLoopMax, long& lngTotalCnt, bool
> useTracePrinting) {
>  const long lngItems = 100;
>  long alngTmp[lngItems][2];
>  long lngLoop;
>  long lngItem;
>  long lngResult = 0;
>  time_t /*double*/ dblStart;
>  time_t /*double*/ dblStop;
>  long lngSeconds;
>  long lngCnt = 0;
>
>  if (useTracePrinting) printf("Array looping test started..\n");
>  time(&dblStart);
>  for (lngLoop=0; lngLoop < lngLoopMax; lngLoop++) {
>   for (lngItem=0; lngItem < lngItems; lngItem++) {
>    alngTmp[lngItem][0] = lngLoop * 10;
>    if (alngTmp[lngItem][0] / 10 == 100) lngResult = 1;
>    else lngResult = 0;
>    lngCnt++;
>   }
>  }
>  time(&dblStop);
>  if (useTracePrinting) printf("Array looping test ended.\n");
>  lngSeconds = (long)difftime(dblStop,dblStart);;
>  if (useTracePrinting) printf("Result = %lf, Counter = %ld\n",
>      lngSeconds, lngTotalCnt);
>  lngTotalCnt = lngCnt;
>  return lngSeconds;
> }
>
> I will try to move now all variable from stack to static memory - I expect
> it may bring even more speed execution gains. We will see.
>
> As soon as you define your final call interface I will make a test C++
> .dll...
>
> Shamil
>
<<< tail skipped>>>




More information about the AccessD mailing list