On 2/9/17 7:15 PM, Jim Nasby wrote: > Can you run a trace to see where all the time is going in the single row > case? I don't see an obvious time-suck with a quick look through the code. > It'd be interesting to see how things change if you eliminate the filler > column from the SELECT.
Traces are attached, these are with callgrind.
profile_nofiller.txt: single row without filler column
profile_filler.txt: single row with filler column
profile_filler_callback.txt: callback with filler column
pqResultAlloc looks to hit malloc pretty hard. The callback reduces all of
that to a single malloc for each row.
Without the filler, here is the average over 11 runs:
Real user sys
Callback .133 .033 .035
Single Row .170 .112 .029
For the callback case, it's slightly higher than the prior results with the
filler column.
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.14930' (creator: callgrind-3.11.0)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 74120972
Trigger: Program termination
Profiled target: ./test -m row (PID 14930, part 1)
Events recorded: Ir
Events shown: Ir
Event sort order: Ir
Thresholds: 99
Include dirs:
User annotated:
Auto-annotation: off
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
313,455,690 PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
61,410,828 ???:_int_malloc [/usr/lib64/libc-2.17.so]
38,321,887 ???:_int_free [/usr/lib64/libc-2.17.so]
25,800,115 ???:pqResultAlloc [/usr/local/pgsql/lib/libpq.so.5.10]
20,611,330 ???:pqParseInput3 [/usr/local/pgsql/lib/libpq.so.5.10]
16,002,817 ???:malloc [/usr/lib64/libc-2.17.so]
14,800,004 ???:pqRowProcessor [/usr/local/pgsql/lib/libpq.so.5.10]
12,604,893 ???:pqGetInt [/usr/local/pgsql/lib/libpq.so.5.10]
10,400,004 ???:PQsetResultAttrs [/usr/local/pgsql/lib/libpq.so.5.10]
10,200,316 main.c:main [/usr/local/src/postgresql-perf/test]
9,600,000 ???:check_tuple_field_number [/usr/local/pgsql/lib/libpq.so.5.10]
8,300,631 ???:__strcpy_sse2_unaligned [/usr/lib64/libc-2.17.so]
7,500,075 ???:pqResultStrdup [/usr/local/pgsql/lib/libpq.so.5.10]
7,500,000 ???:pqSkipnchar [/usr/local/pgsql/lib/libpq.so.5.10]
7,017,368 ???:__memcpy_ssse3_back [/usr/lib64/libc-2.17.so]
6,900,000 ???:PQgetisnull [/usr/local/pgsql/lib/libpq.so.5.10]
6,401,100 ???:free [/usr/lib64/libc-2.17.so]
6,200,004 ???:PQcopyResult [/usr/local/pgsql/lib/libpq.so.5.10]
6,100,959 ???:__strlen_sse2_pminub [/usr/lib64/libc-2.17.so]
5,700,000 ???:PQgetvalue [/usr/local/pgsql/lib/libpq.so.5.10]
4,700,045 ???:PQclear [/usr/local/pgsql/lib/libpq.so.5.10]
4,200,057 ???:PQmakeEmptyPGresult [/usr/local/pgsql/lib/libpq.so.5.10]
4,103,903 ???:PQgetResult [/usr/local/pgsql/lib/libpq.so.5.10]
3,400,000 ???:pqAddTuple [/usr/local/pgsql/lib/libpq.so.5.10]
3,203,437 ???:pqGetc [/usr/local/pgsql/lib/libpq.so.5.10]
2,600,034 ???:pqPrepareAsyncResult [/usr/local/pgsql/lib/libpq.so.5.10]
2,500,679 ???:appendBinaryPQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
2,300,621 ???:enlargePQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
1,600,016 ???:appendPQExpBufferStr [/usr/local/pgsql/lib/libpq.so.5.10]
900,270 ???:resetPQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.15062' (creator: callgrind-3.11.0)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 84068364
Trigger: Program termination
Profiled target: ./test -m row (PID 15062, part 1)
Events recorded: Ir
Events shown: Ir
Event sort order: Ir
Thresholds: 99
Include dirs:
User annotated:
Auto-annotation: off
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
358,525,458 PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
61,410,901 ???:_int_malloc [/usr/lib64/libc-2.17.so]
38,321,887 ???:_int_free [/usr/lib64/libc-2.17.so]
31,400,139 ???:pqResultAlloc [/usr/local/pgsql/lib/libpq.so.5.10]
22,839,505 ???:pqParseInput3 [/usr/local/pgsql/lib/libpq.so.5.10]
17,600,004 ???:pqRowProcessor [/usr/local/pgsql/lib/libpq.so.5.10]
16,002,817 ???:malloc [/usr/lib64/libc-2.17.so]
14,716,359 ???:pqGetInt [/usr/local/pgsql/lib/libpq.so.5.10]
14,400,000 ???:check_tuple_field_number [/usr/local/pgsql/lib/libpq.so.5.10]
13,800,324 main.c:main [/usr/local/src/postgresql-perf/test]
12,300,004 ???:PQsetResultAttrs [/usr/local/pgsql/lib/libpq.so.5.10]
12,289,332 ???:__memcpy_ssse3_back [/usr/lib64/libc-2.17.so]
11,100,653 ???:__strcpy_sse2_unaligned [/usr/lib64/libc-2.17.so]
10,000,100 ???:pqResultStrdup [/usr/local/pgsql/lib/libpq.so.5.10]
10,000,000 ???:pqSkipnchar [/usr/local/pgsql/lib/libpq.so.5.10]
9,200,000 ???:PQgetisnull [/usr/local/pgsql/lib/libpq.so.5.10]
8,500,969 ???:__strlen_sse2_pminub [/usr/lib64/libc-2.17.so]
7,600,000 ???:PQgetvalue [/usr/local/pgsql/lib/libpq.so.5.10]
6,401,100 ???:free [/usr/lib64/libc-2.17.so]
6,200,004 ???:PQcopyResult [/usr/local/pgsql/lib/libpq.so.5.10]
4,700,045 ???:PQclear [/usr/local/pgsql/lib/libpq.so.5.10]
4,200,057 ???:PQmakeEmptyPGresult [/usr/local/pgsql/lib/libpq.so.5.10]
4,114,703 ???:PQgetResult [/usr/local/pgsql/lib/libpq.so.5.10]
3,400,000 ???:pqAddTuple [/usr/local/pgsql/lib/libpq.so.5.10]
3,212,077 ???:pqGetc [/usr/local/pgsql/lib/libpq.so.5.10]
2,600,034 ???:pqPrepareAsyncResult [/usr/local/pgsql/lib/libpq.so.5.10]
2,500,704 ???:appendBinaryPQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
2,300,644 ???:enlargePQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
2,200,000 ???:PQgetlength [/usr/local/pgsql/lib/libpq.so.5.10]
1,600,016 ???:appendPQExpBufferStr [/usr/local/pgsql/lib/libpq.so.5.10]
900,279 ???:resetPQExpBuffer [/usr/local/pgsql/lib/libpq.so.5.10]
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.15112' (creator: callgrind-3.11.0)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 18844066
Trigger: Program termination
Profiled target: ./test -m cb (PID 15112, part 1)
Events recorded: Ir
Events shown: Ir
Event sort order: Ir
Thresholds: 99
Include dirs:
User annotated:
Auto-annotation: off
--------------------------------------------------------------------------------
Ir
--------------------------------------------------------------------------------
84,800,453 PROGRAM TOTALS
--------------------------------------------------------------------------------
Ir file:function
--------------------------------------------------------------------------------
16,842,303 ???:pqParseInput3 [/usr/local/pgsql/lib/libpq.so.5.10]
14,810,783 ???:_int_malloc [/usr/lib64/libc-2.17.so]
12,616,338 ???:pqGetInt [/usr/local/pgsql/lib/libpq.so.5.10]
10,000,000 ???:pqSkipnchar [/usr/local/pgsql/lib/libpq.so.5.10]
9,200,004 main.c:process_callback [/usr/local/src/postgresql-perf/test]
7,305,178 ???:_int_free [/usr/lib64/libc-2.17.so]
4,002,817 ???:malloc [/usr/lib64/libc-2.17.so]
2,600,000 ???:pqRowProcessor [/usr/local/pgsql/lib/libpq.so.5.10]
2,296,178 ???:__memcpy_ssse3_back [/usr/lib64/libc-2.17.so]
1,612,027 ???:pqGetc [/usr/local/pgsql/lib/libpq.so.5.10]
1,601,100 ???:free [/usr/lib64/libc-2.17.so]
800,284 main.c:main [/usr/local/src/postgresql-perf/test]
600,000 /usr/include/bits/byteswap.h:process_callback
Performance Results.xlsx
Description: Performance Results.xlsx
-- Sent via pgsql-hackers mailing list ([email protected]) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers
