mirror of
https://github.com/postgres/postgres.git
synced 2026-04-14 05:27:20 -04:00
Speedup COPY FROM with additional function inlining.
Following the example set by commit 58a359e585, we can squeeze out
a little more performance from COPY FROM (FORMAT {text,csv}) by
inlining CopyReadLineText() and passing the is_csv parameter as a
constant. This allows the compiler to emit specialized code with
fewer branches.
This is preparatory work for a proposed follow-up commit that would
further optimize this code with SIMD instructions.
Author: Nazir Bilal Yavuz <byavuz81@gmail.com>
Reviewed-by: Ayoub Kazar <ma_kazar@esi.dz>
Tested-by: Manni Wood <manni.wood@enterprisedb.com>
Discussion: https://postgr.es/m/CAOzEurSW8cNr6TPKsjrstnPfhf4QyQqB4tnPXGGe8N4e_v7Jig%40mail.gmail.com
This commit is contained in:
parent
18bcdb75d1
commit
dc592a4155
1 changed files with 14 additions and 4 deletions
|
|
@ -141,7 +141,8 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
|
|||
|
||||
/* non-export function prototypes */
|
||||
static bool CopyReadLine(CopyFromState cstate, bool is_csv);
|
||||
static bool CopyReadLineText(CopyFromState cstate, bool is_csv);
|
||||
static pg_attribute_always_inline bool CopyReadLineText(CopyFromState cstate,
|
||||
bool is_csv);
|
||||
static int CopyReadAttributesText(CopyFromState cstate);
|
||||
static int CopyReadAttributesCSV(CopyFromState cstate);
|
||||
static Datum CopyReadBinaryAttribute(CopyFromState cstate, FmgrInfo *flinfo,
|
||||
|
|
@ -1173,8 +1174,17 @@ CopyReadLine(CopyFromState cstate, bool is_csv)
|
|||
resetStringInfo(&cstate->line_buf);
|
||||
cstate->line_buf_valid = false;
|
||||
|
||||
/* Parse data and transfer into line_buf */
|
||||
result = CopyReadLineText(cstate, is_csv);
|
||||
/*
|
||||
* Parse data and transfer into line_buf.
|
||||
*
|
||||
* Because this is performance critical, we inline CopyReadLineText() and
|
||||
* pass the boolean parameters as constants to allow the compiler to emit
|
||||
* specialized code with fewer branches.
|
||||
*/
|
||||
if (is_csv)
|
||||
result = CopyReadLineText(cstate, true);
|
||||
else
|
||||
result = CopyReadLineText(cstate, false);
|
||||
|
||||
if (result)
|
||||
{
|
||||
|
|
@ -1241,7 +1251,7 @@ CopyReadLine(CopyFromState cstate, bool is_csv)
|
|||
/*
|
||||
* CopyReadLineText - inner loop of CopyReadLine for text mode
|
||||
*/
|
||||
static bool
|
||||
static pg_attribute_always_inline bool
|
||||
CopyReadLineText(CopyFromState cstate, bool is_csv)
|
||||
{
|
||||
char *copy_input_buf;
|
||||
|
|
|
|||
Loading…
Reference in a new issue