diff options
author | Matt Turner <mattst88@gmail.com> | 2008-11-14 04:01:47 +0000 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2008-11-14 04:01:47 +0000 |
commit | 70e35dac3ac20a4554bce8b30f236d220e22487e (patch) | |
tree | dc2cb38fd574a25672993acc6d78a3e2dedc78a8 /huffman.c | |
parent | fac9b754c5c93f49c951fa157a3cb30b6fb05214 (diff) |
-- Remove stop watch functions from idea.c, linear.c, and huffman.c
git-svn-id: svn://mattst88.com/svn/cleanbench/trunk@26 0d43b9a7-5ab2-4d7b-af9d-f64450cef757
Diffstat (limited to 'huffman.c')
-rw-r--r-- | huffman.c | 327 |
1 files changed, 112 insertions, 215 deletions
@@ -4,6 +4,7 @@ #include <string.h> #include <math.h> #include <limits.h> +#include <time.h> #include "nmglobal.h" #include "nbench1.h" @@ -40,69 +41,11 @@ static long plaintextlen; /* Length of plaintext */ static void create_text_line(char *dt,long nchars); static void create_text_block(char *tb, unsigned long tblen, unsigned short maxlinlen); -static unsigned long DoHuffIteration(char *plaintext, - char *comparray, char *decomparray, +static clock_t DoHuffIteration(char *plaintext, char *comparray, char *decomparray, unsigned long arraysize, unsigned long nloops, huff_node *hufftree); static void SetCompBit(uint8_t *comparray, uint32_t bitoffset, char bitchar); static int GetCompBit(uint8_t *comparray, uint32_t bitoffset); -/* -** Word catalog -*/ -#define WORDCATSIZE 50 - -char *wordcatarray[WORDCATSIZE] = { /* FIXME: const? */ - "Hello", - "He", - "Him", - "the", - "this", - "that", - "though", - "rough", - "cough", - "obviously", - "But", - "but", - "bye", - "begin", - "beginning", - "beginnings", - "of", - "our", - "ourselves", - "yourselves", - "to", - "together", - "togetherness", - "from", - "either", - "I", - "A", - "return", - "However", - "that", - "example", - "yet", - "quickly", - "all", - "if", - "were", - "includes", - "always", - "never", - "not", - "small", - "returns", - "set", - "basic", - "Entered", - "with", - "used", - "shown", - "you", - "know" -}; /************** ** DoHuffman ** @@ -113,132 +56,101 @@ char *wordcatarray[WORDCATSIZE] = { /* FIXME: const? */ ** Also, the compression cycle includes building the ** Huffman tree. */ -void DoHuffman(void) +void +DoHuffman(void) { -HuffStruct *lochuffstruct; /* Loc pointer to global data */ -char *context; -int systemerror; -unsigned long accumtime; -double iterations; -char *comparray = NULL; -char *decomparray = NULL; -char *plaintext = NULL; - -/* -** Link to global data -*/ -lochuffstruct=&global_huffstruct; - -/* -** Set error context. -*/ -context="CPU:Huffman"; - -/* -** Allocate memory for the plaintext and the compressed text. -** We'll be really pessimistic here, and allocate equal amounts -** for both (though we know...well, we PRESUME) the compressed -** stuff will take less than the plain stuff. -** Also note that we'll build a 3rd buffer to decompress -** into, and we preallocate space for the huffman tree. -** (We presume that the Huffman tree will grow no larger -** than 512 bytes. This is actually a super-conservative -** estimate...but, who cares?) -*/ -plaintext = malloc(lochuffstruct->arraysize); -if (!plaintext) { - fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); - exit(1); -} - -comparray = malloc(lochuffstruct->arraysize); -if (!comparray) { - fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); - free(plaintext); - exit(1); /* FIXME: do I need exits here? */ -} - -decomparray = malloc(lochuffstruct->arraysize); -if (!decomparray) { - fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); - free(plaintext); - free(comparray); - exit(1); -} + const char* context = "CPU:Huffman"; + HuffStruct* lochuffstruct = &global_huffstruct; + clock_t total_time = 0; + int iterations = 0; + char* comparray = NULL; + char* decomparray = NULL; + char* plaintext = NULL; + + + /* + ** Allocate memory for the plaintext and the compressed text. + ** We'll be really pessimistic here, and allocate equal amounts + ** for both (though we know...well, we PRESUME) the compressed + ** stuff will take less than the plain stuff. + ** Also note that we'll build a 3rd buffer to decompress + ** into, and we preallocate space for the huffman tree. + ** (We presume that the Huffman tree will grow no larger + ** than 512 bytes. This is actually a super-conservative + ** estimate...but, who cares?) + */ + plaintext = malloc(lochuffstruct->arraysize); + if (!plaintext) { + fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); + exit(1); + } + + comparray = malloc(lochuffstruct->arraysize); + if (!comparray) { + fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); + free(plaintext); + exit(1); /* FIXME: do I need exits here? */ + } + + decomparray = malloc(lochuffstruct->arraysize); + if (!decomparray) { + fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); + free(plaintext); + free(comparray); + exit(1); + } + + hufftree = malloc(sizeof(huff_node) * 512); + if (!hufftree) { + fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); + free(plaintext); + free(comparray); + free(decomparray); + exit(1); + } + + /* + ** Build the plaintext buffer. Since we want this to + ** actually be able to compress, we'll use the + ** wordcatalog to build the plaintext stuff. + */ + /* + ** Reset random number generator so things repeat. + ** added by Uwe F. Mayer + */ + randnum((int32_t)13); + create_text_block(plaintext,lochuffstruct->arraysize-1,(unsigned short)500); + plaintext[lochuffstruct->arraysize-1L]='\0'; + plaintextlen=lochuffstruct->arraysize; + + /* + ** See if we need to perform self adjustment loop. + */ + if (lochuffstruct->adjust == FALSE) { + lochuffstruct->adjust = TRUE; + /* + ** Do self-adjustment. This involves initializing the + ** # of loops and increasing the loop count until we + ** get a number of loops that we can use. + */ + for (lochuffstruct->loops = 100; lochuffstruct->loops < MAXHUFFLOOPS; lochuffstruct->loops += 10) { + if (DoHuffIteration(plaintext, comparray, decomparray, lochuffstruct->arraysize, lochuffstruct->loops, hufftree) > global_min_ticks) { + break; + } + } + } + + do { + total_time += DoHuffIteration(plaintext, comparray, decomparray, lochuffstruct->arraysize, lochuffstruct->loops, hufftree); + iterations += lochuffstruct->loops; + } while (total_time < lochuffstruct->request_secs * CLOCKS_PER_SEC); -hufftree = malloc(sizeof(huff_node) * 512); -if (!hufftree) { - fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); free(plaintext); free(comparray); free(decomparray); - exit(1); -} - -/* -** Build the plaintext buffer. Since we want this to -** actually be able to compress, we'll use the -** wordcatalog to build the plaintext stuff. -*/ -/* -** Reset random number generator so things repeat. -** added by Uwe F. Mayer -*/ -randnum((int32_t)13); -create_text_block(plaintext,lochuffstruct->arraysize-1,(unsigned short)500); -plaintext[lochuffstruct->arraysize-1L]='\0'; -plaintextlen=lochuffstruct->arraysize; - -/* -** See if we need to perform self adjustment loop. -*/ -if(lochuffstruct->adjust==0) -{ - /* - ** Do self-adjustment. This involves initializing the - ** # of loops and increasing the loop count until we - ** get a number of loops that we can use. - */ - for(lochuffstruct->loops=100L; - lochuffstruct->loops<MAXHUFFLOOPS; - lochuffstruct->loops+=10L) - if(DoHuffIteration(plaintext, - comparray, - decomparray, - lochuffstruct->arraysize, - lochuffstruct->loops, - hufftree)>global_min_ticks) break; -} - -/* -** All's well if we get here. Do the test. -*/ -accumtime=0L; -iterations=(double)0.0; - -do { - accumtime+=DoHuffIteration(plaintext, - comparray, - decomparray, - lochuffstruct->arraysize, - lochuffstruct->loops, - hufftree); - iterations+=(double)lochuffstruct->loops; -} while(TicksToSecs(accumtime)<lochuffstruct->request_secs); - -/* -** Clean up, calculate results, and go home. Be sure to -** show that we don't have to rerun adjustment code. -*/ -free(plaintext); -free(comparray); -free(decomparray); -free(hufftree); -lochuffstruct->iterspersec=iterations / TicksToFracSecs(accumtime); - -if(lochuffstruct->adjust==0) - lochuffstruct->adjust=1; + free(hufftree); + lochuffstruct->iterspersec = (double)(iterations * CLOCKS_PER_SEC) / (double)total_time; } /********************* @@ -250,18 +162,28 @@ if(lochuffstruct->adjust==0) static void create_text_line(char *dt, long nchars) { -long charssofar; /* # of characters so far */ +long charssofar = 0; /* # of characters so far */ long tomove; /* # of characters to move */ char myword[40]; /* Local buffer for words */ char *wordptr; /* Pointer to word from catalog */ -charssofar=0; +/* +** Word catalog +*/ +#define WORDCATSIZE 50 + +const char * wordcatarray[WORDCATSIZE] = { + "Hello", "He", "Him", "the", "this", "that", "though", "rough", "cough", "obviously", "But", + "but", "bye", "begin", "beginning", "beginnings", "of", "our", "ourselves", "yourselves", + "to", "together", "togetherness", "from", "either", "I", "A", "return", "However", "that", + "example", "yet", "quickly", "all", "if", "were", "includes", "always", "never", "not", "small", + "returns", "set", "basic", "Entered", "with", "used", "shown", "you", "know" +}; do { /* ** Grab a random word from the wordcatalog */ -/* wordptr=wordcatarray[abs_randwc((long)WORDCATSIZE)];*/ wordptr=wordcatarray[abs_randwc((int32_t)WORDCATSIZE)]; memmove(myword, wordptr, strlen(wordptr) + 1); @@ -343,13 +265,10 @@ bytessofar+=linelen; ** (b) Compresses the text ** (c) Decompresses the text and verifies correct decompression */ -static unsigned long DoHuffIteration(char *plaintext, - char *comparray, - char *decomparray, - unsigned long arraysize, - unsigned long nloops, - huff_node *hufftree) +static clock_t +DoHuffIteration(char *plaintext, char *comparray, char *decomparray, unsigned long arraysize, unsigned long nloops, huff_node *hufftree) { + clock_t start, stop; int i; /* Index */ long j; /* Bigger index */ int root; /* Pointer to huffman tree root */ @@ -361,19 +280,9 @@ long maxbitoffset; /* Holds limit of bit offset */ long bitstringlen; /* Length of bitstring */ int c; /* Character from plaintext */ char bitstring[30]; /* Holds bitstring */ -unsigned long elapsed; /* For stopwatch */ -#ifdef DEBUG -int status=0; -#endif -/* -** Start the stopwatch -*/ -elapsed=StartStopwatch(); + start = clock(); -/* -** Do everything for nloops -*/ while(nloops--) { @@ -404,7 +313,7 @@ for(i=0;i<256;i++) ** was arbitrarily assigned led to an underflow error at runtime. We ** use that zeroed-out bits are in fact 0 as a float. ** Uwe F. Mayer */ -bzero((char *)&(hufftree[256]),sizeof(huff_node)*256); +bzero((char *)&(hufftree[256]),sizeof(huff_node)*256); /* FIXME: replace bzero with memset? */ /* ** Build the huffman tree. First clear all the parent ** pointers and left/right pointers. Also, discard all @@ -521,26 +430,14 @@ do { } decomparray[textoffset]=hufftree[i].c; -#ifdef DEBUG - if(hufftree[i].c != plaintext[textoffset]) - { - /* Show error */ - printf("Error at textoffset %ld\n",textoffset); - status=1; - } -#endif textoffset++; } while(bitoffset<maxbitoffset); } /* End the big while(nloops--) from above */ -/* -** All done -*/ -#ifdef DEBUG - if (status==0) printf("Huffman: OK\n"); -#endif -return(StopStopwatch(elapsed)); + stop = clock(); + + return stop - start; } /*************** |