On Sun, 2015-06-28 at 19:44 +0300, Alexey Dobriyan wrote: > Commit 8da53d4595a53fb9a3380dd4d1c9bc24c7c9aab8 > ("lib/string.c: improve strrchr()") changed strrchr() implementation > from "rewind to the end and search backwards" to "search forward" > optimizing for characher not found case. However, common case is exactly > the opposite: string is absolute pathname, c is '/' always to be found. > > Previous code did 1 branch per character + 1 branch for every character > in the last path component. Current code does 2 branches per characher > regardless.
Are you comparing total cycles of all of the branches in the called functions too? As written the current version removes the strlen call. > --- a/lib/string.c > +++ b/lib/string.c > @@ -313,12 +313,13 @@ EXPORT_SYMBOL(strchrnul); > */ > char *strrchr(const char *s, int c) > { > - const char *last = NULL; > + const char *p = s + strlen(s); > + > do { > - if (*s == (char)c) > - last = s; > - } while (*s++); > - return (char *)last; > + if (*p == (char)c) > + return (char *)p; > + } while (--p >= s); > + return NULL; > } > EXPORT_SYMBOL(strrchr); > #endif -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/