At the head of wchareq, length of (multibyte) character is compared by
authorBruce Momjian <bruce@momjian.us>
Wed, 25 May 2005 22:59:33 +0000 (22:59 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 25 May 2005 22:59:33 +0000 (22:59 +0000)
using pg_mblen. Therefore, pg_mblen is executed many times, and it
becomes a bottleneck.

This patch makes a short cut, and reduces execution frequency of
pg_mblen by comparing the first byte first.

a_ogawa

src/backend/utils/adt/like.c

index 541bd0e629f227ed93277657d77ff512d41c870f..9289416ca46dfe4ddba1df4505e5602acb1addcd 100644 (file)
@@ -11,7 +11,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/like.c,v 1.59 2004/12/31 22:01:22 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/like.c,v 1.60 2005/05/25 22:59:33 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,12 +50,18 @@ static text *MB_do_like_escape(text *, text *);
 static int
 wchareq(unsigned char *p1, unsigned char *p2)
 {
-   int         l;
+   int         p1_len;
 
-   l = pg_mblen(p1);
-   if (pg_mblen(p2) != l)
+   /* Optimization:  quickly compare the first byte. */
+   if(*p1 != *p2)
        return (0);
-   while (l--)
+
+   p1_len = pg_mblen(p1);
+   if (pg_mblen(p2) != p1_len)
+       return (0);
+
+   /* They are the same length */
+   while (p1_len--)
    {
        if (*p1++ != *p2++)
            return (0);