diff options
author | dgp <dgp@users.sourceforge.net> | 2011-08-27 02:28:47 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2011-08-27 02:28:47 (GMT) |
commit | fc33b648ae547bf18fde64d811bc884f8c6e7db5 (patch) | |
tree | 5481d19a825ee071bc18410c1021c221bc9e88ce /generic/tclStringObj.c | |
parent | a499c460ec172f0ea32ab6ae236fd5f251cf7abb (diff) | |
download | tcl-fc33b648ae547bf18fde64d811bc884f8c6e7db5.zip tcl-fc33b648ae547bf18fde64d811bc884f8c6e7db5.tar.gz tcl-fc33b648ae547bf18fde64d811bc884f8c6e7db5.tar.bz2 |
Repaired the lost performance in the copy loop hotspots. Now meets or
beats the former trunk (and current trunk by magnitudes) in tclbench.
Diffstat (limited to 'generic/tclStringObj.c')
-rw-r--r-- | generic/tclStringObj.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 27480c5..bccd28a 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -2660,18 +2660,17 @@ ReverseBytes( int count) /* Until this many are copied, */ /* reversing as you go. */ { + unsigned char *src = from + count - 1; if (to == from) { /* Reversing in place */ - from += count - 1; - while (to < from) { - unsigned char c = *from; - *from-- = *to; + while (to < src) { + unsigned char c = *src; + *src-- = *to; *to++ = c; } } else { - from += count - 1; - while (count--) { - *to++ = *from--; + while (src >= from) { + *to++ = *src--; } } } @@ -2683,18 +2682,18 @@ ReverseUniChars( unsigned int count) /* Until this many are copied, */ /* reversing as you go. */ { + Tcl_UniChar *src = from + count - 1; if (to == from) { /* Reversing in place */ from += count - 1; - while (to < from) { - Tcl_UniChar c = *from; - *from-- = *to; + while (to < src) { + Tcl_UniChar c = *src; + *src-- = *to; *to++ = c; } } else { - from += count - 1; - while (count--) { - *to++ = *from--; + while (src >= from) { + *to++ = *src--; } } } |