On Fri, Jun 16, 2006 at 10:55:05AM -0500, Jacob Yocom-Piatt wrote:
> the current code uses realloc in the manner suggested by the manpage:
> 
>     newsize = size + 1;
>     time(&t1);                  // start timing realloc
>     if ((newap = (int *)realloc(ap, newsize*sizeof(int))) == NULL) {
>         free(ap);
>         ap = NULL;
>         size = 0;
>         return (NULL);
>     }
>     time(&t2);                  // stop timing realloc; start timing fscanf
> 
> as the size of ap grows, so does the time it takes to realloc the space.

Growing your array by only a constant amount each iteration takes 
quadratic time.  By instead doubling the array size each time as 
necessary, you can reduce this to (amortized) linear time.  (I believe 
the man page's intention was to show how to avoid leaking memory, not 
how to write an efficient program.)

Alternatively, just do as others have suggested and mmap() the file and 
make an extra preliminary pass.

Reply via email to