From: | Marc Colosimo <mcolosimo(at)mitre(dot)org> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | tweaking MemSet() performance - 7.4.5 |
Date: | 2004-09-14 13:46:55 |
Message-ID: | 8A6E7DA4-0654-11D9-800C-000A95A5D8B2@mitre.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
HI,
I'm using 7.4.5 on Mac OS X (G5) and was profiling it to see why it is
SO SLOW at committing inserts and deletes into a large database. One
of the many slowdowns was from MemSet. I found an old (2002) thread
about this and retried the tests (see below). The main point is that
the system memset crushes pg's!! Is it possible to add a define to call
the system memset at build time! This probably isn't the case on other
systems.
I wanted to know the size of FunctionCallInfoData (in execQual.c)
because the profiler said that if it was over 128 then use the system
call.
Here are my results:
pgMemSet
* 64
0.410u 0.000s 0:00.42 97.6% 0+0k 0+0io 0pf+0w
* 128
0.600u 0.000s 0:00.61 98.3% 0+0k 0+0io 0pf+0w
* 176 Size of fcinfo is 176, used in execQual.c which was being very
slow here!
0.790u 0.000s 0:00.79 100.0% 0+0k 0+0io 0pf+0w
* 256
1.040u 0.000s 0:01.08 96.2% 0+0k 0+0io 0pf+0w
* 512
2.030u 0.000s 0:02.04 99.5% 0+0k 0+0io 0pf+0w
* 1024
3.950u 0.010s 0:03.94 100.5% 0+0k 0+0io 0pf+0w
* 2048
7.710u 0.000s 0:07.75 99.4% 0+0k 0+0io 0pf+0w
* 4096
15.390u 0.000s 0:15.37 100.1% 0+0k 0+0io 0pf+0w
system memset
* 64
0.260u 0.000s 0:00.25 104.0% 0+0k 0+0io 0pf+0w
* 128
0.310u 0.000s 0:00.31 100.0% 0+0k 0+0io 0pf+0w
* 176 Size of fcinfo is 176
0.300u 0.010s 0:00.30 103.3% 0+0k 0+0io 0pf+0w
* 256
0.310u 0.000s 0:00.30 103.3% 0+0k 0+0io 0pf+0w
* 512
0.350u 0.000s 0:00.33 106.0% 0+0k 0+0io 0pf+0w
* 1024
0.590u 0.010s 0:00.63 95.2% 0+0k 0+0io 0pf+0w
* 2048
0.780u 0.000s 0:00.77 101.2% 0+0k 0+0io 0pf+0w
* 4096
1.320u 0.000s 0:01.33 99.2% 0+0k 0+0io 0pf+0w
#include <string.h>
#include "postgres.h"
#include "fmgr.h"
#undef MEMSET_LOOP_LIMIT
#define MEMSET_LOOP_LIMIT 1000000
int
main(int argc, char **argv)
{
int len = atoi(argv[1]);
char buffer[len];
long long i;
FunctionCallInfoData fcinfo;
printf("Size of fcinfo is %d\n", sizeof(fcinfo));
for (i = 0; i < 9900000; i++)
MemSet(buffer, 0, len);
//memset(buffer, 0, len);
return 0;
}
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2004-09-14 14:08:50 | Re: Why are there client-only encodings? |
Previous Message | Philip Warner | 2004-09-14 13:10:11 | Re: pg_dump as a bunch of PostgreSQL functions |