Date: Sun, 29 Dec 2002 00:25:49 +0100 (MET) From: Anders Gavare <g@dd.chalmers.se> To: freebsd-alpha@freebsd.org Subject: faster strlen() using longs (?) Message-ID: <Pine.GSO.4.44.0212290009180.18017-100000@elros.dd.chalmers.se>
next in thread | raw e-mail | index | archive | help
Hi. I'm using FreeBSD 4.5 on an Alpha, and I noticed that strlen() isn't implemented using words, but using chars. I've experimented with several different variations of using longs, and this is the fastest one I've come up with. It's a quick hack, I know, and it's a bit hard coded, so it would have to be placed in the alpha-specific part of libc. It is 2.8 times faster than the default strlen() in libc. size_t my_strlen3(char *databuf) { long data; long *lp; size_t len = 0; /* Count non-aligned chars: */ while (((size_t) databuf) & (sizeof(long)-1)) { if (!*databuf++) return len; len++; } lp = (long *) databuf; /* Loop through full 'long' words: */ for (;;) { /* See comment (START) */ data = *lp++; if ( ((data & 0xff) == 0) || ((data & 0xff00) == 0) || ((data & 0xff0000) == 0) || ((data & 0xff000000) == 0) || ((data & 0xff00000000) == 0) || ((data & 0xff0000000000) == 0) || ((data & 0xff000000000000) == 0) || ((data & 0xff00000000000000) == 0) ) break; len += sizeof(long); /* See comment (END) */ } /* Return the actual length: */ if (!(data & 0xff)) return len; if (!(data & 0xff00)) return len + 1; if (!(data & 0xff0000)) return len + 2; if (!(data & 0xff000000)) return len + 3; data >>= 32; len += 4; if (!(data & 0xff)) return len; if (!(data & 0xff00)) return len + 1; if (!(data & 0xff0000)) return len + 2; return len + 3; } It is sometimes faster when compiled with -O than with -O3 (!), but this depends on which compiler is used. The stuff between (START) and (END) can be #defined and then included multiple times. That way, there will be multiple word tests before the jump back to the start of the for loop. This give a small performance gain using some compilers / compiler options. If this is not an issue anymore with newer releases of FreeBSD on Alpha, then just ignore this mail :-) Anders PS. I'm not on the list, so please CC me if you feel like replying. DS. To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.GSO.4.44.0212290009180.18017-100000>