summaryrefslogtreecommitdiffstats
path: root/generic/tclStringObj.c
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)
commitfc33b648ae547bf18fde64d811bc884f8c6e7db5 (patch)
tree5481d19a825ee071bc18410c1021c221bc9e88ce /generic/tclStringObj.c
parenta499c460ec172f0ea32ab6ae236fd5f251cf7abb (diff)
downloadtcl-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.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--;
}
}
}