Bruno Haible
Mon, 29 Jan 2007 03:58:26 -0800
Jim Meyering wrote: > When sorting records larger than a pointer, reduced data movement is > likely to be the overriding factor: better use of cache. > I.e., setting up the array of pointers costs just O(N) time and memory, > but you save O(N log(N)) time in reduced data copying costs, because > mpsort is swapping only pointers, whereas qsort swaps the entire (larger) > records.
This is undoubtable.
My question is: Once you have switched from an array representation with
sizeof (element) > sizeof (void *) to an array representation with
sizeof (element) == sizeof (void *), you still have 3 ways to sort:
a) with qsort and a comparison function that does
int cmp (void **p, void **q) { return element_cmp (*p, *q); }
b) with a mergesort implementation that looks like mpsort, but calls
cmp (&ba, &bb)
instead of
cmp (ba, bb)
and instead does the indirection in the comparison function:
int cmp (void **p, void **q) { return element_cmp (*p, *q); }
c) with the mpsort function as it is, and element_cmp as the comparison
function.
Does the major speedup come from the transition a) -> b), or from the
transition b) -> c) ?
Bruno