summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2011-08-27 02:28:47 (GMT)
committerdgp <dgp@users.sourceforge.net>2011-08-27 02:28:47 (GMT)
commit65fc2758670c06dcb89d1bd829f990290c74e8c3 (patch)
tree5481d19a825ee071bc18410c1021c221bc9e88ce
parentf04c7d313f1392d0e474bbb3c40af1d69791f770 (diff)
downloadtcl-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.
-rw-r--r--generic/tclStringObj.c25
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--;
}
}
}