Re: Query ResultSet parsing speedup patch (resend) - Mailing list pgsql-jdbc

From Dave Cramer
Subject Re: Query ResultSet parsing speedup patch (resend)
Date
Msg-id A77C6A94-8531-43EC-B32B-1BBE8DC3A9D0@fastcrypt.com
Whole thread Raw
In response to Query ResultSet parsing speedup patch (resend)  (Mikko Tiihonen <mikko.tiihonen@iki.fi>)
List pgsql-jdbc
On 29-Sep-06, at 6:01 PM, Mikko Tiihonen wrote:

> Hi,
>
> This is a resend since I did not get any feedback to this patch when I
> sent it two months ago. Could someone at least have some
> recommendations
> what I should do to get this patch evaluated or even applied to the
> official source.
>
> Also, could someone update the CVS info page
> (http://jdbc.postgresql.org/development/cvs.html) to point to the new
> pgfoundry ?
>
Well, we haven't actually moved it yet, it's there more by accident.
> ---
>
> I tried to optimise the parsing of ResultSets from the network stream,
> especially int and long values, but also a bit for String values.
>
> The attached patch gives upto 40% speedup when parsing larger queries
> containing equal amounts of int4, int8 or varchar(16) columns if the
> system is cpu bound. The speedup comes mainly from avoiding
> creation of
> useless objects and avoiding useless byte[] copies. In more real-life
> scenarios the speedup will be much smaller.
>
> The patch also contains the test code which I used to test the
> performance (BenchTest.java). The benchmark results are:
>
> unpatched 503 jdbc driver: speed: 180.18  memory: 36.8MB
> patched 503 jdbc driver:   speed: 261.44  memory: 19.6MB
>                                   +40%            -40%
> The benchmark was run on Java6rc build 100 with postgresql 8.1.4
> running
> on localhost with Athlon64 2x2GHz, 64bit mode.
>
> If the patch is accepted I can try to do similar optimisations for
> other
> fields.
>
> ---
>
> What the patch does:
> Parsing string:
> old way: read byte[] containing the exact bytes of a string
> new way: create a string directly from network buffer with start
> and end
> index
>
> Parsing numbers:
> old way: create a string that contains the number and use
> Integer.parseInt
> new way: parse the number directly from bytes
>
> Exact changes explained:
>
> new class VisibleBufferedInputStream:
> - replaced java.io.BufferedInputStream with faster implementation
>   * no synchronisation
>   * allows direct access to the buffer byte[] contents which helps
>     to avoiding useless copies when converting to String
>   * has method for scanning the length of next null terminated string
>
> PGStream:
> - uses VisibleBuffereInputStream
>   * faster implementations for for ReceiveIntegerR and ReceiveString
>
> AbstractJdbc2ResultSet
> -  parses int and long values directly from byte[] -> number instead
>    of first creating a throw-away string
> -  if the fast conversion fails or if the current charset is not safe
>    for the optimisation then uses the old way to parse
> -  also very minor optimisation to getFixedString to optimise for
>    non-money string types
>
> Encoding:
> -  uses HashMap instead of synchronised Hashtable
> -  does not do two queries to encodings map when obtaining database
>    encoding
> -  added method to check if the numbers match ASCII charset locations
>    (all currently listed charsets match)
> <postgresql-resultset-parsing-speedup.patch>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 5: don't forget to increase your free space map settings


pgsql-jdbc by date:

Previous
From: Michael Paesold
Date:
Subject: Re: [pgsql-jdbc] dollar-quoted CREATE FUNCTION statement fails
Next
From: Holger Schulz
Date:
Subject: Bug extracting money value