From: Alex Riesen Date: Sun, 07 Oct 2007 16:10:12 GMT Subject: Re: [PATCH] Make strbuf_cmp inline, constify its arguments and optimize it a bit Message-ID: <20071007161012.GB3270@steel.home> In-Reply-To: <85fy0nknnq.fsf@lola.goethe.zz> David Kastrup, Sun, Oct 07, 2007 16:24:57 +0200: > Alex Riesen writes: > > > It is definitely less code (also object code). It is not always > > measurably faster (but mostly is). > > > -int strbuf_cmp(struct strbuf *a, struct strbuf *b) > > -{ > > - int cmp; > > - if (a->len < b->len) { > > - cmp = memcmp(a->buf, b->buf, a->len); > > - return cmp ? cmp : -1; > > - } else { > > - cmp = memcmp(a->buf, b->buf, b->len); > > - return cmp ? cmp : a->len != b->len; > > - } > > -} > > - > > > +static inline int strbuf_cmp(const struct strbuf *a, const struct strbuf *b) > > +{ > > + int len = a->len < b->len ? a->len: b->len; > > + int cmp = memcmp(a->buf, b->buf, len); > > + if (cmp) > > + return cmp; > > + return a->len < b->len ? -1: a->len != b->len; > > +} > > My guess is that you are conflating two issues about speed here: the > inlining will like speed the stuff up. But having to evaluate the > (a->len < b->len) comparison twice will likely slow it down. Can't the result of the expression be reused in compiled? Isn't it a common expression? > So if you do any profiling, you should do it on both separate angles > of this patch. > I compared the inlined versions of both.