[AccessD] Array faster in DLL?

Shamil Salakhetdinov shamil at users.mns.ru
Mon Oct 31 06:22:23 CST 2005


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


----- Original Message ----- 
From: "Gustav Brock" <Gustav at cactus.dk>
To: <accessd at databaseadvisors.com>
Sent: Monday, October 31, 2005 2:56 PM
Subject: Re: [AccessD] Array faster in DLL?


> Hi Shamil
>
> Oh my ... could you create a DLL with the essentials from your
ArrayTimeLocal skipping the console parts? It just need to return the
lngSeconds.
>
> Looks like I need some C++ stuff for this project!
>
> /gustav
>
> >>> shamil at users.mns.ru 31-10-2005 12:17:09 >>>
> Gustav,
>
> And finally here is managed C++, which runs instantaneously:
>
> #include "stdafx.h"
>
> #using <mscorlib.dll>
> #using <Microsoft.VisualBasic.dll>
>
> using namespace System;
>
> static long ArrayTimeLocal(long lngLoopMax, long& lngTotalCnt);
> int _tmain()
> {
>  long lngTotalCnt = 0;
>  long lngResult = 0;
>
>  lngResult = ArrayTimeLocal(1000000, lngTotalCnt);
>  Console::WriteLine(String::Format(
>   S"Final Result = {0:#,##0}, Final Counter = {1:#,##0}",
>   __box(lngResult), __box(lngTotalCnt)));
> }
>
> static long ArrayTimeLocal(long lngLoopMax, long& lngTotalCnt) {
>  const long lngItems = 100;
>  long alngTmp[lngItems-1][2];
>  long lngLoop;
>  long lngItem;
>  long lngResult=0;
>  double dblStart;
>  double dblStop;
>  long lngSeconds;
>
>  Console::WriteLine("Array looping test started...");
>  dblStart = Microsoft::VisualBasic::DateAndTime::Timer;
>  lngTotalCnt = 0;
>  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;
>    lngTotalCnt++;
>   }
>  }
>  dblStop = Microsoft::VisualBasic::DateAndTime::Timer;
>  Console::WriteLine("Array looping test ended.");
>  lngSeconds = (long)(dblStop - dblStart);
>  return lngSeconds;
> }
>
> Output
> ---------
> Array looping test started...
> Array looping test ended.
> Final Result = 0, Final Counter = 100,000,000
>
> And it takes ~18 seconds on my PC to run this test ADDITIONALLY looped 100
> times....
>
> Shamil
>
>
> -- 
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com




More information about the AccessD mailing list