

TIMING PROGRAM EXECUTION FROM WITHIN MAIN()!
     Originally by:  A. Shipman, rewritten By:  Chris Meyer


    In this example, the size of the data pointer is 2,

The data to be accessed is as follows:

The structure contains the following...
    This is field one
    Here is the second field
    Field Three at your service
    Chris was here
The array provides access to...
    This is field one
    Here is the second field
    Field Three at your service
    Chris was here

Each function returns the count of clock ticks.The lower the better.

accessing using Object: result = 2
accessing using Structure: result = 4
accessing using Array: result = 3
accessing using Both Structure and Array: result = 4
accessing using NULL statement empty loop: result = 2
Two loops Source to destination Arrays: result = 16
accessing one Array Loop: result = 13

1. Sum of time for (UsingStructure + UsingArray) = 7

2. Sum less time for both in one loop = 3

3. time to do an empty loop = 2

4. Error  (item 3 less item 2 should be near zero) = 1


Listing 5 (Shipman's )

The  measured  times,  for all the  various  Structure  and  Array  Accesses
using this program, as it was written by Art Shipman, remain almost the same
no  matter  which  compiler  optimization  switches  are  on  or  off.   The
program simply gives an excessive timing count for each  activity  measured.


The data to be accessed is as follows:

The structure contains the following...
    This is field one
    Here is the second field
    Field Three at your service
    Chris was here
The array provides access to...
    This is field one
    Here is the second field
    Field Three at your service
    Chris was here

Each function returns the count of clock ticks.The lower the better.

accessing usings_object(): result = 4
accessing usingstructure(): result = 4
accessing usingarray(): result = 4
accessing usingstrucandarrayboth(): result = 7
accessing emptyloop(): result = 2
accessing looptoloop(): result = 14
accessing oneloop(): result = 13

1. Sum of time for (UsingStructure + UsingArray) = 8

2. Sum less time for both in one loop = 1

3. time to do an empty loop = 2

4. Error  (item 3 less item 2 should be near zero) = 1


Listing5

/* #include <stdio.h> */
/* #include <bios.h> */
/* #include <string.h> */

#define LIMIT 70000L

/* Get current BIOS time. (t below)       */
/* Return to fn. LIMIT times to do read   */
/* Then get biostime - t (earlier time)   */

#define INIT long i; long t = biostime(0,0)

/*
#define access(y,x)             \
  printf("accessing %s(): result = %d\n", #x, elapsed[y]=x() )
*/

#define TEST(x)          \
INIT;                    \
for(i=0; i<LIMIT; i++)  {       \
      x;             \
  }      \
  return(int)    \
  (biostime(0,0)-t)

/* #x holds the name of the function that was just run ie. usings_object */
/* y will hold the time that has elapsed. */

#define access(x,y)             \
  printf("accessing %s(): result = %d\n", #x, elapsed[y]=x() )


typedef struct anything
     {
     char field1[50],
     field2[50],
     field3[50],
     field4[50];
     } anything;

anything s_object;
anything *s_pointer = &s_object;

char *destarray[4];
char *sourcearray[4];
char *access;
int j=0;

/* Global Variables of type enum, end up as numbers, not names! */
enum list
    {
    S_OBJECT,
    STRUCTURE,
    ARRAY,
    BOTH,
    EMPTY,
    ONELOOP,
    TWOLOOPS
    };

void main(void)
{
clrscr();

       /* Initialize Structure */

strcpy(s_pointer->field1,"This is field one");
strcpy(s_pointer->field2,"Here is the second field");
strcpy(s_pointer->field3,"Field Three at your service");
strcpy(s_pointer->field4,"Chris was here");


       /* Initialize the purportedly slower array */

sourcearray[0] = s_pointer->field1;
sourcearray[1] = s_pointer->field2;
sourcearray[2] = s_pointer->field3;
sourcearray[3] = s_pointer->field4;

VerifyContents();

compareaccesstimes();

}


/* Each of the TEST functions calls the TEST prototyped in the preprocessor */
/* And the arrays are accessed LIMIT amount of times before being printed.  */

int usings_object(void)
{


TEST(   access = (char *)&s_object.field1;
    access = (char *)&s_object.field2;
    access = (char *)&s_object.field3;
    access = (char *)&s_object.field4;
     );
}

int usingstructure(void)
{
TEST(   access = s_pointer->field1;
    access = s_pointer->field2;
    access = s_pointer->field3;
    access = s_pointer->field4;
     );
}


int usingarray(void)
{
TEST(   access = sourcearray[0];
    access = sourcearray[1];
    access = sourcearray[2];
    access = sourcearray[3];

    );
}


int usingstrucandarrayboth(void)
{
TEST(   access = s_pointer->field1;
    access = s_pointer->field2;
    access = s_pointer->field3;
    access = s_pointer->field4;

    access = sourcearray[0];
    access = sourcearray[1];
    access = sourcearray[2];
    access = sourcearray[3];
     );
}


/* These are called toward the end of compareaccesstimes and TEST in turn, */
/* Is done and results printed out behind the scene! Not viewable in DEBUG!*/

int emptyloop(void)
{
TEST( ; );
}

int looptoloop(void)
{
TEST(  for(j=0; j<4; j++)
       {
       destarray[j] = sourcearray[j];
       }
    );
}



int oneloop(void)
{
TEST(   for(j=0; j<4; j++)
    {
    access = sourcearray[j];
    }
     );
}



void analyze(int *times)
{
int total = times[STRUCTURE] + times[ARRAY];
int difference = total - times[BOTH];

printf("\n1. Sum of time for (UsingStructure + \
UsingArray) = %d\n", total );

printf("\n2. Sum less time for both in one loop = %d\n", difference );

printf("\n3. time to do an empty loop = %d\n", times[EMPTY] );

printf("\n4. Error  (item 3 less item 2 should be near \
zero) = %d\n",times[EMPTY]-difference );


}


compareaccesstimes()
{
int elapsed[10];                  /* Array of 10 integers */
int chris = 0;
access (usings_object,S_OBJECT);
access (usingstructure,STRUCTURE);
access (usingarray,ARRAY);
access (usingstrucandarrayboth,BOTH);
access (emptyloop,EMPTY);
access (looptoloop,TWOLOOPS);
access (oneloop,ONELOOP);

analyze(elapsed);
}




VerifyContents()
{
int i;
puts("The data to be accessed is as follows:\n");


printf("The structure contains the following...\n");
printf("\t%s\n\t%s\n\t%s\n\t%s\n",
      s_pointer->field1,
      s_pointer->field2,
      s_pointer->field3,
      s_pointer->field4);

printf("The array provides access to...\n");
for(i=0; i<4; i++)
    {
    printf("\t%s\n", sourcearray[i] );
    }

puts("\nEach function returns the count of clock ticks."\
    "The lower the better.\n");

}
