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 | 65fc2758670c06dcb89d1bd829f990290c74e8c3 (patch) | |
tree | 5481d19a825ee071bc18410c1021c221bc9e88ce /generic | |
parent | f04c7d313f1392d0e474bbb3c40af1d69791f770 (diff) | |
download | tcl-65fc2758670c06dcb89d1bd829f990290c74e8c3.zip tcl-65fc2758670c06dcb89d1bd829f990290c74e8c3.tar.gz tcl-65fc2758670c06dcb89d1bd829f990290c74e8c3.tar.bz2 |
Repaired the lost performance in the copy loop hotspots. Now meets or
revert_3396731
beats the former trunk (and current trunk by magnitudes) in tclbench.
Diffstat (limited to 'generic')
-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--; } } } |