Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1eq1DV-0005iy-Ou for pgsql-hackers@arkaria.postgresql.org; Sun, 25 Feb 2018 18:40:10 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eq1DT-0002UO-PM for pgsql-hackers@arkaria.postgresql.org; Sun, 25 Feb 2018 18:40:07 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1eq1DT-0002TI-5D for pgsql-hackers@lists.postgresql.org; Sun, 25 Feb 2018 18:40:07 +0000 Received: from mail-lf0-x243.google.com ([2a00:1450:4010:c07::243]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1eq1DP-0008HK-8m for pgsql-hackers@postgresql.org; Sun, 25 Feb 2018 18:40:05 +0000 Received: by mail-lf0-x243.google.com with SMTP id q69so19082944lfi.10 for ; Sun, 25 Feb 2018 10:40:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to; bh=D9/oFL7mkPOlBP7xC4tZN7j4itvw6vydbqjOG+k967o=; b=kLQi/XAGEKlqDxGrzvahx8nQ254S2qccVbe871TL2pISFpjJdjU96qqo74ZBKBWQ7x Cn1RJVa+BqBCHG9iGt70Pxtj6SoUfU9G+FbRTOWZXl3qNkPbSBj4FOUHqB15Yex2cyRX +QyCBzEr2Gh6M8ybSs4Poymrrsvc5Ijtsqtf23PkyiCPAJ2Kq8++Io5ao8P0D4WmrM9U QIVWe/xekkgQxFdhq5i/BngGTBU0+ggInM3jnAunChwh1dedmnYsrMzQ+x5Yt8VuV7/+ thhFTOHH8F2yHjGG97huNOyGEOLpG1FY49FVEI/Zlb839tCudpKwda/LNCBbxlPA6E6y TAKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to; bh=D9/oFL7mkPOlBP7xC4tZN7j4itvw6vydbqjOG+k967o=; b=KZrDcNt2p015dHUsYeShWb1mgit5xf4gQlpEPararXtb2+DFMybvTqz9Sbv569p9Pk pPVPPcUCVHcts2T0Ayo4YDbDEX/uuQFNlIr+XRstjSBPt6zSO6TKWvO+mDKR+bh9T79A uj3SJyXIa2p+IcKATeT3auaGlqRcB27AB7fGN031ZElbQC7XD/rntiEQV2uBrYQmw4AQ JmzSGgIpV/OdB2Onc6u3GAqgqxHs0ZDW8QCe55VdLPAty506+/W1H/yN0Q6L5403OopA vnKRpc2gmJy8Ylkpz0gW/I7USQpP1UJSud1Hue+zkC9Xxxs7TudSpHAjd5lLUDYZ+b3e 4Luw== X-Gm-Message-State: APf1xPB/jedkhi04ry1yOUOPW0on4IsQnM3DTyul7Vu7zElDtegZY/zV etoEd2XnUBjVR0Q3KHQnnzaAn8n96V8= X-Google-Smtp-Source: AG47ELverNNX9gRtQ8hb1eHFaetu/Q+iKvEwTPHyjELucuRxGKyZtAX7u+eYWtf2qeKp7fKCUy8C/w== X-Received: by 10.25.162.72 with SMTP id l69mr6083194lfe.38.1519584000797; Sun, 25 Feb 2018 10:40:00 -0800 (PST) Received: from ?IPv6:2a02:2168:1509:7d00:c531:3545:52aa:bd98? ([2a02:2168:1509:7d00:c531:3545:52aa:bd98]) by smtp.gmail.com with ESMTPSA id l77sm1567720lfl.56.2018.02.25.10.39.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 25 Feb 2018 10:39:59 -0800 (PST) Subject: Re: [HACKERS] Small improvement to compactify_tuples To: Stephen Frost Cc: Michael Paquier , Peter Geoghegan , Andres Freund , Tom Lane , Claudio Freire , Robert Haas , Sokolov Yura , Alvaro Herrera , Heikki Linnakangas , PostgreSQL-Dev References: <22996.1510160560@sss.pgh.pa.us> <20171128224150.syswowiaiojth7ke@alap3.anarazel.de> <20180123033429.GF2416@tamriel.snowman.net> From: Yura Sokolov Message-ID: <9410de56-794b-147f-20f2-d5ef28e98e45@gmail.com> Date: Sun, 25 Feb 2018 21:39:46 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180123033429.GF2416@tamriel.snowman.net> Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="NsOnrRSCQ9ieXfr4Jqa5J3ZPRstSX0zit" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --NsOnrRSCQ9ieXfr4Jqa5J3ZPRstSX0zit Content-Type: multipart/mixed; boundary="g2w1oKGBsplFpNk9rE8XzL6dKVTzkeotx"; protected-headers="v1" From: Yura Sokolov To: Stephen Frost Cc: Michael Paquier , Peter Geoghegan , Andres Freund , Tom Lane , Claudio Freire , Robert Haas , Sokolov Yura , Alvaro Herrera , Heikki Linnakangas , PostgreSQL-Dev Message-ID: <9410de56-794b-147f-20f2-d5ef28e98e45@gmail.com> Subject: Re: [HACKERS] Small improvement to compactify_tuples References: <22996.1510160560@sss.pgh.pa.us> <20171128224150.syswowiaiojth7ke@alap3.anarazel.de> <20180123033429.GF2416@tamriel.snowman.net> In-Reply-To: <20180123033429.GF2416@tamriel.snowman.net> --g2w1oKGBsplFpNk9rE8XzL6dKVTzkeotx Content-Type: multipart/mixed; boundary="------------BBBAFBF9F79BFDD5BD2AE2BD" Content-Language: en-US This is a multi-part message in MIME format. --------------BBBAFBF9F79BFDD5BD2AE2BD Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable 23.01.2018 06:34, Stephen Frost =D0=BF=D0=B8=D1=88=D0=B5=D1=82: > Greetings, >=20 > * =D0=AE=D1=80=D0=B8=D0=B9 =D0=A1=D0=BE=D0=BA=D0=BE=D0=BB=D0=BE=D0=B2 (= funny.falcon@gmail.com) wrote: >> On Wed, Nov 29, 2017 at 8:00 AM, Peter Geoghegan wrote: >>> On Tue, Nov 28, 2017 at 2:41 PM, Andres Freund w= rote: >>>> Maybe it's a stupid question. But would we still want to have this a= fter >>>> the change? These should be just specializations of the template ver= sion >>>> imo. >> >> "generic" version operates on bytes, and it will be a bit hard to comb= ine >> it with >> templated version. Not impossible, but it will look ugly. >=20 > If that's the case then does it really make sense to make this change..= ? I don't think it is really necessary to implement generic version through templated. It is much better to replace generic version with templated in places where it matters for performance. >=20 >> In attach fixed qsort_template version. >> And version for compactify_tuples with bucket_sort and templated qsort= =2E >=20 > While having the patch is handy, I'm not seeing any performance numbers= > on this version, and I imagine others watching this thread are also > wondering about things like a test run that just uses the specialized > qsort_itemIds() without the bucketsort. >=20 > Are you planning to post some updated numbers and/or an updated test > case that hopefully shows best/worst case with this change? Would be > good to get that on a couple of platforms too, if possible, since we've= > seen that the original benchmarks weren't able to be consistently > repeated across different platforms. Without someone doing that > leg-work, this doesn't seem like it'll be moving forward. Updated numbers are (same benchmark on same notebook, but with new master, new ubuntu and later patch version) (average among 6 runs): master - 16135tps with templated qsort - 16199tps with bucket sort - 16956tps Difference is still measurable, but less significant. I don't know why. Rebased version of first patch (qsorted tamplate) is in atttach. With regards, Sokolov Yura. --------------BBBAFBF9F79BFDD5BD2AE2BD Content-Type: application/gzip; name="0001-Header-for-customized-qsort.patch.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Header-for-customized-qsort.patch.gz" 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 --------------BBBAFBF9F79BFDD5BD2AE2BD-- --g2w1oKGBsplFpNk9rE8XzL6dKVTzkeotx-- --NsOnrRSCQ9ieXfr4Jqa5J3ZPRstSX0zit Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQEcBAEBCAAGBQJakwL+AAoJEDiUW3vLdplxqtIH/RzhKkFF1E1OUGI94wsZb1Xg 3e3jxnOGat5saEExVGYtyQ116cQJ/iqPIRr6oj7R3otsmlynUTh6mAip8ws1vWfp SKfqNU1WGZQD32IYehkYqgUZFqWTkGHdhADff132dBnnKshRtjwenaPyOVTEC79T 27tydSiQ+IJ9A4khIoX36a2RuImz9tTkbAO1k106EjDhUv/3kMCcwvS4pJpzlpeB /HRhAvwRnyODuMUIC1st6wnBvMancHr4h2BrfHNAcEpwYRPtE7FsFV2+CHgq1Hp6 3SXZvDoBY/mahvd0mfrpJC5cy931x4LMg4ahHeG+QkqiR3alXIom9R6rnu/3dM4= =pCF3 -----END PGP SIGNATURE----- --NsOnrRSCQ9ieXfr4Jqa5J3ZPRstSX0zit--