diff options
author | Chen Guo <chenguo4@yahoo.com> | 2010-07-14 07:41:05 +0100 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2010-07-15 01:10:12 +0100 |
commit | b084d6bcb51ddb19c6febe3c3ab343b89efdd2f2 (patch) | |
tree | d2439ab98e731a041ec3c0d32029ebf5aa9ddd0d /src/sort.c | |
parent | c5e350ec5625d7346c2a088fe478060358200c14 (diff) | |
download | coreutils-b084d6bcb51ddb19c6febe3c3ab343b89efdd2f2.tar.xz |
sort: speed up default full line sorting
Don't write NUL after the comparison buffers on each compare,
which increases performance by about 3% for short lines
on a pentium-m with gcc-4.4.1
* src/sort.c: (fillbuf): Delimit input items with NUL.
(write_bytes): Restore the item delimiter char which was
replaced with NUL in fillbuf().
Diffstat (limited to 'src/sort.c')
-rw-r--r-- | src/sort.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/sort.c b/src/sort.c index 5ea1b3476..45cb78f0a 100644 --- a/src/sort.c +++ b/src/sort.c @@ -1743,13 +1743,17 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file) if (buf->buf == ptrlim) return false; if (ptrlim[-1] != eol) - *ptrlim++ = eol; + *ptrlim++ = '\0'; } } /* Find and record each line in the just-read input. */ while ((p = memchr (ptr, eol, ptrlim - ptr))) { + /* Delimit the line with NUL. This eliminates the need to + temporarily replace the last byte with NUL when calling + xmemcoll(), which increases performance. */ + *p = '\0'; ptr = p + 1; line--; line->text = line_start; @@ -2642,7 +2646,13 @@ compare (const struct line *a, const struct line *b, bool show_debug) else if (blen == 0) diff = 1; else if (hard_LC_COLLATE) - diff = xmemcoll (a->text, alen, b->text, blen); + { + /* Note xmemcoll0 is a performance enhancement as + it will not unconditionally write '\0' after the + passed in buffers, which was seen to give around + a 3% increase in performance for short lines. */ + diff = xmemcoll0 (a->text, alen + 1, b->text, blen + 1); + } else if (! (diff = memcmp (a->text, b->text, MIN (alen, blen)))) diff = alen < blen ? -1 : alen != blen; @@ -2652,9 +2662,11 @@ compare (const struct line *a, const struct line *b, bool show_debug) static void write_bytes (struct line const *line, FILE *fp, char const *output_file) { - char const *buf = line->text; + char *buf = line->text; size_t n_bytes = line->length; + *(buf + n_bytes - 1) = eolchar; + /* Convert TABs to '>' and \0 to \n when -z specified. */ if (debug && fp == stdout) { |