From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
Cc: | pginfo <pginfo(at)t1(dot)unisoftbg(dot)com>, "pgsql-performance(at)postgresql(dot)org" <pgsql-performance(at)postgresql(dot)org> |
Subject: | Re: Sort time |
Date: | 2002-11-17 23:05:20 |
Message-ID: | 8037.1037574320@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
I've applied the attached patch to current sources (7.4devel). It
eliminates palloc/pfree overhead in varstr_cmp() for short strings
(up to 1K as committed). I find that this reduces the sort time for
700,000 rows by about 10% on my HPUX box; might be better on machines
with better-optimized strcoll().
regards, tom lane
*** src/backend/utils/adt/varlena.c.orig Wed Sep 4 17:30:48 2002
--- src/backend/utils/adt/varlena.c Sun Nov 17 17:21:43 2002
***************
*** 736,771 ****
varstr_cmp(char *arg1, int len1, char *arg2, int len2)
{
int result;
- char *a1p,
- *a2p;
/*
* Unfortunately, there is no strncoll(), so in the non-C locale case
* we have to do some memory copying. This turns out to be
* significantly slower, so we optimize the case where LC_COLLATE is
! * C.
*/
if (!lc_collate_is_c())
{
! a1p = (char *) palloc(len1 + 1);
! a2p = (char *) palloc(len2 + 1);
memcpy(a1p, arg1, len1);
! *(a1p + len1) = '\0';
memcpy(a2p, arg2, len2);
! *(a2p + len2) = '\0';
result = strcoll(a1p, a2p);
! pfree(a1p);
! pfree(a2p);
}
else
{
! a1p = arg1;
! a2p = arg2;
!
! result = strncmp(a1p, a2p, Min(len1, len2));
if ((result == 0) && (len1 != len2))
result = (len1 < len2) ? -1 : 1;
}
--- 736,782 ----
varstr_cmp(char *arg1, int len1, char *arg2, int len2)
{
int result;
/*
* Unfortunately, there is no strncoll(), so in the non-C locale case
* we have to do some memory copying. This turns out to be
* significantly slower, so we optimize the case where LC_COLLATE is
! * C. We also try to optimize relatively-short strings by avoiding
! * palloc/pfree overhead.
*/
+ #define STACKBUFLEN 1024
+
if (!lc_collate_is_c())
{
! char a1buf[STACKBUFLEN];
! char a2buf[STACKBUFLEN];
! char *a1p,
! *a2p;
!
! if (len1 >= STACKBUFLEN)
! a1p = (char *) palloc(len1 + 1);
! else
! a1p = a1buf;
! if (len2 >= STACKBUFLEN)
! a2p = (char *) palloc(len2 + 1);
! else
! a2p = a2buf;
memcpy(a1p, arg1, len1);
! a1p[len1] = '\0';
memcpy(a2p, arg2, len2);
! a2p[len2] = '\0';
result = strcoll(a1p, a2p);
! if (len1 >= STACKBUFLEN)
! pfree(a1p);
! if (len2 >= STACKBUFLEN)
! pfree(a2p);
}
else
{
! result = strncmp(arg1, arg2, Min(len1, len2));
if ((result == 0) && (len1 != len2))
result = (len1 < len2) ? -1 : 1;
}
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2002-11-17 23:54:42 | Re: Sort time |
Previous Message | Hannu Krosing | 2002-11-17 21:10:12 | Re: Sort time |