Thread: Optimize mul_var() for var1ndigits >= 8
Hello hackers, This patch adds a mul_var_large() that is dispatched to from mul_var() for var1ndigits >= 8, regardless of rscale. The main idea with mul_var_large() is to reduce the "n" in O(n^2) by a factor of two. This is achieved by first converting the (ndigits) number of int16 NBASE digits, to (ndigits/2) number of int32 NBASE^2 digits, as well as upgrading the int32 variables to int64-variables so that the products and carry values fit. The existing mul_var() algorithm is then executed without structural change. Finally, the int32 NBASE^2 result digits are converted back to twice the number of int16 NBASE digits. This adds overhead of approximately 4 * O(n), due to the conversion. Benchmarks indicates mul_var_large() starts to be beneficial when var1 is at least 8 ndigits, or perhaps a little more. Definitively an interesting speed-up for 100 ndigits and above. Benchmarked on Apple M3 Max so far: -- var1ndigits == var2ndigits == 10 SELECT COUNT(*) FROM n_10 WHERE product = var1 * var2; Time: 3957.740 ms (00:03.958) -- HEAD Time: 3943.795 ms (00:03.944) -- mul_var_large -- var1ndigits == var2ndigits == 100 SELECT COUNT(*) FROM n_100 WHERE product = var1 * var2; Time: 1532.594 ms (00:01.533) -- HEAD Time: 1065.974 ms (00:01.066) -- mul_var_large -- var1ndigits == var2ndigits == 1000 SELECT COUNT(*) FROM n_1000 WHERE product = var1 * var2; Time: 3055.372 ms (00:03.055) -- HEAD Time: 2295.888 ms (00:02.296) -- mul_var_large -- var1ndigits and var2ndigits completely random, -- with random number of decimal digits SELECT COUNT(*) FROM n_mixed WHERE product = var1 * var2; Time: 46796.240 ms (00:46.796) -- HEAD Time: 27970.006 ms (00:27.970) -- mul_var_large -- var1ndigits == var2ndigits == 16384 SELECT COUNT(*) FROM n_max WHERE product = var1 * var2; Time: 3191.145 ms (00:03.191) -- HEAD Time: 1836.404 ms (00:01.836) -- mul_var_large Regards, Joel
Attachment
On Sun, 7 Jul 2024 at 20:46, Joel Jacobson <joel@compiler.org> wrote: > > This patch adds a mul_var_large() that is dispatched to from mul_var() > for var1ndigits >= 8, regardless of rscale. > > -- var1ndigits == var2ndigits == 16384 > SELECT COUNT(*) FROM n_max WHERE product = var1 * var2; > Time: 3191.145 ms (00:03.191) -- HEAD > Time: 1836.404 ms (00:01.836) -- mul_var_large > That's pretty nice. For some reason though, this patch seems to consistently make the numeric_big regression test a bit slower: ok 224 - numeric_big 280 ms [HEAD] ok 224 - numeric_big 311 ms [patch] though I do get a lot of variability when I run that test. I think this is related to this code: + res_ndigits = var1ndigits + var2ndigits + 1; + res_weight = var1->weight + var2->weight + 2 + + ((res_ndigits * 2) - (var1->ndigits + var2->ndigits + 1)); + maxdigits = res_weight + 1 + (rscale + DEC_DIGITS - 1) / DEC_DIGITS + + MUL_GUARD_DIGITS; + res_ndigits = Min(res_ndigits, maxdigits); In mul_var_large(), var1ndigits, var2ndigits, and res_ndigits are counts of NBASE^2 digits, whereas maxdigits is a count of NBASE digits, so it's not legit to compare them like that. I think it's pretty confusing to use the same variable names as are used elsewhere for different things. I also don't like basically duplicating the whole of mul_var() in a second function. The fact that this is close to the current speed for numbers with around 8 digits is encouraging though. My first thought was that if it could be made just a little faster, maybe it could replace mul_var() rather than duplicating it. I had a go at that in the attached v2 patch, which now gives a very nice speedup when running numeric_big: ok 224 - numeric_big 159 ms [v2 patch] The v2 patch includes the following additional optimisations: 1). Use unsigned integers, rather than signed integers, as discussed over in [1]. 2). Attempt to fix the formulae incorporating maxdigits mentioned above. This part really made my brain hurt, and I'm still not quite sure that I've got it right. In particular, it needs double-checking to ensure that it's not losing accuracy in the reduced-rscale case. 3). Instead of converting var1 to base NBASE^2 and storing it, just compute each base-NBASE^2 digit at the point where it's needed, at the start of the outer loop. 4). Instead of converting all of var2 to base NBASE^2, just convert the part that actually contributes to the final result. That can make a big difference when asked for a reduced-rscale result. 5). Use 32-bit integers instead of 64-bit integers to hold the converted digits of var2. 6). Merge the final carry-propagation pass with the code to convert the result back to base NBASE. 7). Mark mul_var_short() as pg_noinline. That seemed to make a difference in some tests, where this patch seemed to cause the compiler to generate slightly less efficient code for mul_var_short() when it was inlined. In any case, it seems preferable to separate the two, especially if mul_var_short() grows in the future. Overall, those optimisations made quite a big difference for large inputs: -- var1ndigits1=16383, var2ndigits2=16383 call rate=23.991785 -- HEAD call rate=35.19989 -- v1 patch call rate=75.50344 -- v2 patch which is now a 3.1x speedup relative to HEAD. For small inputs (above mul_var_short()'s 4-digit threshold), it's pretty-much performance-neutral: -- var1ndigits1=5, var2ndigits2=5 call rate=6.045675e+06 -- HEAD call rate=6.1231815e+06 -- v2 patch which is pretty-much in the region of random noise. It starts to become a more definite win for anything larger (in either input): -- var1ndigits1=5, var2ndigits2=10 call rate=5.437945e+06 -- HEAD call rate=5.6906255e+06 -- v2 patch -- var1ndigits1=6, var2ndigits2=6 call rate=5.748427e+06 -- HEAD call rate=5.953112e+06 -- v2 patch -- var1ndigits1=7, var2ndigits2=7 call rate=5.3638645e+06 -- HEAD call rate=5.700681e+06 -- v2 patch What's less clear is whether there are any platforms for which this makes it significantly slower. I tried testing with SIMD disabled, which ought to not affect the small-input cases, but actually seemed to favour the patch slightly: -- var1ndigits1=5, var2ndigits2=5 [SIMD disabled] call rate=6.0269715e+06 -- HEAD call rate=6.2982245e+06 -- v2 patch For large inputs, disabling SIMD makes everything much slower, but it made the relative difference larger: -- var1ndigits1=16383, var2ndigits2=16383 [SIMD disabled] call rate=8.24175 -- HEAD call rate=36.3987 -- v2 patch which is now 4.3x faster with the patch. Then I tried compiling with -m32, and unfortunately this made the patch slower than HEAD for small inputs: -- var1ndigits1=5, var2ndigits2=5 [-m32, SIMD disabled] call rate=5.052332e+06 -- HEAD call rate=3.883459e+06 -- v2 patch -- var1ndigits1=6, var2ndigits2=6 [-m32, SIMD disabled] call rate=4.7221405e+06 -- HEAD call rate=3.7965685e+06 -- v2 patch -- var1ndigits1=7, var2ndigits2=7 [-m32, SIMD disabled] call rate=4.4638375e+06 -- HEAD call rate=3.39948e+06 -- v2 patch and it doesn't reach parity until around ndigits=26, which is disappointing. It does still get much faster for large inputs: -- var1ndigits1=16383, var2ndigits2=16383 [-m32, SIMD disabled] call rate=5.6747904 call rate=20.104694 and it still makes numeric_big much faster: [-m32, SIMD disabled] ok 224 - numeric_big 596 ms [HEAD] ok 224 - numeric_big 294 ms [v2 patch] I'm not sure whether compiling with -m32 is a realistic simulation of systems people are really using. It's tempting to just regard such systems as legacy, and ignore them, given the other large gains, but maybe this is not the only case that gets slower. Another option would be to only use this optimisation on 64-bit machines, though I think that would make the code pretty messy, and it would be throwing away the gains for large inputs, which might well outweigh the losses. Thoughts anyone? Regards, Dean [1] https://www.postgresql.org/message-id/19834f2c-4bf1-4e27-85ed-ca5df0f28e03@app.fastmail.com
Attachment
On Fri, 12 Jul 2024 at 13:34, Dean Rasheed <dean.a.rasheed@gmail.com> wrote: > > Then I tried compiling with -m32, and unfortunately this made the > patch slower than HEAD for small inputs: > > -- var1ndigits1=5, var2ndigits2=5 [-m32, SIMD disabled] > call rate=5.052332e+06 -- HEAD > call rate=3.883459e+06 -- v2 patch > > -- var1ndigits1=6, var2ndigits2=6 [-m32, SIMD disabled] > call rate=4.7221405e+06 -- HEAD > call rate=3.7965685e+06 -- v2 patch > > -- var1ndigits1=7, var2ndigits2=7 [-m32, SIMD disabled] > call rate=4.4638375e+06 -- HEAD > call rate=3.39948e+06 -- v2 patch > > and it doesn't reach parity until around ndigits=26, which is > disappointing. It does still get much faster for large inputs > I spent some more time hacking on this, to try to improve the situation for 32-bit builds. One of the biggest factors was the 64-bit division that is necessary during carry propagation, which is very slow -- every compiler/platform I looked at on godbolt.org turns this into a call to a slow function like __udivdi3(). However, since we are dividing by a constant (NBASE^2), it can be done using the same multiply-and-shift trick that compilers use in 64-bit builds, and that significantly improves performance. Unfortunately, in 32-bit builds, using 64-bit integers is still slower for small inputs (below 20-30 NBASE digits), so in the end I figured that it's best to retain the old 32-bit base-NBASE multiplication code for small inputs, and only use 64-bit base-NBASE^2 multiplication when the inputs are above a certain size threshold. Furthermore, since this threshold is quite low, it's possible to make an additional simplification: as long as the threshold is less than or equal to 42, it can be shown that there is no chance of 32-bit integer overflow, and so the "maxdig" tracking and renormalisation code is not needed. Getting rid of that makes the outer multiplication loop very simple, and makes quite a noticeable difference to the performance for inputs below the threshold. In 64-bit builds, doing 64-bit base-NBASE^2 multiplication is faster for all inputs over 4 or 5 NBASE digits, so the threshold can be much lower. However, for numbers near that threshold, it's a close thing, so it makes sense to also extend mul_var_small() to cover 1-6 digit inputs, since that gives a much larger gain for numbers of that size. That's quite nice because it equates to inputs with up to 21-24 decimal digits, which I suspect are quite commonly used in practice. One risk in having different thresholds in 32-bit and 64-bit builds is that it opens up the possibility that the results from the reduced-rscale computations used by inexact functions like ln() and exp() might be be different (actually, this may already be a possibility, due to div_var_fast()'s use of floating point arithmetic, but that seems considerably less likely). In practice though, this should be extremely unlikely, due to the fact that any difference would have to propagate through MUL_GUARD_DIGITS NBASE digits (8 decimal digits), and it doesn't show up in any of the existing tests. IMO a very small chance of different results on different platforms is probably acceptable, but it wouldn't be acceptable to make the threshold a runtime configurable parameter that could lead to different results on the same platform. Overall, this has turned out to be more code than I would have liked, but I think it's worth it, because the performance gains are pretty substantial across the board. (Here, I'm comparing with REL_17_STABLE, so that the effect of mul_var_short() for ndigits <= 6 can be seen.) 32-bit build ============ Balanced inputs: ndigits1 | ndigits2 | PG17 rate | patch rate | % change ----------+----------+---------------+---------------+---------- 1 | 1 | 5.973068e+06 | 6.873059e+06 | +15.07% 2 | 2 | 5.646598e+06 | 6.6456665e+06 | +17.69% 3 | 3 | 5.8176995e+06 | 7.0903175e+06 | +21.87% 4 | 4 | 5.545298e+06 | 6.9701605e+06 | +25.69% 5 | 5 | 5.2109155e+06 | 6.6406185e+06 | +27.44% 6 | 6 | 4.9276335e+06 | 6.478698e+06 | +31.48% 7 | 7 | 4.6595095e+06 | 4.8514485e+06 | +4.12% 8 | 8 | 4.898536e+06 | 5.1599975e+06 | +5.34% 9 | 9 | 4.537171e+06 | 4.830987e+06 | +6.48% 10 | 10 | 4.308139e+06 | 4.6029265e+06 | +6.84% 11 | 11 | 4.092612e+06 | 4.37966e+06 | +7.01% 12 | 12 | 3.9345035e+06 | 4.213998e+06 | +7.10% 13 | 13 | 3.7600162e+06 | 4.0115955e+06 | +6.69% 14 | 14 | 3.5959855e+06 | 3.8216508e+06 | +6.28% 15 | 15 | 3.3576732e+06 | 3.6070588e+06 | +7.43% 16 | 16 | 3.657139e+06 | 3.9067975e+06 | +6.83% 17 | 17 | 3.3601955e+06 | 3.5651722e+06 | +6.10% 18 | 18 | 3.1844472e+06 | 3.4542238e+06 | +8.47% 19 | 19 | 3.0286392e+06 | 3.2380662e+06 | +6.91% 20 | 20 | 2.9012185e+06 | 3.0496352e+06 | +5.12% 21 | 21 | 2.755444e+06 | 2.9508798e+06 | +7.09% 22 | 22 | 2.6263908e+06 | 2.8168945e+06 | +7.25% 23 | 23 | 2.5470438e+06 | 2.7056318e+06 | +6.23% 24 | 24 | 2.764418e+06 | 2.9597732e+06 | +7.07% 25 | 25 | 2.509954e+06 | 2.7368215e+06 | +9.04% 26 | 26 | 2.3699395e+06 | 2.565404e+06 | +8.25% 27 | 27 | 2.286344e+06 | 2.4400948e+06 | +6.72% 28 | 28 | 2.199087e+06 | 2.361374e+06 | +7.38% 29 | 29 | 2.1208148e+06 | 2.26925e+06 | +7.00% 30 | 30 | 2.0469475e+06 | 2.2127455e+06 | +8.10% 31 | 31 | 1.9973804e+06 | 2.3771615e+06 | +19.01% 32 | 32 | 2.1288205e+06 | 2.3166555e+06 | +8.82% 33 | 33 | 1.9876898e+06 | 2.1759028e+06 | +9.47% 34 | 34 | 1.8906434e+06 | 2.169534e+06 | +14.75% 35 | 35 | 1.8069352e+06 | 1.990085e+06 | +10.14% 36 | 36 | 1.7412926e+06 | 1.9940908e+06 | +14.52% 37 | 37 | 1.6956435e+06 | 1.8492525e+06 | +9.06% 38 | 38 | 1.6253338e+06 | 1.8493976e+06 | +13.79% 39 | 39 | 1.5734566e+06 | 1.9296996e+06 | +22.64% 40 | 40 | 1.6692021e+06 | 1.902438e+06 | +13.97% 50 | 50 | 1.1116885e+06 | 1.5319529e+06 | +37.80% 100 | 100 | 399552.38 | 722142.44 | +80.74% 250 | 250 | 81092.02 | 195967.67 | +141.66% 500 | 500 | 21654.633 | 58329.473 | +169.36% 1000 | 1000 | 5525.9775 | 16420.611 | +197.15% 2500 | 2500 | 907.98206 | 2825.7324 | +211.21% 5000 | 5000 | 230.26935 | 731.26105 | +217.57% 10000 | 10000 | 57.793922 | 179.12334 | +209.93% 16383 | 16383 | 21.446728 | 64.39028 | +200.23% Unbalanced inputs: ndigits1 | ndigits2 | PG17 rate | patch rate | % change ----------+----------+-----------+------------+---------- 1 | 10000 | 42816.89 | 52843.01 | +23.42% 2 | 10000 | 41032.25 | 52111.957 | +27.00% 3 | 10000 | 39550.176 | 52262.477 | +32.14% 4 | 10000 | 38015.59 | 43962.535 | +15.64% 5 | 10000 | 36560.22 | 43736.305 | +19.63% 6 | 10000 | 35305.77 | 38204.2 | +8.21% 7 | 10000 | 33833.086 | 36533.387 | +7.98% 8 | 10000 | 32847.996 | 35774.715 | +8.91% 9 | 10000 | 31345.736 | 33831.926 | +7.93% 10 | 10000 | 30351.6 | 32715.969 | +7.79% 11 | 10000 | 29321.592 | 31478.398 | +7.36% 12 | 10000 | 28616.018 | 30861.885 | +7.85% 13 | 10000 | 28216.12 | 29510.95 | +4.59% 14 | 10000 | 27396.408 | 29077.73 | +6.14% 15 | 10000 | 26519.08 | 28235.08 | +6.47% 16 | 10000 | 25778.102 | 27538.908 | +6.83% 17 | 10000 | 26024.918 | 26677.498 | +2.51% 18 | 10000 | 25316.346 | 26729.395 | +5.58% 19 | 10000 | 24626.07 | 26076.979 | +5.89% 20 | 10000 | 23912.383 | 25709.967 | +7.52% 21 | 10000 | 23238.488 | 24761.57 | +6.55% 22 | 10000 | 22746.25 | 23925.934 | +5.19% 23 | 10000 | 22120.777 | 23442.34 | +5.97% 24 | 10000 | 21645.215 | 22771.193 | +5.20% 25 | 10000 | 21135.049 | 22185.893 | +4.97% 26 | 10000 | 20685.025 | 21831.74 | +5.54% 27 | 10000 | 20039.559 | 20854.793 | +4.07% 28 | 10000 | 19846.092 | 21072.758 | +6.18% 29 | 10000 | 19414.059 | 20289.414 | +4.51% 30 | 10000 | 18968.617 | 19774.797 | +4.25% 31 | 10000 | 18394.988 | 21307.074 | +15.83% 32 | 10000 | 18291.504 | 21349.691 | +16.72% 33 | 10000 | 17899.676 | 20885.299 | +16.68% 34 | 10000 | 17505.402 | 20620.105 | +17.79% 35 | 10000 | 17174.918 | 20383.594 | +18.68% 36 | 10000 | 16609.867 | 20342.18 | +22.47% 37 | 10000 | 16457.889 | 19953.91 | +21.24% 38 | 10000 | 15926.13 | 19783.203 | +24.22% 39 | 10000 | 15441.283 | 19288.654 | +24.92% 40 | 10000 | 15038.773 | 19415.52 | +29.10% 50 | 10000 | 11264.285 | 17608.648 | +56.32% 100 | 10000 | 6253.7637 | 11620.726 | +85.82% 250 | 10000 | 2696.207 | 5939.3857 | +120.29% 500 | 10000 | 1338.4141 | 3268.2004 | +144.18% 1000 | 10000 | 672.6717 | 1691.9614 | +151.53% 2500 | 10000 | 267.5996 | 708.20386 | +164.65% 5000 | 10000 | 131.50755 | 353.92822 | +169.13% numeric_big regression test: ok 224 - numeric_big 279 ms [PG17] ok 224 - numeric_big 182 ms [v3 patch] 64-bit build ============ Balanced inputs: ndigits1 | ndigits2 | PG17 rate | patch rate | % change ----------+----------+---------------+---------------+---------- 1 | 1 | 8.507485e+06 | 9.53221e+06 | +12.04% 2 | 2 | 8.0975715e+06 | 9.431853e+06 | +16.48% 3 | 3 | 6.461359e+06 | 7.3669945e+06 | +14.02% 4 | 4 | 6.1728355e+06 | 7.152418e+06 | +15.87% 5 | 5 | 6.500831e+06 | 7.6977115e+06 | +18.41% 6 | 6 | 6.1784075e+06 | 7.3765005e+06 | +19.39% 7 | 7 | 5.90117e+06 | 6.2799965e+06 | +6.42% 8 | 8 | 5.9217105e+06 | 6.147141e+06 | +3.81% 9 | 9 | 5.477262e+06 | 5.9889475e+06 | +9.34% 10 | 10 | 5.2147235e+06 | 5.858963e+06 | +12.35% 11 | 11 | 4.882895e+06 | 5.6766675e+06 | +16.26% 12 | 12 | 4.61105e+06 | 5.559544e+06 | +20.57% 13 | 13 | 4.382494e+06 | 5.3770165e+06 | +22.69% 14 | 14 | 4.134509e+06 | 5.256462e+06 | +27.14% 15 | 15 | 3.7595882e+06 | 5.0751355e+06 | +34.99% 16 | 16 | 4.3353435e+06 | 4.970363e+06 | +14.65% 17 | 17 | 3.9258755e+06 | 4.935394e+06 | +25.71% 18 | 18 | 3.7562495e+06 | 4.8723875e+06 | +29.71% 19 | 19 | 3.4890312e+06 | 4.723648e+06 | +35.39% 20 | 20 | 3.289758e+06 | 4.6569305e+06 | +41.56% 21 | 21 | 3.103908e+06 | 4.4747755e+06 | +44.17% 22 | 22 | 2.9545148e+06 | 4.4227305e+06 | +49.69% 23 | 23 | 2.7975982e+06 | 4.5065035e+06 | +61.08% 24 | 24 | 3.2456168e+06 | 4.4578115e+06 | +37.35% 25 | 25 | 2.9515055e+06 | 4.0208335e+06 | +36.23% 26 | 26 | 2.8158568e+06 | 4.0437498e+06 | +43.61% 27 | 27 | 2.6376518e+06 | 3.8959785e+06 | +47.71% 28 | 28 | 2.5094318e+06 | 3.8648428e+06 | +54.01% 29 | 29 | 2.3714905e+06 | 3.67182e+06 | +54.83% 30 | 30 | 2.2456015e+06 | 3.6337285e+06 | +61.82% 31 | 31 | 2.169437e+06 | 3.7209152e+06 | +71.52% 32 | 32 | 2.5022498e+06 | 3.6609378e+06 | +46.31% 33 | 33 | 2.27133e+06 | 3.435459e+06 | +51.25% 34 | 34 | 2.1836462e+06 | 3.4042262e+06 | +55.90% 35 | 35 | 2.0753196e+06 | 3.2125422e+06 | +54.80% 36 | 36 | 1.9650498e+06 | 3.185525e+06 | +62.11% 37 | 37 | 1.8668318e+06 | 3.0366508e+06 | +62.66% 38 | 38 | 1.7678832e+06 | 3.014941e+06 | +70.54% 39 | 39 | 1.6764314e+06 | 3.1080448e+06 | +85.40% 40 | 40 | 1.9170026e+06 | 3.0942025e+06 | +61.41% 50 | 50 | 1.2242934e+06 | 2.3769868e+06 | +94.15% 100 | 100 | 401733.62 | 1.0854601e+06 | +170.19% 250 | 250 | 81861.45 | 249837.78 | +205.20% 500 | 500 | 21613.402 | 71239.04 | +229.61% 1000 | 1000 | 5551.617 | 18349.414 | +230.52% 2500 | 2500 | 906.501 | 3107.6462 | +242.82% 5000 | 5000 | 231.65045 | 794.86444 | +243.13% 10000 | 10000 | 58.372395 | 188.37387 | +222.71% 16383 | 16383 | 21.629467 | 73.58552 | +240.21% Unbalanced inputs: ndigits1 | ndigits2 | PG17 rate | patch rate | % change ----------+----------+-----------+------------+---------- 1 | 10000 | 44137.258 | 62292.844 | +41.13% 2 | 10000 | 42009.895 | 62705.445 | +49.26% 3 | 10000 | 40569.617 | 58555.727 | +44.33% 4 | 10000 | 38914.03 | 49439.008 | +27.05% 5 | 10000 | 37361.39 | 47173.445 | +26.26% 6 | 10000 | 35807.61 | 42609.203 | +18.99% 7 | 10000 | 34386.684 | 49325.582 | +43.44% 8 | 10000 | 33380.312 | 49298.59 | +47.69% 9 | 10000 | 32228.17 | 46869.844 | +45.43% 10 | 10000 | 31022.46 | 47015.98 | +51.55% 11 | 10000 | 29782.623 | 45074 | +51.34% 12 | 10000 | 29540.896 | 44712.23 | +51.36% 13 | 10000 | 28521.643 | 42589.98 | +49.33% 14 | 10000 | 27772.59 | 43325.863 | +56.00% 15 | 10000 | 26871.25 | 41443 | +54.23% 16 | 10000 | 26179.322 | 41245.508 | +57.55% 17 | 10000 | 26367.402 | 39348.543 | +49.23% 18 | 10000 | 25769.176 | 40105.402 | +55.63% 19 | 10000 | 24869.504 | 38316.44 | +54.07% 20 | 10000 | 24395.436 | 37647.33 | +54.32% 21 | 10000 | 23532.748 | 36552.914 | +55.33% 22 | 10000 | 23151.842 | 36824.04 | +59.05% 23 | 10000 | 22661.33 | 35556.918 | +56.91% 24 | 10000 | 22113.502 | 34923.83 | +57.93% 25 | 10000 | 21481.773 | 33601.785 | +56.42% 26 | 10000 | 20943.576 | 34277.58 | +63.67% 27 | 10000 | 20437.605 | 32957.406 | +61.26% 28 | 10000 | 20049.12 | 32413.64 | +61.67% 29 | 10000 | 19674.787 | 31537.846 | +60.30% 30 | 10000 | 19092.572 | 32252.404 | +68.93% 31 | 10000 | 18761.932 | 30825.836 | +64.30% 32 | 10000 | 18480.184 | 30616.389 | +65.67% 33 | 10000 | 18130.89 | 29493.594 | +62.67% 34 | 10000 | 17750.996 | 30054.01 | +69.31% 35 | 10000 | 17406.83 | 29090.297 | +67.12% 36 | 10000 | 17138.23 | 29117.42 | +69.90% 37 | 10000 | 16666.799 | 28429.32 | +70.57% 38 | 10000 | 16144.025 | 29082.398 | +80.14% 39 | 10000 | 15548.838 | 28195.258 | +81.33% 40 | 10000 | 15305.571 | 27273.215 | +78.19% 50 | 10000 | 11099.766 | 25494.129 | +129.68% 100 | 10000 | 6310.7827 | 14895.447 | +136.03% 250 | 10000 | 2687.7397 | 7149.1016 | +165.99% 500 | 10000 | 1354.7455 | 3608.8845 | +166.39% 1000 | 10000 | 677.3838 | 1852.1256 | +173.42% 2500 | 10000 | 269.74582 | 748.5785 | +177.51% 5000 | 10000 | 132.6432 | 377.23288 | +184.40% numeric_big regression test: ok 224 - numeric_big 256 ms [PG17] ok 224 - numeric_big 161 ms [v3 patch] Regards, Dean
Attachment
On Sun, Jul 28, 2024, at 21:18, Dean Rasheed wrote: > Attachments: > * v3-0002-Optimise-numeric-multiplication-using-base-NBASE-.patch > * v3-0001-Extend-mul_var_short-to-5-and-6-digit-inputs.patch Very nice. I've done some initial benchmarks on my Intel Core i9-14900K machine. To reduce noise, I've isolated a single CPU core, specifically CPU core id 31, to not get any work scheduled by the kernel: $ cat /proc/cmdline BOOT_IMAGE=/vmlinuz-5.15.0-116-generic root=/dev/mapper/ubuntu--vg-ubuntu--lv ro quiet splash isolcpus=31 intel_pstate=disablevt.handoff=7 Then, I've used sched_setaffinity() from <sched.h> to ensure the benchmark run on CPU core id 31. I've also fixed the CPU frequency to 3.20 GHz: $ sudo cpufreq-info -c 31 ... current CPU frequency is 3.20 GHz (asserted by call to hardware). I've benchmarked each (var1ndigits, var2ndigits) 10 times per commit, in random order. I've benchmarked all commits after "SQL/JSON: Various improvements to SQL/JSON query function docs" which is the parent commit to "Optimise numeric multiplication for short inputs.", including the two patches. I've benchmarked each commit affecting numeric.c, and each such commit's parent commit, for comparison. The accum_change column shows the accumulative percentage change since the baseline commit (SQL/JSON: Various improvements). There is at least single digit percentage noise in the measurements, which is apparent since the rate fluctuates even between commits for cases we know can't be affected by the change. Still, even with this noise level, the improvements are very visible and consistent. ndigits | rate | accum_change | summary ---------------+------------+--------------+-------------------------------- (1,1) | 1.702e+07 | | SQL/JSON: Various improvements (1,1) | 2.201e+07 | +29.32 % | Optimise numeric multiplicatio (1,1) | 2.268e+07 | +33.30 % | Use diff's --strip-trailing-cr (1,1) | 2.228e+07 | +30.92 % | Improve the numeric width_buck (1,1) | 2.195e+07 | +29.01 % | Add missing pointer dereferenc (1,1) | 2.241e+07 | +31.68 % | Extend mul_var_short() to 5 an (1,1) | 2.130e+07 | +25.17 % | Optimise numeric multiplicatio (1,2) | 1.585e+07 | | SQL/JSON: Various improvements (1,2) | 2.227e+07 | +40.49 % | Optimise numeric multiplicatio (1,2) | 2.140e+07 | +35.00 % | Use diff's --strip-trailing-cr (1,2) | 2.227e+07 | +40.51 % | Improve the numeric width_buck (1,2) | 2.183e+07 | +37.75 % | Add missing pointer dereferenc (1,2) | 2.241e+07 | +41.41 % | Extend mul_var_short() to 5 an (1,2) | 2.223e+07 | +40.26 % | Optimise numeric multiplicatio (1,3) | 1.554e+07 | | SQL/JSON: Various improvements (1,3) | 2.155e+07 | +38.70 % | Optimise numeric multiplicatio (1,3) | 2.140e+07 | +37.74 % | Use diff's --strip-trailing-cr (1,3) | 2.139e+07 | +37.66 % | Improve the numeric width_buck (1,3) | 2.234e+07 | +43.76 % | Add missing pointer dereferenc (1,3) | 2.142e+07 | +37.83 % | Extend mul_var_short() to 5 an (1,3) | 2.066e+07 | +32.97 % | Optimise numeric multiplicatio (1,4) | 1.450e+07 | | SQL/JSON: Various improvements (1,4) | 2.113e+07 | +45.70 % | Optimise numeric multiplicatio (1,4) | 2.121e+07 | +46.30 % | Use diff's --strip-trailing-cr (1,4) | 2.115e+07 | +45.85 % | Improve the numeric width_buck (1,4) | 2.166e+07 | +49.37 % | Add missing pointer dereferenc (1,4) | 2.053e+07 | +41.56 % | Extend mul_var_short() to 5 an (1,4) | 2.085e+07 | +43.82 % | Optimise numeric multiplicatio (1,8) | 1.440e+07 | | SQL/JSON: Various improvements (1,8) | 1.963e+07 | +36.38 % | Optimise numeric multiplicatio (1,8) | 2.018e+07 | +40.19 % | Use diff's --strip-trailing-cr (1,8) | 2.045e+07 | +42.05 % | Improve the numeric width_buck (1,8) | 1.998e+07 | +38.79 % | Add missing pointer dereferenc (1,8) | 1.953e+07 | +35.68 % | Extend mul_var_short() to 5 an (1,8) | 1.992e+07 | +38.36 % | Optimise numeric multiplicatio (1,16) | 9.444e+06 | | SQL/JSON: Various improvements (1,16) | 1.235e+07 | +30.75 % | Optimise numeric multiplicatio (1,16) | 1.232e+07 | +30.47 % | Use diff's --strip-trailing-cr (1,16) | 1.239e+07 | +31.18 % | Improve the numeric width_buck (1,16) | 1.222e+07 | +29.35 % | Add missing pointer dereferenc (1,16) | 1.220e+07 | +29.14 % | Extend mul_var_short() to 5 an (1,16) | 1.271e+07 | +34.54 % | Optimise numeric multiplicatio (1,32) | 5.790e+06 | | SQL/JSON: Various improvements (1,32) | 8.392e+06 | +44.95 % | Optimise numeric multiplicatio (1,32) | 8.459e+06 | +46.10 % | Use diff's --strip-trailing-cr (1,32) | 8.325e+06 | +43.79 % | Improve the numeric width_buck (1,32) | 8.242e+06 | +42.35 % | Add missing pointer dereferenc (1,32) | 8.288e+06 | +43.14 % | Extend mul_var_short() to 5 an (1,32) | 8.448e+06 | +45.91 % | Optimise numeric multiplicatio (1,64) | 3.540e+06 | | SQL/JSON: Various improvements (1,64) | 4.684e+06 | +32.31 % | Optimise numeric multiplicatio (1,64) | 4.840e+06 | +36.74 % | Use diff's --strip-trailing-cr (1,64) | 4.794e+06 | +35.43 % | Improve the numeric width_buck (1,64) | 4.721e+06 | +33.38 % | Add missing pointer dereferenc (1,64) | 4.785e+06 | +35.18 % | Extend mul_var_short() to 5 an (1,64) | 4.767e+06 | +34.66 % | Optimise numeric multiplicatio (1,128) | 1.873e+06 | | SQL/JSON: Various improvements (1,128) | 2.459e+06 | +31.29 % | Optimise numeric multiplicatio (1,128) | 2.461e+06 | +31.42 % | Use diff's --strip-trailing-cr (1,128) | 2.539e+06 | +35.54 % | Improve the numeric width_buck (1,128) | 2.498e+06 | +33.38 % | Add missing pointer dereferenc (1,128) | 2.489e+06 | +32.91 % | Extend mul_var_short() to 5 an (1,128) | 2.498e+06 | +33.39 % | Optimise numeric multiplicatio (1,256) | 9.659e+05 | | SQL/JSON: Various improvements (1,256) | 1.326e+06 | +37.29 % | Optimise numeric multiplicatio (1,256) | 1.340e+06 | +38.75 % | Use diff's --strip-trailing-cr (1,256) | 1.292e+06 | +33.78 % | Improve the numeric width_buck (1,256) | 1.321e+06 | +36.75 % | Add missing pointer dereferenc (1,256) | 1.299e+06 | +34.44 % | Extend mul_var_short() to 5 an (1,256) | 1.324e+06 | +37.04 % | Optimise numeric multiplicatio (1,512) | 5.071e+05 | | SQL/JSON: Various improvements (1,512) | 6.814e+05 | +34.37 % | Optimise numeric multiplicatio (1,512) | 6.697e+05 | +32.05 % | Use diff's --strip-trailing-cr (1,512) | 6.770e+05 | +33.50 % | Improve the numeric width_buck (1,512) | 6.688e+05 | +31.88 % | Add missing pointer dereferenc (1,512) | 6.743e+05 | +32.97 % | Extend mul_var_short() to 5 an (1,512) | 6.700e+05 | +32.11 % | Optimise numeric multiplicatio (1,1024) | 2.541e+05 | | SQL/JSON: Various improvements (1,1024) | 3.351e+05 | +31.86 % | Optimise numeric multiplicatio (1,1024) | 3.401e+05 | +33.83 % | Use diff's --strip-trailing-cr (1,1024) | 3.373e+05 | +32.74 % | Improve the numeric width_buck (1,1024) | 3.313e+05 | +30.37 % | Add missing pointer dereferenc (1,1024) | 3.377e+05 | +32.88 % | Extend mul_var_short() to 5 an (1,1024) | 3.411e+05 | +34.23 % | Optimise numeric multiplicatio (1,2048) | 1.248e+05 | | SQL/JSON: Various improvements (1,2048) | 1.653e+05 | +32.46 % | Optimise numeric multiplicatio (1,2048) | 1.668e+05 | +33.64 % | Use diff's --strip-trailing-cr (1,2048) | 1.652e+05 | +32.35 % | Improve the numeric width_buck (1,2048) | 1.651e+05 | +32.26 % | Add missing pointer dereferenc (1,2048) | 1.681e+05 | +34.70 % | Extend mul_var_short() to 5 an (1,2048) | 1.662e+05 | +33.18 % | Optimise numeric multiplicatio (1,4096) | 6.417e+04 | | SQL/JSON: Various improvements (1,4096) | 8.533e+04 | +32.98 % | Optimise numeric multiplicatio (1,4096) | 8.715e+04 | +35.81 % | Use diff's --strip-trailing-cr (1,4096) | 8.475e+04 | +32.07 % | Improve the numeric width_buck (1,4096) | 8.627e+04 | +34.44 % | Add missing pointer dereferenc (1,4096) | 8.742e+04 | +36.23 % | Extend mul_var_short() to 5 an (1,4096) | 8.534e+04 | +33.00 % | Optimise numeric multiplicatio (1,8192) | 3.150e+04 | | SQL/JSON: Various improvements (1,8192) | 4.208e+04 | +33.58 % | Optimise numeric multiplicatio (1,8192) | 4.216e+04 | +33.81 % | Use diff's --strip-trailing-cr (1,8192) | 4.211e+04 | +33.67 % | Improve the numeric width_buck (1,8192) | 4.239e+04 | +34.56 % | Add missing pointer dereferenc (1,8192) | 4.155e+04 | +31.90 % | Extend mul_var_short() to 5 an (1,8192) | 4.166e+04 | +32.22 % | Optimise numeric multiplicatio (1,16384) | 1.563e+04 | | SQL/JSON: Various improvements (1,16384) | 2.114e+04 | +35.24 % | Optimise numeric multiplicatio (1,16384) | 2.057e+04 | +31.59 % | Use diff's --strip-trailing-cr (1,16384) | 2.094e+04 | +33.97 % | Improve the numeric width_buck (1,16384) | 2.123e+04 | +35.84 % | Add missing pointer dereferenc (1,16384) | 2.088e+04 | +33.57 % | Extend mul_var_short() to 5 an (1,16384) | 2.090e+04 | +33.74 % | Optimise numeric multiplicatio (2,2) | 1.437e+07 | | SQL/JSON: Various improvements (2,2) | 2.248e+07 | +56.42 % | Optimise numeric multiplicatio (2,2) | 2.103e+07 | +46.31 % | Use diff's --strip-trailing-cr (2,2) | 2.238e+07 | +55.74 % | Improve the numeric width_buck (2,2) | 2.217e+07 | +54.29 % | Add missing pointer dereferenc (2,2) | 2.096e+07 | +45.84 % | Extend mul_var_short() to 5 an (2,2) | 2.070e+07 | +44.05 % | Optimise numeric multiplicatio (2,3) | 1.332e+07 | | SQL/JSON: Various improvements (2,3) | 2.035e+07 | +52.78 % | Optimise numeric multiplicatio (2,3) | 2.041e+07 | +53.24 % | Use diff's --strip-trailing-cr (2,3) | 2.125e+07 | +59.59 % | Improve the numeric width_buck (2,3) | 2.183e+07 | +63.96 % | Add missing pointer dereferenc (2,3) | 2.124e+07 | +59.47 % | Extend mul_var_short() to 5 an (2,3) | 2.016e+07 | +51.36 % | Optimise numeric multiplicatio (2,4) | 1.339e+07 | | SQL/JSON: Various improvements (2,4) | 1.955e+07 | +45.99 % | Optimise numeric multiplicatio (2,4) | 2.004e+07 | +49.71 % | Use diff's --strip-trailing-cr (2,4) | 1.982e+07 | +48.04 % | Improve the numeric width_buck (2,4) | 1.942e+07 | +45.08 % | Add missing pointer dereferenc (2,4) | 1.990e+07 | +48.65 % | Extend mul_var_short() to 5 an (2,4) | 1.893e+07 | +41.37 % | Optimise numeric multiplicatio (2,8) | 1.363e+07 | | SQL/JSON: Various improvements (2,8) | 1.855e+07 | +36.14 % | Optimise numeric multiplicatio (2,8) | 1.838e+07 | +34.92 % | Use diff's --strip-trailing-cr (2,8) | 1.873e+07 | +37.47 % | Improve the numeric width_buck (2,8) | 1.838e+07 | +34.91 % | Add missing pointer dereferenc (2,8) | 1.867e+07 | +36.98 % | Extend mul_var_short() to 5 an (2,8) | 1.773e+07 | +30.14 % | Optimise numeric multiplicatio (2,16) | 9.092e+06 | | SQL/JSON: Various improvements (2,16) | 1.213e+07 | +33.41 % | Optimise numeric multiplicatio (2,16) | 1.255e+07 | +37.99 % | Use diff's --strip-trailing-cr (2,16) | 1.168e+07 | +28.52 % | Improve the numeric width_buck (2,16) | 1.173e+07 | +29.07 % | Add missing pointer dereferenc (2,16) | 1.195e+07 | +31.48 % | Extend mul_var_short() to 5 an (2,16) | 1.174e+07 | +29.09 % | Optimise numeric multiplicatio (2,32) | 5.436e+06 | | SQL/JSON: Various improvements (2,32) | 7.685e+06 | +41.38 % | Optimise numeric multiplicatio (2,32) | 7.711e+06 | +41.87 % | Use diff's --strip-trailing-cr (2,32) | 7.787e+06 | +43.26 % | Improve the numeric width_buck (2,32) | 7.910e+06 | +45.53 % | Add missing pointer dereferenc (2,32) | 7.831e+06 | +44.06 % | Extend mul_var_short() to 5 an (2,32) | 7.939e+06 | +46.04 % | Optimise numeric multiplicatio (2,64) | 3.338e+06 | | SQL/JSON: Various improvements (2,64) | 4.689e+06 | +40.48 % | Optimise numeric multiplicatio (2,64) | 4.445e+06 | +33.16 % | Use diff's --strip-trailing-cr (2,64) | 4.569e+06 | +36.88 % | Improve the numeric width_buck (2,64) | 4.419e+06 | +32.38 % | Add missing pointer dereferenc (2,64) | 4.661e+06 | +39.62 % | Extend mul_var_short() to 5 an (2,64) | 4.497e+06 | +34.73 % | Optimise numeric multiplicatio (2,128) | 1.799e+06 | | SQL/JSON: Various improvements (2,128) | 2.348e+06 | +30.49 % | Optimise numeric multiplicatio (2,128) | 2.350e+06 | +30.60 % | Use diff's --strip-trailing-cr (2,128) | 2.457e+06 | +36.57 % | Improve the numeric width_buck (2,128) | 2.316e+06 | +28.71 % | Add missing pointer dereferenc (2,128) | 2.430e+06 | +35.07 % | Extend mul_var_short() to 5 an (2,128) | 2.401e+06 | +33.47 % | Optimise numeric multiplicatio (2,256) | 9.249e+05 | | SQL/JSON: Various improvements (2,256) | 1.249e+06 | +35.08 % | Optimise numeric multiplicatio (2,256) | 1.243e+06 | +34.38 % | Use diff's --strip-trailing-cr (2,256) | 1.243e+06 | +34.44 % | Improve the numeric width_buck (2,256) | 1.228e+06 | +32.73 % | Add missing pointer dereferenc (2,256) | 1.248e+06 | +34.88 % | Extend mul_var_short() to 5 an (2,256) | 1.262e+06 | +36.40 % | Optimise numeric multiplicatio (2,512) | 4.750e+05 | | SQL/JSON: Various improvements (2,512) | 6.210e+05 | +30.75 % | Optimise numeric multiplicatio (2,512) | 6.434e+05 | +35.47 % | Use diff's --strip-trailing-cr (2,512) | 6.387e+05 | +34.46 % | Improve the numeric width_buck (2,512) | 6.223e+05 | +31.03 % | Add missing pointer dereferenc (2,512) | 6.367e+05 | +34.06 % | Extend mul_var_short() to 5 an (2,512) | 6.524e+05 | +37.36 % | Optimise numeric multiplicatio (2,1024) | 2.411e+05 | | SQL/JSON: Various improvements (2,1024) | 3.227e+05 | +33.83 % | Optimise numeric multiplicatio (2,1024) | 3.249e+05 | +34.75 % | Use diff's --strip-trailing-cr (2,1024) | 3.278e+05 | +35.94 % | Improve the numeric width_buck (2,1024) | 3.162e+05 | +31.13 % | Add missing pointer dereferenc (2,1024) | 3.219e+05 | +33.49 % | Extend mul_var_short() to 5 an (2,1024) | 3.238e+05 | +34.30 % | Optimise numeric multiplicatio (2,2048) | 1.184e+05 | | SQL/JSON: Various improvements (2,2048) | 1.553e+05 | +31.15 % | Optimise numeric multiplicatio (2,2048) | 1.580e+05 | +33.47 % | Use diff's --strip-trailing-cr (2,2048) | 1.545e+05 | +30.55 % | Improve the numeric width_buck (2,2048) | 1.564e+05 | +32.12 % | Add missing pointer dereferenc (2,2048) | 1.564e+05 | +32.10 % | Extend mul_var_short() to 5 an (2,2048) | 1.603e+05 | +35.40 % | Optimise numeric multiplicatio (2,4096) | 6.244e+04 | | SQL/JSON: Various improvements (2,4096) | 8.198e+04 | +31.31 % | Optimise numeric multiplicatio (2,4096) | 8.268e+04 | +32.41 % | Use diff's --strip-trailing-cr (2,4096) | 8.200e+04 | +31.33 % | Improve the numeric width_buck (2,4096) | 8.366e+04 | +33.98 % | Add missing pointer dereferenc (2,4096) | 8.445e+04 | +35.26 % | Extend mul_var_short() to 5 an (2,4096) | 8.326e+04 | +33.35 % | Optimise numeric multiplicatio (2,8192) | 3.001e+04 | | SQL/JSON: Various improvements (2,8192) | 3.958e+04 | +31.89 % | Optimise numeric multiplicatio (2,8192) | 3.961e+04 | +32.00 % | Use diff's --strip-trailing-cr (2,8192) | 4.030e+04 | +34.30 % | Improve the numeric width_buck (2,8192) | 4.061e+04 | +35.31 % | Add missing pointer dereferenc (2,8192) | 4.075e+04 | +35.81 % | Extend mul_var_short() to 5 an (2,8192) | 4.147e+04 | +38.20 % | Optimise numeric multiplicatio (2,16384) | 1.583e+04 | | SQL/JSON: Various improvements (2,16384) | 1.989e+04 | +25.64 % | Optimise numeric multiplicatio (2,16384) | 1.967e+04 | +24.28 % | Use diff's --strip-trailing-cr (2,16384) | 1.966e+04 | +24.20 % | Improve the numeric width_buck (2,16384) | 1.954e+04 | +23.45 % | Add missing pointer dereferenc (2,16384) | 2.049e+04 | +29.45 % | Extend mul_var_short() to 5 an (2,16384) | 2.063e+04 | +30.37 % | Optimise numeric multiplicatio (3,3) | 1.248e+07 | | SQL/JSON: Various improvements (3,3) | 1.990e+07 | +59.48 % | Optimise numeric multiplicatio (3,3) | 2.096e+07 | +67.98 % | Use diff's --strip-trailing-cr (3,3) | 2.053e+07 | +64.47 % | Improve the numeric width_buck (3,3) | 2.084e+07 | +66.97 % | Add missing pointer dereferenc (3,3) | 2.029e+07 | +62.57 % | Extend mul_var_short() to 5 an (3,3) | 1.920e+07 | +53.88 % | Optimise numeric multiplicatio (3,4) | 1.270e+07 | | SQL/JSON: Various improvements (3,4) | 1.974e+07 | +55.39 % | Optimise numeric multiplicatio (3,4) | 1.976e+07 | +55.50 % | Use diff's --strip-trailing-cr (3,4) | 1.973e+07 | +55.31 % | Improve the numeric width_buck (3,4) | 1.926e+07 | +51.62 % | Add missing pointer dereferenc (3,4) | 1.931e+07 | +51.97 % | Extend mul_var_short() to 5 an (3,4) | 1.919e+07 | +51.02 % | Optimise numeric multiplicatio (3,8) | 1.244e+07 | | SQL/JSON: Various improvements (3,8) | 1.769e+07 | +42.24 % | Optimise numeric multiplicatio (3,8) | 1.709e+07 | +37.44 % | Use diff's --strip-trailing-cr (3,8) | 1.804e+07 | +45.04 % | Improve the numeric width_buck (3,8) | 1.772e+07 | +42.53 % | Add missing pointer dereferenc (3,8) | 1.699e+07 | +36.63 % | Extend mul_var_short() to 5 an (3,8) | 1.770e+07 | +42.30 % | Optimise numeric multiplicatio (3,16) | 7.919e+06 | | SQL/JSON: Various improvements (3,16) | 1.125e+07 | +42.09 % | Optimise numeric multiplicatio (3,16) | 1.123e+07 | +41.76 % | Use diff's --strip-trailing-cr (3,16) | 1.113e+07 | +40.48 % | Improve the numeric width_buck (3,16) | 1.124e+07 | +41.91 % | Add missing pointer dereferenc (3,16) | 1.143e+07 | +44.30 % | Extend mul_var_short() to 5 an (3,16) | 1.147e+07 | +44.84 % | Optimise numeric multiplicatio (3,32) | 5.507e+06 | | SQL/JSON: Various improvements (3,32) | 7.149e+06 | +29.82 % | Optimise numeric multiplicatio (3,32) | 7.206e+06 | +30.85 % | Use diff's --strip-trailing-cr (3,32) | 7.526e+06 | +36.67 % | Improve the numeric width_buck (3,32) | 7.238e+06 | +31.43 % | Add missing pointer dereferenc (3,32) | 7.413e+06 | +34.61 % | Extend mul_var_short() to 5 an (3,32) | 7.613e+06 | +38.24 % | Optimise numeric multiplicatio (3,64) | 3.258e+06 | | SQL/JSON: Various improvements (3,64) | 4.338e+06 | +33.15 % | Optimise numeric multiplicatio (3,64) | 4.265e+06 | +30.90 % | Use diff's --strip-trailing-cr (3,64) | 4.292e+06 | +31.73 % | Improve the numeric width_buck (3,64) | 4.342e+06 | +33.27 % | Add missing pointer dereferenc (3,64) | 4.373e+06 | +34.22 % | Extend mul_var_short() to 5 an (3,64) | 4.365e+06 | +33.98 % | Optimise numeric multiplicatio (3,128) | 1.675e+06 | | SQL/JSON: Various improvements (3,128) | 2.220e+06 | +32.55 % | Optimise numeric multiplicatio (3,128) | 2.232e+06 | +33.28 % | Use diff's --strip-trailing-cr (3,128) | 2.276e+06 | +35.87 % | Improve the numeric width_buck (3,128) | 2.275e+06 | +35.84 % | Add missing pointer dereferenc (3,128) | 2.309e+06 | +37.87 % | Extend mul_var_short() to 5 an (3,128) | 2.324e+06 | +38.74 % | Optimise numeric multiplicatio (3,256) | 9.046e+05 | | SQL/JSON: Various improvements (3,256) | 1.198e+06 | +32.45 % | Optimise numeric multiplicatio (3,256) | 1.217e+06 | +34.49 % | Use diff's --strip-trailing-cr (3,256) | 1.221e+06 | +35.02 % | Improve the numeric width_buck (3,256) | 1.225e+06 | +35.43 % | Add missing pointer dereferenc (3,256) | 1.230e+06 | +36.03 % | Extend mul_var_short() to 5 an (3,256) | 1.218e+06 | +34.69 % | Optimise numeric multiplicatio (3,512) | 4.675e+05 | | SQL/JSON: Various improvements (3,512) | 6.195e+05 | +32.50 % | Optimise numeric multiplicatio (3,512) | 6.199e+05 | +32.59 % | Use diff's --strip-trailing-cr (3,512) | 6.475e+05 | +38.49 % | Improve the numeric width_buck (3,512) | 6.284e+05 | +34.40 % | Add missing pointer dereferenc (3,512) | 6.214e+05 | +32.90 % | Extend mul_var_short() to 5 an (3,512) | 6.306e+05 | +34.88 % | Optimise numeric multiplicatio (3,1024) | 2.393e+05 | | SQL/JSON: Various improvements (3,1024) | 3.049e+05 | +27.40 % | Optimise numeric multiplicatio (3,1024) | 3.233e+05 | +35.10 % | Use diff's --strip-trailing-cr (3,1024) | 3.150e+05 | +31.63 % | Improve the numeric width_buck (3,1024) | 3.152e+05 | +31.70 % | Add missing pointer dereferenc (3,1024) | 3.284e+05 | +37.20 % | Extend mul_var_short() to 5 an (3,1024) | 3.132e+05 | +30.85 % | Optimise numeric multiplicatio (3,2048) | 1.190e+05 | | SQL/JSON: Various improvements (3,2048) | 1.599e+05 | +34.37 % | Optimise numeric multiplicatio (3,2048) | 1.545e+05 | +29.84 % | Use diff's --strip-trailing-cr (3,2048) | 1.544e+05 | +29.75 % | Improve the numeric width_buck (3,2048) | 1.551e+05 | +30.36 % | Add missing pointer dereferenc (3,2048) | 1.602e+05 | +34.61 % | Extend mul_var_short() to 5 an (3,2048) | 1.570e+05 | +31.91 % | Optimise numeric multiplicatio (3,4096) | 5.937e+04 | | SQL/JSON: Various improvements (3,4096) | 8.109e+04 | +36.57 % | Optimise numeric multiplicatio (3,4096) | 8.114e+04 | +36.66 % | Use diff's --strip-trailing-cr (3,4096) | 8.169e+04 | +37.59 % | Improve the numeric width_buck (3,4096) | 8.166e+04 | +37.54 % | Add missing pointer dereferenc (3,4096) | 8.058e+04 | +35.71 % | Extend mul_var_short() to 5 an (3,4096) | 8.166e+04 | +37.54 % | Optimise numeric multiplicatio (3,8192) | 2.937e+04 | | SQL/JSON: Various improvements (3,8192) | 3.974e+04 | +35.29 % | Optimise numeric multiplicatio (3,8192) | 4.010e+04 | +36.53 % | Use diff's --strip-trailing-cr (3,8192) | 3.933e+04 | +33.90 % | Improve the numeric width_buck (3,8192) | 3.999e+04 | +36.14 % | Add missing pointer dereferenc (3,8192) | 3.998e+04 | +36.09 % | Extend mul_var_short() to 5 an (3,8192) | 3.985e+04 | +35.67 % | Optimise numeric multiplicatio (3,16384) | 1.491e+04 | | SQL/JSON: Various improvements (3,16384) | 1.978e+04 | +32.63 % | Optimise numeric multiplicatio (3,16384) | 1.996e+04 | +33.85 % | Use diff's --strip-trailing-cr (3,16384) | 1.995e+04 | +33.80 % | Improve the numeric width_buck (3,16384) | 2.027e+04 | +35.91 % | Add missing pointer dereferenc (3,16384) | 1.986e+04 | +33.17 % | Extend mul_var_short() to 5 an (3,16384) | 2.038e+04 | +36.70 % | Optimise numeric multiplicatio (4,4) | 1.134e+07 | | SQL/JSON: Various improvements (4,4) | 2.022e+07 | +78.31 % | Optimise numeric multiplicatio (4,4) | 2.004e+07 | +76.67 % | Use diff's --strip-trailing-cr (4,4) | 1.961e+07 | +72.88 % | Improve the numeric width_buck (4,4) | 1.885e+07 | +66.21 % | Add missing pointer dereferenc (4,4) | 1.829e+07 | +61.30 % | Extend mul_var_short() to 5 an (4,4) | 1.883e+07 | +66.03 % | Optimise numeric multiplicatio (4,8) | 1.149e+07 | | SQL/JSON: Various improvements (4,8) | 1.734e+07 | +50.90 % | Optimise numeric multiplicatio (4,8) | 1.703e+07 | +48.17 % | Use diff's --strip-trailing-cr (4,8) | 1.752e+07 | +52.44 % | Improve the numeric width_buck (4,8) | 1.761e+07 | +53.27 % | Add missing pointer dereferenc (4,8) | 1.711e+07 | +48.86 % | Extend mul_var_short() to 5 an (4,8) | 1.633e+07 | +42.09 % | Optimise numeric multiplicatio (4,16) | 7.330e+06 | | SQL/JSON: Various improvements (4,16) | 1.075e+07 | +46.69 % | Optimise numeric multiplicatio (4,16) | 1.120e+07 | +52.80 % | Use diff's --strip-trailing-cr (4,16) | 1.103e+07 | +50.52 % | Improve the numeric width_buck (4,16) | 1.049e+07 | +43.15 % | Add missing pointer dereferenc (4,16) | 1.093e+07 | +49.16 % | Extend mul_var_short() to 5 an (4,16) | 1.053e+07 | +43.63 % | Optimise numeric multiplicatio (4,32) | 5.220e+06 | | SQL/JSON: Various improvements (4,32) | 6.915e+06 | +32.47 % | Optimise numeric multiplicatio (4,32) | 7.030e+06 | +34.67 % | Use diff's --strip-trailing-cr (4,32) | 6.870e+06 | +31.61 % | Improve the numeric width_buck (4,32) | 6.972e+06 | +33.56 % | Add missing pointer dereferenc (4,32) | 6.953e+06 | +33.19 % | Extend mul_var_short() to 5 an (4,32) | 6.648e+06 | +27.35 % | Optimise numeric multiplicatio (4,64) | 3.100e+06 | | SQL/JSON: Various improvements (4,64) | 3.899e+06 | +25.76 % | Optimise numeric multiplicatio (4,64) | 4.072e+06 | +31.36 % | Use diff's --strip-trailing-cr (4,64) | 4.044e+06 | +30.44 % | Improve the numeric width_buck (4,64) | 3.995e+06 | +28.86 % | Add missing pointer dereferenc (4,64) | 4.129e+06 | +33.18 % | Extend mul_var_short() to 5 an (4,64) | 4.088e+06 | +31.86 % | Optimise numeric multiplicatio (4,128) | 1.636e+06 | | SQL/JSON: Various improvements (4,128) | 2.068e+06 | +26.38 % | Optimise numeric multiplicatio (4,128) | 2.140e+06 | +30.78 % | Use diff's --strip-trailing-cr (4,128) | 2.186e+06 | +33.57 % | Improve the numeric width_buck (4,128) | 2.088e+06 | +27.63 % | Add missing pointer dereferenc (4,128) | 2.121e+06 | +29.62 % | Extend mul_var_short() to 5 an (4,128) | 2.011e+06 | +22.88 % | Optimise numeric multiplicatio (4,256) | 8.487e+05 | | SQL/JSON: Various improvements (4,256) | 1.099e+06 | +29.45 % | Optimise numeric multiplicatio (4,256) | 1.108e+06 | +30.53 % | Use diff's --strip-trailing-cr (4,256) | 1.109e+06 | +30.71 % | Improve the numeric width_buck (4,256) | 1.115e+06 | +31.37 % | Add missing pointer dereferenc (4,256) | 1.114e+06 | +31.26 % | Extend mul_var_short() to 5 an (4,256) | 1.077e+06 | +26.85 % | Optimise numeric multiplicatio (4,512) | 4.397e+05 | | SQL/JSON: Various improvements (4,512) | 5.790e+05 | +31.69 % | Optimise numeric multiplicatio (4,512) | 5.995e+05 | +36.36 % | Use diff's --strip-trailing-cr (4,512) | 5.774e+05 | +31.33 % | Improve the numeric width_buck (4,512) | 5.573e+05 | +26.75 % | Add missing pointer dereferenc (4,512) | 5.779e+05 | +31.46 % | Extend mul_var_short() to 5 an (4,512) | 5.478e+05 | +24.59 % | Optimise numeric multiplicatio (4,1024) | 2.359e+05 | | SQL/JSON: Various improvements (4,1024) | 2.903e+05 | +23.04 % | Optimise numeric multiplicatio (4,1024) | 2.873e+05 | +21.78 % | Use diff's --strip-trailing-cr (4,1024) | 2.846e+05 | +20.64 % | Improve the numeric width_buck (4,1024) | 2.899e+05 | +22.89 % | Add missing pointer dereferenc (4,1024) | 2.815e+05 | +19.30 % | Extend mul_var_short() to 5 an (4,1024) | 2.793e+05 | +18.38 % | Optimise numeric multiplicatio (4,2048) | 1.132e+05 | | SQL/JSON: Various improvements (4,2048) | 1.438e+05 | +26.96 % | Optimise numeric multiplicatio (4,2048) | 1.453e+05 | +28.28 % | Use diff's --strip-trailing-cr (4,2048) | 1.407e+05 | +24.28 % | Improve the numeric width_buck (4,2048) | 1.432e+05 | +26.44 % | Add missing pointer dereferenc (4,2048) | 1.451e+05 | +28.10 % | Extend mul_var_short() to 5 an (4,2048) | 1.429e+05 | +26.22 % | Optimise numeric multiplicatio (4,4096) | 5.841e+04 | | SQL/JSON: Various improvements (4,4096) | 7.326e+04 | +25.43 % | Optimise numeric multiplicatio (4,4096) | 7.196e+04 | +23.20 % | Use diff's --strip-trailing-cr (4,4096) | 7.539e+04 | +29.07 % | Improve the numeric width_buck (4,4096) | 7.197e+04 | +23.23 % | Add missing pointer dereferenc (4,4096) | 7.391e+04 | +26.53 % | Extend mul_var_short() to 5 an (4,4096) | 7.060e+04 | +20.87 % | Optimise numeric multiplicatio (4,8192) | 2.825e+04 | | SQL/JSON: Various improvements (4,8192) | 3.679e+04 | +30.24 % | Optimise numeric multiplicatio (4,8192) | 3.617e+04 | +28.06 % | Use diff's --strip-trailing-cr (4,8192) | 3.685e+04 | +30.46 % | Improve the numeric width_buck (4,8192) | 3.645e+04 | +29.06 % | Add missing pointer dereferenc (4,8192) | 3.606e+04 | +27.68 % | Extend mul_var_short() to 5 an (4,8192) | 3.581e+04 | +26.78 % | Optimise numeric multiplicatio (4,16384) | 1.398e+04 | | SQL/JSON: Various improvements (4,16384) | 1.797e+04 | +28.54 % | Optimise numeric multiplicatio (4,16384) | 1.800e+04 | +28.73 % | Use diff's --strip-trailing-cr (4,16384) | 1.766e+04 | +26.33 % | Improve the numeric width_buck (4,16384) | 1.775e+04 | +26.96 % | Add missing pointer dereferenc (4,16384) | 1.827e+04 | +30.69 % | Extend mul_var_short() to 5 an (4,16384) | 1.735e+04 | +24.08 % | Optimise numeric multiplicatio (5,5) | 1.040e+07 | | SQL/JSON: Various improvements (5,5) | 1.015e+07 | -2.37 % | Optimise numeric multiplicatio (5,5) | 1.021e+07 | -1.80 % | Use diff's --strip-trailing-cr (5,5) | 1.099e+07 | +5.70 % | Improve the numeric width_buck (5,5) | 1.036e+07 | -0.31 % | Add missing pointer dereferenc (5,5) | 1.749e+07 | +68.21 % | Extend mul_var_short() to 5 an (5,5) | 1.657e+07 | +59.45 % | Optimise numeric multiplicatio (6,6) | 9.115e+06 | | SQL/JSON: Various improvements (6,6) | 1.030e+07 | +13.03 % | Optimise numeric multiplicatio (6,6) | 9.434e+06 | +3.50 % | Use diff's --strip-trailing-cr (6,6) | 8.876e+06 | -2.62 % | Improve the numeric width_buck (6,6) | 8.793e+06 | -3.53 % | Add missing pointer dereferenc (6,6) | 1.490e+07 | +63.49 % | Extend mul_var_short() to 5 an (6,6) | 1.589e+07 | +74.33 % | Optimise numeric multiplicatio (7,7) | 7.724e+06 | | SQL/JSON: Various improvements (7,7) | 7.446e+06 | -3.59 % | Optimise numeric multiplicatio (7,7) | 7.929e+06 | +2.66 % | Use diff's --strip-trailing-cr (7,7) | 7.481e+06 | -3.14 % | Improve the numeric width_buck (7,7) | 7.497e+06 | -2.93 % | Add missing pointer dereferenc (7,7) | 7.214e+06 | -6.60 % | Extend mul_var_short() to 5 an (7,7) | 1.024e+07 | +32.56 % | Optimise numeric multiplicatio (8,8) | 7.842e+06 | | SQL/JSON: Various improvements (8,8) | 7.827e+06 | -0.19 % | Optimise numeric multiplicatio (8,8) | 8.111e+06 | +3.44 % | Use diff's --strip-trailing-cr (8,8) | 8.156e+06 | +4.01 % | Improve the numeric width_buck (8,8) | 7.908e+06 | +0.85 % | Add missing pointer dereferenc (8,8) | 8.029e+06 | +2.40 % | Extend mul_var_short() to 5 an (8,8) | 9.644e+06 | +22.99 % | Optimise numeric multiplicatio (8,16) | 6.489e+06 | | SQL/JSON: Various improvements (8,16) | 6.276e+06 | -3.29 % | Optimise numeric multiplicatio (8,16) | 6.332e+06 | -2.42 % | Use diff's --strip-trailing-cr (8,16) | 6.463e+06 | -0.40 % | Improve the numeric width_buck (8,16) | 5.928e+06 | -8.65 % | Add missing pointer dereferenc (8,16) | 5.949e+06 | -8.32 % | Extend mul_var_short() to 5 an (8,16) | 8.349e+06 | +28.66 % | Optimise numeric multiplicatio (8,32) | 4.327e+06 | | SQL/JSON: Various improvements (8,32) | 4.324e+06 | -0.08 % | Optimise numeric multiplicatio (8,32) | 4.444e+06 | +2.68 % | Use diff's --strip-trailing-cr (8,32) | 4.335e+06 | +0.18 % | Improve the numeric width_buck (8,32) | 4.350e+06 | +0.52 % | Add missing pointer dereferenc (8,32) | 4.333e+06 | +0.13 % | Extend mul_var_short() to 5 an (8,32) | 6.288e+06 | +45.30 % | Optimise numeric multiplicatio (8,64) | 2.677e+06 | | SQL/JSON: Various improvements (8,64) | 2.674e+06 | -0.10 % | Optimise numeric multiplicatio (8,64) | 2.668e+06 | -0.31 % | Use diff's --strip-trailing-cr (8,64) | 2.704e+06 | +1.02 % | Improve the numeric width_buck (8,64) | 2.684e+06 | +0.28 % | Add missing pointer dereferenc (8,64) | 2.702e+06 | +0.96 % | Extend mul_var_short() to 5 an (8,64) | 3.876e+06 | +44.80 % | Optimise numeric multiplicatio (8,128) | 1.410e+06 | | SQL/JSON: Various improvements (8,128) | 1.418e+06 | +0.56 % | Optimise numeric multiplicatio (8,128) | 1.434e+06 | +1.69 % | Use diff's --strip-trailing-cr (8,128) | 1.452e+06 | +3.00 % | Improve the numeric width_buck (8,128) | 1.464e+06 | +3.79 % | Add missing pointer dereferenc (8,128) | 1.384e+06 | -1.87 % | Extend mul_var_short() to 5 an (8,128) | 2.224e+06 | +57.71 % | Optimise numeric multiplicatio (8,256) | 7.400e+05 | | SQL/JSON: Various improvements (8,256) | 7.473e+05 | +0.98 % | Optimise numeric multiplicatio (8,256) | 7.338e+05 | -0.85 % | Use diff's --strip-trailing-cr (8,256) | 7.401e+05 | +0.01 % | Improve the numeric width_buck (8,256) | 7.460e+05 | +0.80 % | Add missing pointer dereferenc (8,256) | 7.563e+05 | +2.20 % | Extend mul_var_short() to 5 an (8,256) | 1.190e+06 | +60.79 % | Optimise numeric multiplicatio (8,512) | 3.746e+05 | | SQL/JSON: Various improvements (8,512) | 3.834e+05 | +2.36 % | Optimise numeric multiplicatio (8,512) | 3.829e+05 | +2.21 % | Use diff's --strip-trailing-cr (8,512) | 3.840e+05 | +2.50 % | Improve the numeric width_buck (8,512) | 3.794e+05 | +1.27 % | Add missing pointer dereferenc (8,512) | 3.662e+05 | -2.25 % | Extend mul_var_short() to 5 an (8,512) | 6.290e+05 | +67.91 % | Optimise numeric multiplicatio (8,1024) | 2.036e+05 | | SQL/JSON: Various improvements (8,1024) | 2.070e+05 | +1.70 % | Optimise numeric multiplicatio (8,1024) | 2.011e+05 | -1.24 % | Use diff's --strip-trailing-cr (8,1024) | 2.011e+05 | -1.22 % | Improve the numeric width_buck (8,1024) | 2.032e+05 | -0.18 % | Add missing pointer dereferenc (8,1024) | 2.028e+05 | -0.38 % | Extend mul_var_short() to 5 an (8,1024) | 3.232e+05 | +58.76 % | Optimise numeric multiplicatio (8,2048) | 9.898e+04 | | SQL/JSON: Various improvements (8,2048) | 1.013e+05 | +2.37 % | Optimise numeric multiplicatio (8,2048) | 9.910e+04 | +0.12 % | Use diff's --strip-trailing-cr (8,2048) | 1.001e+05 | +1.09 % | Improve the numeric width_buck (8,2048) | 9.995e+04 | +0.98 % | Add missing pointer dereferenc (8,2048) | 9.741e+04 | -1.59 % | Extend mul_var_short() to 5 an (8,2048) | 1.544e+05 | +55.94 % | Optimise numeric multiplicatio (8,4096) | 5.071e+04 | | SQL/JSON: Various improvements (8,4096) | 5.104e+04 | +0.64 % | Optimise numeric multiplicatio (8,4096) | 5.118e+04 | +0.92 % | Use diff's --strip-trailing-cr (8,4096) | 5.123e+04 | +1.02 % | Improve the numeric width_buck (8,4096) | 5.072e+04 | +0.02 % | Add missing pointer dereferenc (8,4096) | 5.213e+04 | +2.80 % | Extend mul_var_short() to 5 an (8,4096) | 8.190e+04 | +61.49 % | Optimise numeric multiplicatio (8,8192) | 2.431e+04 | | SQL/JSON: Various improvements (8,8192) | 2.411e+04 | -0.80 % | Optimise numeric multiplicatio (8,8192) | 2.433e+04 | +0.10 % | Use diff's --strip-trailing-cr (8,8192) | 2.434e+04 | +0.14 % | Improve the numeric width_buck (8,8192) | 2.430e+04 | -0.04 % | Add missing pointer dereferenc (8,8192) | 2.520e+04 | +3.69 % | Extend mul_var_short() to 5 an (8,8192) | 3.958e+04 | +62.82 % | Optimise numeric multiplicatio (8,16384) | 1.222e+04 | | SQL/JSON: Various improvements (8,16384) | 1.224e+04 | +0.21 % | Optimise numeric multiplicatio (8,16384) | 1.211e+04 | -0.92 % | Use diff's --strip-trailing-cr (8,16384) | 1.202e+04 | -1.58 % | Improve the numeric width_buck (8,16384) | 1.232e+04 | +0.86 % | Add missing pointer dereferenc (8,16384) | 1.211e+04 | -0.92 % | Extend mul_var_short() to 5 an (8,16384) | 1.958e+04 | +60.24 % | Optimise numeric multiplicatio (16,16) | 4.325e+06 | | SQL/JSON: Various improvements (16,16) | 4.380e+06 | +1.28 % | Optimise numeric multiplicatio (16,16) | 4.258e+06 | -1.56 % | Use diff's --strip-trailing-cr (16,16) | 4.389e+06 | +1.48 % | Improve the numeric width_buck (16,16) | 4.265e+06 | -1.38 % | Add missing pointer dereferenc (16,16) | 4.266e+06 | -1.37 % | Extend mul_var_short() to 5 an (16,16) | 6.293e+06 | +45.50 % | Optimise numeric multiplicatio (16,32) | 3.289e+06 | | SQL/JSON: Various improvements (16,32) | 3.356e+06 | +2.04 % | Optimise numeric multiplicatio (16,32) | 3.226e+06 | -1.92 % | Use diff's --strip-trailing-cr (16,32) | 3.349e+06 | +1.83 % | Improve the numeric width_buck (16,32) | 3.307e+06 | +0.54 % | Add missing pointer dereferenc (16,32) | 3.212e+06 | -2.36 % | Extend mul_var_short() to 5 an (16,32) | 4.831e+06 | +46.89 % | Optimise numeric multiplicatio (16,64) | 2.060e+06 | | SQL/JSON: Various improvements (16,64) | 2.047e+06 | -0.66 % | Optimise numeric multiplicatio (16,64) | 2.005e+06 | -2.71 % | Use diff's --strip-trailing-cr (16,64) | 2.100e+06 | +1.93 % | Improve the numeric width_buck (16,64) | 2.062e+06 | +0.06 % | Add missing pointer dereferenc (16,64) | 1.814e+06 | -11.95 % | Extend mul_var_short() to 5 an (16,64) | 3.278e+06 | +59.07 % | Optimise numeric multiplicatio (16,128) | 1.174e+06 | | SQL/JSON: Various improvements (16,128) | 1.121e+06 | -4.52 % | Optimise numeric multiplicatio (16,128) | 1.142e+06 | -2.75 % | Use diff's --strip-trailing-cr (16,128) | 1.165e+06 | -0.79 % | Improve the numeric width_buck (16,128) | 1.163e+06 | -0.93 % | Add missing pointer dereferenc (16,128) | 1.049e+06 | -10.68 % | Extend mul_var_short() to 5 an (16,128) | 1.821e+06 | +55.05 % | Optimise numeric multiplicatio (16,256) | 5.786e+05 | | SQL/JSON: Various improvements (16,256) | 6.143e+05 | +6.15 % | Optimise numeric multiplicatio (16,256) | 6.141e+05 | +6.13 % | Use diff's --strip-trailing-cr (16,256) | 5.783e+05 | -0.06 % | Improve the numeric width_buck (16,256) | 5.837e+05 | +0.88 % | Add missing pointer dereferenc (16,256) | 5.725e+05 | -1.06 % | Extend mul_var_short() to 5 an (16,256) | 9.643e+05 | +66.64 % | Optimise numeric multiplicatio (16,512) | 2.984e+05 | | SQL/JSON: Various improvements (16,512) | 2.994e+05 | +0.33 % | Optimise numeric multiplicatio (16,512) | 3.016e+05 | +1.06 % | Use diff's --strip-trailing-cr (16,512) | 2.961e+05 | -0.77 % | Improve the numeric width_buck (16,512) | 2.972e+05 | -0.43 % | Add missing pointer dereferenc (16,512) | 2.967e+05 | -0.57 % | Extend mul_var_short() to 5 an (16,512) | 5.348e+05 | +79.21 % | Optimise numeric multiplicatio (16,1024) | 1.635e+05 | | SQL/JSON: Various improvements (16,1024) | 1.695e+05 | +3.66 % | Optimise numeric multiplicatio (16,1024) | 1.673e+05 | +2.28 % | Use diff's --strip-trailing-cr (16,1024) | 1.650e+05 | +0.87 % | Improve the numeric width_buck (16,1024) | 1.643e+05 | +0.48 % | Add missing pointer dereferenc (16,1024) | 1.617e+05 | -1.11 % | Extend mul_var_short() to 5 an (16,1024) | 2.789e+05 | +70.54 % | Optimise numeric multiplicatio (16,2048) | 7.988e+04 | | SQL/JSON: Various improvements (16,2048) | 8.323e+04 | +4.20 % | Optimise numeric multiplicatio (16,2048) | 8.180e+04 | +2.41 % | Use diff's --strip-trailing-cr (16,2048) | 8.048e+04 | +0.75 % | Improve the numeric width_buck (16,2048) | 8.065e+04 | +0.96 % | Add missing pointer dereferenc (16,2048) | 8.284e+04 | +3.72 % | Extend mul_var_short() to 5 an (16,2048) | 1.325e+05 | +65.90 % | Optimise numeric multiplicatio (16,4096) | 4.118e+04 | | SQL/JSON: Various improvements (16,4096) | 4.400e+04 | +6.84 % | Optimise numeric multiplicatio (16,4096) | 4.155e+04 | +0.89 % | Use diff's --strip-trailing-cr (16,4096) | 4.440e+04 | +7.81 % | Improve the numeric width_buck (16,4096) | 4.154e+04 | +0.88 % | Add missing pointer dereferenc (16,4096) | 4.274e+04 | +3.79 % | Extend mul_var_short() to 5 an (16,4096) | 6.959e+04 | +68.97 % | Optimise numeric multiplicatio (16,8192) | 1.963e+04 | | SQL/JSON: Various improvements (16,8192) | 1.910e+04 | -2.65 % | Optimise numeric multiplicatio (16,8192) | 1.927e+04 | -1.79 % | Use diff's --strip-trailing-cr (16,8192) | 1.946e+04 | -0.87 % | Improve the numeric width_buck (16,8192) | 1.925e+04 | -1.92 % | Add missing pointer dereferenc (16,8192) | 1.890e+04 | -3.68 % | Extend mul_var_short() to 5 an (16,8192) | 3.280e+04 | +67.15 % | Optimise numeric multiplicatio (16,16384) | 9.497e+03 | | SQL/JSON: Various improvements (16,16384) | 9.499e+03 | +0.02 % | Optimise numeric multiplicatio (16,16384) | 9.721e+03 | +2.35 % | Use diff's --strip-trailing-cr (16,16384) | 9.586e+03 | +0.94 % | Improve the numeric width_buck (16,16384) | 9.559e+03 | +0.65 % | Add missing pointer dereferenc (16,16384) | 9.744e+03 | +2.59 % | Extend mul_var_short() to 5 an (16,16384) | 1.627e+04 | +71.30 % | Optimise numeric multiplicatio (32,32) | 2.032e+06 | | SQL/JSON: Various improvements (32,32) | 2.051e+06 | +0.91 % | Optimise numeric multiplicatio (32,32) | 2.013e+06 | -0.95 % | Use diff's --strip-trailing-cr (32,32) | 2.034e+06 | +0.06 % | Improve the numeric width_buck (32,32) | 2.048e+06 | +0.75 % | Add missing pointer dereferenc (32,32) | 1.807e+06 | -11.10 % | Extend mul_var_short() to 5 an (32,32) | 3.309e+06 | +62.80 % | Optimise numeric multiplicatio (32,64) | 1.382e+06 | | SQL/JSON: Various improvements (32,64) | 1.344e+06 | -2.75 % | Optimise numeric multiplicatio (32,64) | 1.356e+06 | -1.89 % | Use diff's --strip-trailing-cr (32,64) | 1.370e+06 | -0.88 % | Improve the numeric width_buck (32,64) | 1.394e+06 | +0.84 % | Add missing pointer dereferenc (32,64) | 1.165e+06 | -15.71 % | Extend mul_var_short() to 5 an (32,64) | 2.340e+06 | +69.33 % | Optimise numeric multiplicatio (32,128) | 8.215e+05 | | SQL/JSON: Various improvements (32,128) | 8.368e+05 | +1.87 % | Optimise numeric multiplicatio (32,128) | 8.372e+05 | +1.90 % | Use diff's --strip-trailing-cr (32,128) | 8.154e+05 | -0.75 % | Improve the numeric width_buck (32,128) | 8.291e+05 | +0.92 % | Add missing pointer dereferenc (32,128) | 7.009e+05 | -14.68 % | Extend mul_var_short() to 5 an (32,128) | 1.393e+06 | +69.61 % | Optimise numeric multiplicatio (32,256) | 4.550e+05 | | SQL/JSON: Various improvements (32,256) | 4.596e+05 | +1.01 % | Optimise numeric multiplicatio (32,256) | 4.724e+05 | +3.84 % | Use diff's --strip-trailing-cr (32,256) | 4.598e+05 | +1.07 % | Improve the numeric width_buck (32,256) | 4.677e+05 | +2.81 % | Add missing pointer dereferenc (32,256) | 4.115e+05 | -9.56 % | Extend mul_var_short() to 5 an (32,256) | 8.199e+05 | +80.22 % | Optimise numeric multiplicatio (32,512) | 2.350e+05 | | SQL/JSON: Various improvements (32,512) | 2.277e+05 | -3.09 % | Optimise numeric multiplicatio (32,512) | 2.250e+05 | -4.23 % | Use diff's --strip-trailing-cr (32,512) | 2.290e+05 | -2.53 % | Improve the numeric width_buck (32,512) | 2.214e+05 | -5.76 % | Add missing pointer dereferenc (32,512) | 2.126e+05 | -9.52 % | Extend mul_var_short() to 5 an (32,512) | 4.135e+05 | +75.99 % | Optimise numeric multiplicatio (32,1024) | 1.189e+05 | | SQL/JSON: Various improvements (32,1024) | 1.222e+05 | +2.75 % | Optimise numeric multiplicatio (32,1024) | 1.218e+05 | +2.46 % | Use diff's --strip-trailing-cr (32,1024) | 1.243e+05 | +4.56 % | Improve the numeric width_buck (32,1024) | 1.219e+05 | +2.53 % | Add missing pointer dereferenc (32,1024) | 1.187e+05 | -0.19 % | Extend mul_var_short() to 5 an (32,1024) | 2.153e+05 | +81.09 % | Optimise numeric multiplicatio (32,2048) | 5.867e+04 | | SQL/JSON: Various improvements (32,2048) | 5.829e+04 | -0.64 % | Optimise numeric multiplicatio (32,2048) | 5.943e+04 | +1.30 % | Use diff's --strip-trailing-cr (32,2048) | 5.863e+04 | -0.05 % | Improve the numeric width_buck (32,2048) | 5.811e+04 | -0.95 % | Add missing pointer dereferenc (32,2048) | 6.030e+04 | +2.78 % | Extend mul_var_short() to 5 an (32,2048) | 1.050e+05 | +79.02 % | Optimise numeric multiplicatio (32,4096) | 3.015e+04 | | SQL/JSON: Various improvements (32,4096) | 3.045e+04 | +1.01 % | Optimise numeric multiplicatio (32,4096) | 2.990e+04 | -0.81 % | Use diff's --strip-trailing-cr (32,4096) | 2.991e+04 | -0.78 % | Improve the numeric width_buck (32,4096) | 3.044e+04 | +0.96 % | Add missing pointer dereferenc (32,4096) | 3.046e+04 | +1.03 % | Extend mul_var_short() to 5 an (32,4096) | 5.518e+04 | +83.03 % | Optimise numeric multiplicatio (32,8192) | 1.360e+04 | | SQL/JSON: Various improvements (32,8192) | 1.336e+04 | -1.74 % | Optimise numeric multiplicatio (32,8192) | 1.349e+04 | -0.80 % | Use diff's --strip-trailing-cr (32,8192) | 1.400e+04 | +2.93 % | Improve the numeric width_buck (32,8192) | 1.398e+04 | +2.76 % | Add missing pointer dereferenc (32,8192) | 1.347e+04 | -0.96 % | Extend mul_var_short() to 5 an (32,8192) | 2.423e+04 | +78.16 % | Optimise numeric multiplicatio (32,16384) | 6.732e+03 | | SQL/JSON: Various improvements (32,16384) | 6.688e+03 | -0.65 % | Optimise numeric multiplicatio (32,16384) | 7.033e+03 | +4.49 % | Use diff's --strip-trailing-cr (32,16384) | 6.688e+03 | -0.65 % | Improve the numeric width_buck (32,16384) | 6.868e+03 | +2.02 % | Add missing pointer dereferenc (32,16384) | 6.929e+03 | +2.94 % | Extend mul_var_short() to 5 an (32,16384) | 1.193e+04 | +77.20 % | Optimise numeric multiplicatio (64,64) | 7.035e+05 | | SQL/JSON: Various improvements (64,64) | 6.919e+05 | -1.65 % | Optimise numeric multiplicatio (64,64) | 6.896e+05 | -1.98 % | Use diff's --strip-trailing-cr (64,64) | 6.838e+05 | -2.81 % | Improve the numeric width_buck (64,64) | 7.163e+05 | +1.82 % | Add missing pointer dereferenc (64,64) | 5.491e+05 | -21.95 % | Extend mul_var_short() to 5 an (64,64) | 1.455e+06 | +106.74 % | Optimise numeric multiplicatio (64,128) | 4.060e+05 | | SQL/JSON: Various improvements (64,128) | 3.897e+05 | -4.01 % | Optimise numeric multiplicatio (64,128) | 3.858e+05 | -4.97 % | Use diff's --strip-trailing-cr (64,128) | 3.977e+05 | -2.03 % | Improve the numeric width_buck (64,128) | 3.954e+05 | -2.61 % | Add missing pointer dereferenc (64,128) | 3.391e+05 | -16.48 % | Extend mul_var_short() to 5 an (64,128) | 9.534e+05 | +134.85 % | Optimise numeric multiplicatio (64,256) | 2.412e+05 | | SQL/JSON: Various improvements (64,256) | 2.394e+05 | -0.77 % | Optimise numeric multiplicatio (64,256) | 2.441e+05 | +1.19 % | Use diff's --strip-trailing-cr (64,256) | 2.393e+05 | -0.81 % | Improve the numeric width_buck (64,256) | 2.463e+05 | +2.10 % | Add missing pointer dereferenc (64,256) | 2.170e+05 | -10.05 % | Extend mul_var_short() to 5 an (64,256) | 5.368e+05 | +122.53 % | Optimise numeric multiplicatio (64,512) | 1.163e+05 | | SQL/JSON: Various improvements (64,512) | 1.174e+05 | +0.94 % | Optimise numeric multiplicatio (64,512) | 1.172e+05 | +0.79 % | Use diff's --strip-trailing-cr (64,512) | 1.195e+05 | +2.75 % | Improve the numeric width_buck (64,512) | 1.199e+05 | +3.10 % | Add missing pointer dereferenc (64,512) | 1.116e+05 | -4.07 % | Extend mul_var_short() to 5 an (64,512) | 2.836e+05 | +143.79 % | Optimise numeric multiplicatio (64,1024) | 6.084e+04 | | SQL/JSON: Various improvements (64,1024) | 6.026e+04 | -0.96 % | Optimise numeric multiplicatio (64,1024) | 5.970e+04 | -1.87 % | Use diff's --strip-trailing-cr (64,1024) | 5.911e+04 | -2.85 % | Improve the numeric width_buck (64,1024) | 5.913e+04 | -2.81 % | Add missing pointer dereferenc (64,1024) | 5.920e+04 | -2.69 % | Extend mul_var_short() to 5 an (64,1024) | 1.411e+05 | +131.88 % | Optimise numeric multiplicatio (64,2048) | 3.163e+04 | | SQL/JSON: Various improvements (64,2048) | 3.102e+04 | -1.91 % | Optimise numeric multiplicatio (64,2048) | 3.105e+04 | -1.81 % | Use diff's --strip-trailing-cr (64,2048) | 3.106e+04 | -1.79 % | Improve the numeric width_buck (64,2048) | 3.078e+04 | -2.69 % | Add missing pointer dereferenc (64,2048) | 3.077e+04 | -2.72 % | Extend mul_var_short() to 5 an (64,2048) | 7.339e+04 | +132.04 % | Optimise numeric multiplicatio (64,4096) | 1.619e+04 | | SQL/JSON: Various improvements (64,4096) | 1.604e+04 | -0.95 % | Optimise numeric multiplicatio (64,4096) | 1.561e+04 | -3.60 % | Use diff's --strip-trailing-cr (64,4096) | 1.561e+04 | -3.60 % | Improve the numeric width_buck (64,4096) | 1.634e+04 | +0.92 % | Add missing pointer dereferenc (64,4096) | 1.618e+04 | -0.05 % | Extend mul_var_short() to 5 an (64,4096) | 3.784e+04 | +133.70 % | Optimise numeric multiplicatio (64,8192) | 7.097e+03 | | SQL/JSON: Various improvements (64,8192) | 7.160e+03 | +0.90 % | Optimise numeric multiplicatio (64,8192) | 7.165e+03 | +0.97 % | Use diff's --strip-trailing-cr (64,8192) | 7.032e+03 | -0.90 % | Improve the numeric width_buck (64,8192) | 7.094e+03 | -0.04 % | Add missing pointer dereferenc (64,8192) | 7.431e+03 | +4.71 % | Extend mul_var_short() to 5 an (64,8192) | 1.593e+04 | +124.42 % | Optimise numeric multiplicatio (64,16384) | 3.557e+03 | | SQL/JSON: Various improvements (64,16384) | 3.519e+03 | -1.07 % | Optimise numeric multiplicatio (64,16384) | 3.520e+03 | -1.06 % | Use diff's --strip-trailing-cr (64,16384) | 3.519e+03 | -1.08 % | Improve the numeric width_buck (64,16384) | 3.587e+03 | +0.84 % | Add missing pointer dereferenc (64,16384) | 3.583e+03 | +0.71 % | Extend mul_var_short() to 5 an (64,16384) | 7.995e+03 | +124.76 % | Optimise numeric multiplicatio (128,128) | 2.134e+05 | | SQL/JSON: Various improvements (128,128) | 2.192e+05 | +2.75 % | Optimise numeric multiplicatio (128,128) | 2.175e+05 | +1.96 % | Use diff's --strip-trailing-cr (128,128) | 2.136e+05 | +0.11 % | Improve the numeric width_buck (128,128) | 2.130e+05 | -0.16 % | Add missing pointer dereferenc (128,128) | 1.831e+05 | -14.18 % | Extend mul_var_short() to 5 an (128,128) | 5.572e+05 | +161.13 % | Optimise numeric multiplicatio (128,256) | 1.303e+05 | | SQL/JSON: Various improvements (128,256) | 1.327e+05 | +1.89 % | Optimise numeric multiplicatio (128,256) | 1.291e+05 | -0.87 % | Use diff's --strip-trailing-cr (128,256) | 1.335e+05 | +2.51 % | Improve the numeric width_buck (128,256) | 1.291e+05 | -0.89 % | Add missing pointer dereferenc (128,256) | 1.176e+05 | -9.69 % | Extend mul_var_short() to 5 an (128,256) | 3.317e+05 | +154.62 % | Optimise numeric multiplicatio (128,512) | 7.007e+04 | | SQL/JSON: Various improvements (128,512) | 6.934e+04 | -1.03 % | Optimise numeric multiplicatio (128,512) | 6.976e+04 | -0.45 % | Use diff's --strip-trailing-cr (128,512) | 6.872e+04 | -1.93 % | Improve the numeric width_buck (128,512) | 6.662e+04 | -4.92 % | Add missing pointer dereferenc (128,512) | 6.579e+04 | -6.10 % | Extend mul_var_short() to 5 an (128,512) | 1.824e+05 | +160.38 % | Optimise numeric multiplicatio (128,1024) | 3.443e+04 | | SQL/JSON: Various improvements (128,1024) | 3.350e+04 | -2.70 % | Optimise numeric multiplicatio (128,1024) | 3.481e+04 | +1.11 % | Use diff's --strip-trailing-cr (128,1024) | 3.378e+04 | -1.89 % | Improve the numeric width_buck (128,1024) | 3.440e+04 | -0.10 % | Add missing pointer dereferenc (128,1024) | 3.379e+04 | -1.86 % | Extend mul_var_short() to 5 an (128,1024) | 8.564e+04 | +148.74 % | Optimise numeric multiplicatio (128,2048) | 1.667e+04 | | SQL/JSON: Various improvements (128,2048) | 1.683e+04 | +0.95 % | Optimise numeric multiplicatio (128,2048) | 1.685e+04 | +1.06 % | Use diff's --strip-trailing-cr (128,2048) | 1.639e+04 | -1.73 % | Improve the numeric width_buck (128,2048) | 1.687e+04 | +1.16 % | Add missing pointer dereferenc (128,2048) | 1.685e+04 | +1.05 % | Extend mul_var_short() to 5 an (128,2048) | 4.560e+04 | +173.45 % | Optimise numeric multiplicatio (128,4096) | 8.790e+03 | | SQL/JSON: Various improvements (128,4096) | 8.799e+03 | +0.10 % | Optimise numeric multiplicatio (128,4096) | 8.788e+03 | -0.03 % | Use diff's --strip-trailing-cr (128,4096) | 8.966e+03 | +2.00 % | Improve the numeric width_buck (128,4096) | 9.210e+03 | +4.78 % | Add missing pointer dereferenc (128,4096) | 8.635e+03 | -1.76 % | Extend mul_var_short() to 5 an (128,4096) | 2.281e+04 | +159.53 % | Optimise numeric multiplicatio (128,8192) | 3.853e+03 | | SQL/JSON: Various improvements (128,8192) | 3.920e+03 | +1.74 % | Optimise numeric multiplicatio (128,8192) | 3.929e+03 | +1.96 % | Use diff's --strip-trailing-cr (128,8192) | 3.853e+03 | 0.00 % | Improve the numeric width_buck (128,8192) | 3.883e+03 | +0.79 % | Add missing pointer dereferenc (128,8192) | 3.851e+03 | -0.06 % | Extend mul_var_short() to 5 an (128,8192) | 9.636e+03 | +150.08 % | Optimise numeric multiplicatio (128,16384) | 1.859e+03 | | SQL/JSON: Various improvements (128,16384) | 1.892e+03 | +1.80 % | Optimise numeric multiplicatio (128,16384) | 1.876e+03 | +0.92 % | Use diff's --strip-trailing-cr (128,16384) | 1.891e+03 | +1.71 % | Improve the numeric width_buck (128,16384) | 1.893e+03 | +1.83 % | Add missing pointer dereferenc (128,16384) | 1.857e+03 | -0.09 % | Extend mul_var_short() to 5 an (128,16384) | 4.837e+03 | +160.19 % | Optimise numeric multiplicatio (256,256) | 5.756e+04 | | SQL/JSON: Various improvements (256,256) | 6.032e+04 | +4.78 % | Optimise numeric multiplicatio (256,256) | 5.920e+04 | +2.84 % | Use diff's --strip-trailing-cr (256,256) | 5.874e+04 | +2.04 % | Improve the numeric width_buck (256,256) | 5.813e+04 | +0.99 % | Add missing pointer dereferenc (256,256) | 5.270e+04 | -8.45 % | Extend mul_var_short() to 5 an (256,256) | 1.739e+05 | +202.12 % | Optimise numeric multiplicatio (256,512) | 3.266e+04 | | SQL/JSON: Various improvements (256,512) | 3.261e+04 | -0.14 % | Optimise numeric multiplicatio (256,512) | 3.420e+04 | +4.73 % | Use diff's --strip-trailing-cr (256,512) | 3.325e+04 | +1.80 % | Improve the numeric width_buck (256,512) | 3.127e+04 | -4.25 % | Add missing pointer dereferenc (256,512) | 3.081e+04 | -5.64 % | Extend mul_var_short() to 5 an (256,512) | 1.019e+05 | +212.01 % | Optimise numeric multiplicatio (256,1024) | 1.719e+04 | | SQL/JSON: Various improvements (256,1024) | 1.767e+04 | +2.83 % | Optimise numeric multiplicatio (256,1024) | 1.735e+04 | +0.93 % | Use diff's --strip-trailing-cr (256,1024) | 1.785e+04 | +3.86 % | Improve the numeric width_buck (256,1024) | 1.750e+04 | +1.80 % | Add missing pointer dereferenc (256,1024) | 1.718e+04 | -0.03 % | Extend mul_var_short() to 5 an (256,1024) | 4.776e+04 | +177.91 % | Optimise numeric multiplicatio (256,2048) | 8.793e+03 | | SQL/JSON: Various improvements (256,2048) | 8.750e+03 | -0.50 % | Optimise numeric multiplicatio (256,2048) | 8.587e+03 | -2.34 % | Use diff's --strip-trailing-cr (256,2048) | 8.712e+03 | -0.93 % | Improve the numeric width_buck (256,2048) | 8.551e+03 | -2.76 % | Add missing pointer dereferenc (256,2048) | 8.878e+03 | +0.96 % | Extend mul_var_short() to 5 an (256,2048) | 2.627e+04 | +198.77 % | Optimise numeric multiplicatio (256,4096) | 4.370e+03 | | SQL/JSON: Various improvements (256,4096) | 4.411e+03 | +0.92 % | Optimise numeric multiplicatio (256,4096) | 4.371e+03 | +0.02 % | Use diff's --strip-trailing-cr (256,4096) | 4.403e+03 | +0.76 % | Improve the numeric width_buck (256,4096) | 4.532e+03 | +3.70 % | Add missing pointer dereferenc (256,4096) | 4.583e+03 | +4.86 % | Extend mul_var_short() to 5 an (256,4096) | 1.320e+04 | +202.00 % | Optimise numeric multiplicatio (256,8192) | 1.963e+03 | | SQL/JSON: Various improvements (256,8192) | 1.956e+03 | -0.38 % | Optimise numeric multiplicatio (256,8192) | 1.938e+03 | -1.29 % | Use diff's --strip-trailing-cr (256,8192) | 1.957e+03 | -0.32 % | Improve the numeric width_buck (256,8192) | 1.942e+03 | -1.09 % | Add missing pointer dereferenc (256,8192) | 2.013e+03 | +2.53 % | Extend mul_var_short() to 5 an (256,8192) | 5.266e+03 | +168.21 % | Optimise numeric multiplicatio (256,16384) | 9.950e+02 | | SQL/JSON: Various improvements (256,16384) | 9.936e+02 | -0.15 % | Optimise numeric multiplicatio (256,16384) | 9.752e+02 | -2.00 % | Use diff's --strip-trailing-cr (256,16384) | 9.926e+02 | -0.24 % | Improve the numeric width_buck (256,16384) | 9.841e+02 | -1.10 % | Add missing pointer dereferenc (256,16384) | 1.011e+03 | +1.61 % | Extend mul_var_short() to 5 an (256,16384) | 2.661e+03 | +167.42 % | Optimise numeric multiplicatio (512,512) | 1.626e+04 | | SQL/JSON: Various improvements (512,512) | 1.602e+04 | -1.49 % | Optimise numeric multiplicatio (512,512) | 1.618e+04 | -0.51 % | Use diff's --strip-trailing-cr (512,512) | 1.602e+04 | -1.49 % | Improve the numeric width_buck (512,512) | 1.587e+04 | -2.44 % | Add missing pointer dereferenc (512,512) | 1.548e+04 | -4.79 % | Extend mul_var_short() to 5 an (512,512) | 5.094e+04 | +213.25 % | Optimise numeric multiplicatio (512,1024) | 8.460e+03 | | SQL/JSON: Various improvements (512,1024) | 8.611e+03 | +1.80 % | Optimise numeric multiplicatio (512,1024) | 8.456e+03 | -0.05 % | Use diff's --strip-trailing-cr (512,1024) | 8.381e+03 | -0.93 % | Improve the numeric width_buck (512,1024) | 8.692e+03 | +2.74 % | Add missing pointer dereferenc (512,1024) | 8.381e+03 | -0.93 % | Extend mul_var_short() to 5 an (512,1024) | 2.679e+04 | +216.68 % | Optimise numeric multiplicatio (512,2048) | 4.358e+03 | | SQL/JSON: Various improvements (512,2048) | 4.485e+03 | +2.91 % | Optimise numeric multiplicatio (512,2048) | 4.324e+03 | -0.78 % | Use diff's --strip-trailing-cr (512,2048) | 4.323e+03 | -0.81 % | Improve the numeric width_buck (512,2048) | 4.361e+03 | +0.06 % | Add missing pointer dereferenc (512,2048) | 4.407e+03 | +1.12 % | Extend mul_var_short() to 5 an (512,2048) | 1.406e+04 | +222.72 % | Optimise numeric multiplicatio (512,4096) | 2.210e+03 | | SQL/JSON: Various improvements (512,4096) | 2.271e+03 | +2.75 % | Optimise numeric multiplicatio (512,4096) | 2.251e+03 | +1.85 % | Use diff's --strip-trailing-cr (512,4096) | 2.229e+03 | +0.84 % | Improve the numeric width_buck (512,4096) | 2.210e+03 | -0.01 % | Add missing pointer dereferenc (512,4096) | 2.231e+03 | +0.94 % | Extend mul_var_short() to 5 an (512,4096) | 7.011e+03 | +217.25 % | Optimise numeric multiplicatio (512,8192) | 1.020e+03 | | SQL/JSON: Various improvements (512,8192) | 1.031e+03 | +1.02 % | Optimise numeric multiplicatio (512,8192) | 1.012e+03 | -0.83 % | Use diff's --strip-trailing-cr (512,8192) | 1.051e+03 | +3.05 % | Improve the numeric width_buck (512,8192) | 9.928e+02 | -2.69 % | Add missing pointer dereferenc (512,8192) | 1.030e+03 | +0.92 % | Extend mul_var_short() to 5 an (512,8192) | 2.871e+03 | +181.41 % | Optimise numeric multiplicatio (512,16384) | 5.121e+02 | | SQL/JSON: Various improvements (512,16384) | 5.084e+02 | -0.72 % | Optimise numeric multiplicatio (512,16384) | 5.032e+02 | -1.72 % | Use diff's --strip-trailing-cr (512,16384) | 5.034e+02 | -1.68 % | Improve the numeric width_buck (512,16384) | 5.075e+02 | -0.88 % | Add missing pointer dereferenc (512,16384) | 4.952e+02 | -3.28 % | Extend mul_var_short() to 5 an (512,16384) | 1.397e+03 | +172.76 % | Optimise numeric multiplicatio (1024,1024) | 4.230e+03 | | SQL/JSON: Various improvements (1024,1024) | 4.164e+03 | -1.56 % | Optimise numeric multiplicatio (1024,1024) | 4.192e+03 | -0.91 % | Use diff's --strip-trailing-cr (1024,1024) | 4.134e+03 | -2.29 % | Improve the numeric width_buck (1024,1024) | 4.115e+03 | -2.73 % | Add missing pointer dereferenc (1024,1024) | 4.230e+03 | 0.00 % | Extend mul_var_short() to 5 an (1024,1024) | 1.372e+04 | +224.40 % | Optimise numeric multiplicatio (1024,2048) | 2.179e+03 | | SQL/JSON: Various improvements (1024,2048) | 2.206e+03 | +1.28 % | Optimise numeric multiplicatio (1024,2048) | 2.198e+03 | +0.91 % | Use diff's --strip-trailing-cr (1024,2048) | 2.179e+03 | +0.03 % | Improve the numeric width_buck (1024,2048) | 2.239e+03 | +2.79 % | Add missing pointer dereferenc (1024,2048) | 2.278e+03 | +4.59 % | Extend mul_var_short() to 5 an (1024,2048) | 7.093e+03 | +225.60 % | Optimise numeric multiplicatio (1024,4096) | 1.124e+03 | | SQL/JSON: Various improvements (1024,4096) | 1.124e+03 | +0.01 % | Optimise numeric multiplicatio (1024,4096) | 1.125e+03 | +0.05 % | Use diff's --strip-trailing-cr (1024,4096) | 1.111e+03 | -1.22 % | Improve the numeric width_buck (1024,4096) | 1.135e+03 | +0.95 % | Add missing pointer dereferenc (1024,4096) | 1.146e+03 | +1.91 % | Extend mul_var_short() to 5 an (1024,4096) | 3.714e+03 | +230.29 % | Optimise numeric multiplicatio (1024,8192) | 5.069e+02 | | SQL/JSON: Various improvements (1024,8192) | 5.087e+02 | +0.35 % | Optimise numeric multiplicatio (1024,8192) | 5.178e+02 | +2.14 % | Use diff's --strip-trailing-cr (1024,8192) | 5.132e+02 | +1.24 % | Improve the numeric width_buck (1024,8192) | 5.163e+02 | +1.85 % | Add missing pointer dereferenc (1024,8192) | 5.123e+02 | +1.06 % | Extend mul_var_short() to 5 an (1024,8192) | 1.449e+03 | +185.92 % | Optimise numeric multiplicatio (1024,16384) | 2.534e+02 | | SQL/JSON: Various improvements (1024,16384) | 2.489e+02 | -1.80 % | Optimise numeric multiplicatio (1024,16384) | 2.559e+02 | +0.98 % | Use diff's --strip-trailing-cr (1024,16384) | 2.559e+02 | +0.97 % | Improve the numeric width_buck (1024,16384) | 2.556e+02 | +0.88 % | Add missing pointer dereferenc (1024,16384) | 2.465e+02 | -2.72 % | Extend mul_var_short() to 5 an (1024,16384) | 7.249e+02 | +186.04 % | Optimise numeric multiplicatio (2048,2048) | 1.082e+03 | | SQL/JSON: Various improvements (2048,2048) | 1.097e+03 | +1.39 % | Optimise numeric multiplicatio (2048,2048) | 1.083e+03 | +0.16 % | Use diff's --strip-trailing-cr (2048,2048) | 1.076e+03 | -0.54 % | Improve the numeric width_buck (2048,2048) | 1.071e+03 | -0.95 % | Add missing pointer dereferenc (2048,2048) | 1.092e+03 | +0.95 % | Extend mul_var_short() to 5 an (2048,2048) | 3.709e+03 | +242.92 % | Optimise numeric multiplicatio (2048,4096) | 5.609e+02 | | SQL/JSON: Various improvements (2048,4096) | 5.522e+02 | -1.55 % | Optimise numeric multiplicatio (2048,4096) | 5.572e+02 | -0.66 % | Use diff's --strip-trailing-cr (2048,4096) | 5.525e+02 | -1.49 % | Improve the numeric width_buck (2048,4096) | 5.577e+02 | -0.57 % | Add missing pointer dereferenc (2048,4096) | 5.624e+02 | +0.26 % | Extend mul_var_short() to 5 an (2048,4096) | 1.889e+03 | +236.76 % | Optimise numeric multiplicatio (2048,8192) | 2.505e+02 | | SQL/JSON: Various improvements (2048,8192) | 2.529e+02 | +0.96 % | Optimise numeric multiplicatio (2048,8192) | 2.482e+02 | -0.91 % | Use diff's --strip-trailing-cr (2048,8192) | 2.526e+02 | +0.83 % | Improve the numeric width_buck (2048,8192) | 2.510e+02 | +0.20 % | Add missing pointer dereferenc (2048,8192) | 2.606e+02 | +4.03 % | Extend mul_var_short() to 5 an (2048,8192) | 7.282e+02 | +190.68 % | Optimise numeric multiplicatio (2048,16384) | 1.262e+02 | | SQL/JSON: Various improvements (2048,16384) | 1.289e+02 | +2.18 % | Optimise numeric multiplicatio (2048,16384) | 1.272e+02 | +0.83 % | Use diff's --strip-trailing-cr (2048,16384) | 1.253e+02 | -0.64 % | Improve the numeric width_buck (2048,16384) | 1.289e+02 | +2.17 % | Add missing pointer dereferenc (2048,16384) | 1.313e+02 | +4.10 % | Extend mul_var_short() to 5 an (2048,16384) | 3.616e+02 | +186.60 % | Optimise numeric multiplicatio (4096,4096) | 2.670e+02 | | SQL/JSON: Various improvements (4096,4096) | 2.695e+02 | +0.93 % | Optimise numeric multiplicatio (4096,4096) | 2.747e+02 | +2.87 % | Use diff's --strip-trailing-cr (4096,4096) | 2.695e+02 | +0.94 % | Improve the numeric width_buck (4096,4096) | 2.720e+02 | +1.87 % | Add missing pointer dereferenc (4096,4096) | 2.716e+02 | +1.73 % | Extend mul_var_short() to 5 an (4096,4096) | 9.636e+02 | +260.88 % | Optimise numeric multiplicatio (4096,8192) | 1.241e+02 | | SQL/JSON: Various improvements (4096,8192) | 1.253e+02 | +0.93 % | Optimise numeric multiplicatio (4096,8192) | 1.229e+02 | -0.99 % | Use diff's --strip-trailing-cr (4096,8192) | 1.264e+02 | +1.88 % | Improve the numeric width_buck (4096,8192) | 1.252e+02 | +0.90 % | Add missing pointer dereferenc (4096,8192) | 1.240e+02 | -0.10 % | Extend mul_var_short() to 5 an (4096,8192) | 3.785e+02 | +205.02 % | Optimise numeric multiplicatio (4096,16384) | 6.437e+01 | | SQL/JSON: Various improvements (4096,16384) | 6.216e+01 | -3.43 % | Optimise numeric multiplicatio (4096,16384) | 6.221e+01 | -3.36 % | Use diff's --strip-trailing-cr (4096,16384) | 6.249e+01 | -2.91 % | Improve the numeric width_buck (4096,16384) | 6.285e+01 | -2.36 % | Add missing pointer dereferenc (4096,16384) | 6.276e+01 | -2.50 % | Extend mul_var_short() to 5 an (4096,16384) | 1.832e+02 | +184.59 % | Optimise numeric multiplicatio (8192,8192) | 6.047e+01 | | SQL/JSON: Various improvements (8192,8192) | 6.052e+01 | +0.09 % | Optimise numeric multiplicatio (8192,8192) | 5.996e+01 | -0.84 % | Use diff's --strip-trailing-cr (8192,8192) | 6.059e+01 | +0.21 % | Improve the numeric width_buck (8192,8192) | 5.863e+01 | -3.03 % | Add missing pointer dereferenc (8192,8192) | 6.115e+01 | +1.13 % | Extend mul_var_short() to 5 an (8192,8192) | 1.858e+02 | +207.25 % | Optimise numeric multiplicatio (8192,16384) | 3.197e+01 | | SQL/JSON: Various improvements (8192,16384) | 3.092e+01 | -3.29 % | Optimise numeric multiplicatio (8192,16384) | 3.101e+01 | -3.01 % | Use diff's --strip-trailing-cr (8192,16384) | 3.151e+01 | -1.44 % | Improve the numeric width_buck (8192,16384) | 3.055e+01 | -4.47 % | Add missing pointer dereferenc (8192,16384) | 3.095e+01 | -3.19 % | Extend mul_var_short() to 5 an (8192,16384) | 9.386e+01 | +193.53 % | Optimise numeric multiplicatio (16384,16384) | 1.518e+01 | | SQL/JSON: Various improvements (16384,16384) | 1.497e+01 | -1.38 % | Optimise numeric multiplicatio (16384,16384) | 1.476e+01 | -2.78 % | Use diff's --strip-trailing-cr (16384,16384) | 1.486e+01 | -2.07 % | Improve the numeric width_buck (16384,16384) | 1.500e+01 | -1.20 % | Add missing pointer dereferenc (16384,16384) | 1.490e+01 | -1.84 % | Extend mul_var_short() to 5 an (16384,16384) | 4.693e+01 | +209.15 % | Optimise numeric multiplicatio /Joel
On Mon, Jul 29, 2024, at 02:23, Joel Jacobson wrote: > Then, I've used sched_setaffinity() from <sched.h> to ensure the > benchmark run on CPU core id 31. I fixed a bug in my measure function, I had forgot to reset affinity after each benchmark, so the PostgreSQL backend continued to use the core even after numeric_mul had finished. New results with less noise below. Pardon the exceeding of 80 chars line width, but felt important to include commit hash and relative delta. ndigits | rate | change | accum | commit | summary ---------------+------------+-----------+-----------+---------+---------------------------------------------------- (1,1) | 1.639e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,1) | 2.248e+07 | +37.16 % | +37.16 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,1) | 2.333e+07 | +3.77 % | +42.32 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,1) | 2.291e+07 | -1.81 % | +39.75 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,1) | 2.276e+07 | -0.64 % | +38.86 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,1) | 2.256e+07 | -0.86 % | +37.66 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,1) | 2.182e+07 | -3.32 % | +33.09 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,2) | 1.640e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,2) | 2.202e+07 | +34.28 % | +34.28 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,2) | 2.214e+07 | +0.58 % | +35.06 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,2) | 2.173e+07 | -1.85 % | +32.55 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,2) | 2.260e+07 | +3.98 % | +37.83 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,2) | 2.233e+07 | -1.19 % | +36.19 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,2) | 2.144e+07 | -3.97 % | +30.79 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,3) | 1.511e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,3) | 2.179e+07 | +44.20 % | +44.20 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,3) | 2.134e+07 | -2.05 % | +41.24 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,3) | 2.198e+07 | +2.99 % | +45.47 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,3) | 2.190e+07 | -0.39 % | +44.91 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,3) | 2.164e+07 | -1.16 % | +43.23 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,3) | 2.104e+07 | -2.79 % | +39.24 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,4) | 1.494e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,4) | 2.132e+07 | +42.71 % | +42.71 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,4) | 2.151e+07 | +0.91 % | +44.00 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,4) | 2.190e+07 | +1.82 % | +46.62 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,4) | 2.172e+07 | -0.82 % | +45.41 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,4) | 2.112e+07 | -2.75 % | +41.41 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,4) | 2.077e+07 | -1.67 % | +39.05 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,8) | 1.444e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,8) | 2.063e+07 | +42.85 % | +42.85 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,8) | 1.996e+07 | -3.25 % | +38.21 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,8) | 2.039e+07 | +2.12 % | +41.14 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,8) | 2.020e+07 | -0.89 % | +39.87 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,8) | 1.934e+07 | -4.28 % | +33.89 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,8) | 1.948e+07 | +0.73 % | +34.87 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,16) | 9.614e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,16) | 1.215e+07 | +26.37 % | +26.37 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,16) | 1.223e+07 | +0.68 % | +27.23 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,16) | 1.251e+07 | +2.26 % | +30.11 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,16) | 1.236e+07 | -1.17 % | +28.58 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,16) | 1.293e+07 | +4.62 % | +34.53 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,16) | 1.240e+07 | -4.16 % | +28.94 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,32) | 5.675e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,32) | 8.241e+06 | +45.22 % | +45.22 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,32) | 8.303e+06 | +0.74 % | +46.30 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,32) | 8.352e+06 | +0.60 % | +47.17 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,32) | 8.200e+06 | -1.82 % | +44.49 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,32) | 8.100e+06 | -1.22 % | +42.73 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,32) | 8.313e+06 | +2.62 % | +46.47 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,64) | 3.479e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,64) | 4.763e+06 | +36.91 % | +36.91 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,64) | 4.677e+06 | -1.79 % | +34.46 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,64) | 4.655e+06 | -0.48 % | +33.82 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,64) | 4.716e+06 | +1.31 % | +35.56 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,64) | 4.766e+06 | +1.06 % | +37.00 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,64) | 4.795e+06 | +0.61 % | +37.84 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,128) | 1.879e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,128) | 2.458e+06 | +30.81 % | +30.81 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,128) | 2.479e+06 | +0.88 % | +31.97 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,128) | 2.483e+06 | +0.16 % | +32.18 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,128) | 2.555e+06 | +2.90 % | +36.01 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,128) | 2.461e+06 | -3.70 % | +30.97 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,128) | 2.568e+06 | +4.35 % | +36.67 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,256) | 9.547e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,256) | 1.310e+06 | +37.20 % | +37.20 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,256) | 1.302e+06 | -0.59 % | +36.39 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,256) | 1.351e+06 | +3.72 % | +41.47 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,256) | 1.325e+06 | -1.88 % | +38.81 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,256) | 1.338e+06 | +0.95 % | +40.13 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,256) | 1.370e+06 | +2.44 % | +43.55 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,512) | 4.999e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,512) | 6.564e+05 | +31.31 % | +31.31 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,512) | 6.640e+05 | +1.16 % | +32.83 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,512) | 6.573e+05 | -1.01 % | +31.49 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,512) | 6.759e+05 | +2.83 % | +35.22 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,512) | 6.578e+05 | -2.68 % | +31.59 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,512) | 6.615e+05 | +0.57 % | +32.34 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,1024) | 2.567e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,1024) | 3.342e+05 | +30.17 % | +30.17 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,1024) | 3.343e+05 | +0.04 % | +30.23 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,1024) | 3.435e+05 | +2.76 % | +33.82 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,1024) | 3.408e+05 | -0.81 % | +32.73 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,1024) | 3.441e+05 | +0.98 % | +34.03 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,1024) | 3.340e+05 | -2.95 % | +30.08 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,2048) | 1.256e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,2048) | 1.648e+05 | +31.19 % | +31.19 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,2048) | 1.624e+05 | -1.46 % | +29.27 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,2048) | 1.648e+05 | +1.46 % | +31.16 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,2048) | 1.697e+05 | +2.98 % | +35.06 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,2048) | 1.634e+05 | -3.67 % | +30.10 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,2048) | 1.649e+05 | +0.89 % | +31.27 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,4096) | 6.430e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,4096) | 8.903e+04 | +38.46 % | +38.46 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,4096) | 8.379e+04 | -5.88 % | +30.32 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,4096) | 8.536e+04 | +1.87 % | +32.76 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,4096) | 8.609e+04 | +0.85 % | +33.88 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,4096) | 8.540e+04 | -0.80 % | +32.81 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,4096) | 8.616e+04 | +0.89 % | +34.00 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,8192) | 3.122e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,8192) | 4.227e+04 | +35.41 % | +35.41 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,8192) | 4.149e+04 | -1.85 % | +32.90 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,8192) | 4.221e+04 | +1.73 % | +35.21 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,8192) | 4.262e+04 | +0.97 % | +36.51 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,8192) | 4.188e+04 | -1.74 % | +34.14 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,8192) | 4.147e+04 | -0.96 % | +32.85 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1,16384) | 1.557e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1,16384) | 2.122e+04 | +36.29 % | +36.29 % | ca481d3 | Optimise numeric multiplication for short inputs. (1,16384) | 2.104e+04 | -0.84 % | +35.14 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1,16384) | 2.081e+04 | -1.06 % | +33.70 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1,16384) | 2.065e+04 | -0.80 % | +32.63 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1,16384) | 2.120e+04 | +2.68 % | +36.18 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1,16384) | 2.099e+04 | -1.01 % | +34.80 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,2) | 1.450e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,2) | 2.147e+07 | +48.08 % | +48.08 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,2) | 2.289e+07 | +6.63 % | +57.90 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,2) | 2.296e+07 | +0.29 % | +58.36 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,2) | 2.175e+07 | -5.28 % | +50.00 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,2) | 2.188e+07 | +0.63 % | +50.94 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,2) | 2.138e+07 | -2.33 % | +47.43 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,3) | 1.312e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,3) | 2.127e+07 | +62.10 % | +62.10 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,3) | 2.068e+07 | -2.80 % | +57.57 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,3) | 2.135e+07 | +3.26 % | +62.71 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,3) | 2.207e+07 | +3.38 % | +68.21 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,3) | 2.106e+07 | -4.59 % | +60.49 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,3) | 2.143e+07 | +1.74 % | +63.28 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,4) | 1.387e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,4) | 2.020e+07 | +45.66 % | +45.66 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,4) | 2.000e+07 | -0.96 % | +44.26 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,4) | 2.062e+07 | +3.08 % | +48.70 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,4) | 1.954e+07 | -5.21 % | +40.95 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,4) | 2.057e+07 | +5.25 % | +48.35 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,4) | 1.974e+07 | -4.03 % | +42.37 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,8) | 1.313e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,8) | 1.774e+07 | +35.19 % | +35.19 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,8) | 1.841e+07 | +3.76 % | +40.28 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,8) | 1.854e+07 | +0.67 % | +41.22 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,8) | 1.854e+07 | +0.03 % | +41.26 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,8) | 1.805e+07 | -2.63 % | +37.54 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,8) | 1.792e+07 | -0.76 % | +36.50 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,16) | 9.013e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,16) | 1.207e+07 | +33.91 % | +33.91 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,16) | 1.174e+07 | -2.77 % | +30.20 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,16) | 1.158e+07 | -1.32 % | +28.49 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,16) | 1.193e+07 | +3.04 % | +32.39 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,16) | 1.226e+07 | +2.75 % | +36.03 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,16) | 1.180e+07 | -3.78 % | +30.89 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,32) | 5.716e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,32) | 7.794e+06 | +36.35 % | +36.35 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,32) | 7.784e+06 | -0.12 % | +36.19 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,32) | 7.852e+06 | +0.87 % | +37.37 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,32) | 7.635e+06 | -2.76 % | +33.57 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,32) | 7.882e+06 | +3.24 % | +37.90 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,32) | 8.050e+06 | +2.13 % | +40.84 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,64) | 3.419e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,64) | 4.455e+06 | +30.30 % | +30.30 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,64) | 4.486e+06 | +0.70 % | +31.21 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,64) | 4.498e+06 | +0.27 % | +31.56 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,64) | 4.447e+06 | -1.14 % | +30.06 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,64) | 4.775e+06 | +7.37 % | +39.65 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,64) | 4.596e+06 | -3.75 % | +34.42 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,128) | 1.738e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,128) | 2.363e+06 | +35.95 % | +35.95 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,128) | 2.367e+06 | +0.16 % | +36.17 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,128) | 2.339e+06 | -1.16 % | +34.59 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,128) | 2.340e+06 | +0.05 % | +34.65 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,128) | 2.386e+06 | +1.98 % | +37.31 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,128) | 2.353e+06 | -1.41 % | +35.37 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,256) | 9.229e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,256) | 1.238e+06 | +34.15 % | +34.15 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,256) | 1.274e+06 | +2.92 % | +38.07 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,256) | 1.260e+06 | -1.12 % | +36.52 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,256) | 1.259e+06 | -0.04 % | +36.46 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,256) | 1.247e+06 | -0.98 % | +35.13 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,256) | 1.304e+06 | +4.54 % | +41.26 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,512) | 4.746e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,512) | 6.212e+05 | +30.87 % | +30.87 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,512) | 6.380e+05 | +2.71 % | +34.42 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,512) | 6.546e+05 | +2.59 % | +37.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,512) | 6.306e+05 | -3.65 % | +32.87 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,512) | 6.612e+05 | +4.85 % | +39.31 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,512) | 6.464e+05 | -2.25 % | +36.19 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,1024) | 2.446e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,1024) | 3.160e+05 | +29.22 % | +29.22 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,1024) | 3.278e+05 | +3.72 % | +34.03 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,1024) | 3.185e+05 | -2.85 % | +30.21 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,1024) | 3.190e+05 | +0.17 % | +30.44 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,1024) | 3.348e+05 | +4.94 % | +36.88 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,1024) | 3.260e+05 | -2.62 % | +33.29 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,2048) | 1.226e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,2048) | 1.551e+05 | +26.55 % | +26.55 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,2048) | 1.608e+05 | +3.66 % | +31.18 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,2048) | 1.576e+05 | -1.97 % | +28.60 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,2048) | 1.552e+05 | -1.50 % | +26.66 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,2048) | 1.577e+05 | +1.59 % | +28.67 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,2048) | 1.630e+05 | +3.35 % | +32.99 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,4096) | 6.170e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,4096) | 8.192e+04 | +32.77 % | +32.77 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,4096) | 8.433e+04 | +2.94 % | +36.68 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,4096) | 8.166e+04 | -3.17 % | +32.34 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,4096) | 8.083e+04 | -1.01 % | +31.00 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,4096) | 8.296e+04 | +2.64 % | +34.46 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,4096) | 8.333e+04 | +0.44 % | +35.05 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,8192) | 3.015e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,8192) | 4.013e+04 | +33.09 % | +33.09 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,8192) | 4.006e+04 | -0.16 % | +32.88 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,8192) | 4.087e+04 | +2.01 % | +35.54 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,8192) | 4.010e+04 | -1.87 % | +33.01 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,8192) | 4.027e+04 | +0.42 % | +33.56 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,8192) | 4.090e+04 | +1.57 % | +35.66 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2,16384) | 1.533e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2,16384) | 2.053e+04 | +33.89 % | +33.89 % | ca481d3 | Optimise numeric multiplication for short inputs. (2,16384) | 2.011e+04 | -2.04 % | +31.16 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2,16384) | 2.031e+04 | +1.00 % | +32.48 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2,16384) | 2.012e+04 | -0.96 % | +31.20 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2,16384) | 2.008e+04 | -0.20 % | +30.94 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2,16384) | 2.053e+04 | +2.26 % | +33.90 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,3) | 1.233e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,3) | 2.077e+07 | +68.44 % | +68.44 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,3) | 2.123e+07 | +2.23 % | +72.19 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,3) | 2.061e+07 | -2.90 % | +67.20 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,3) | 2.073e+07 | +0.56 % | +68.14 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,3) | 2.040e+07 | -1.57 % | +65.49 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,3) | 1.912e+07 | -6.30 % | +55.06 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,4) | 1.261e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,4) | 1.918e+07 | +52.08 % | +52.08 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,4) | 1.984e+07 | +3.46 % | +57.34 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,4) | 2.022e+07 | +1.91 % | +60.35 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,4) | 1.932e+07 | -4.48 % | +53.16 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,4) | 1.889e+07 | -2.21 % | +49.78 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,4) | 1.936e+07 | +2.47 % | +53.47 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,8) | 1.243e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,8) | 1.813e+07 | +45.88 % | +45.88 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,8) | 1.755e+07 | -3.20 % | +41.22 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,8) | 1.798e+07 | +2.41 % | +44.62 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,8) | 1.737e+07 | -3.39 % | +39.73 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,8) | 1.716e+07 | -1.20 % | +38.05 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,8) | 1.755e+07 | +2.27 % | +41.19 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,16) | 7.347e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,16) | 1.105e+07 | +50.46 % | +50.46 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,16) | 1.128e+07 | +2.03 % | +53.52 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,16) | 1.101e+07 | -2.36 % | +49.90 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,16) | 1.106e+07 | +0.40 % | +50.50 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,16) | 1.098e+07 | -0.73 % | +49.41 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,16) | 1.157e+07 | +5.41 % | +57.50 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,32) | 5.398e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,32) | 7.399e+06 | +37.08 % | +37.08 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,32) | 7.170e+06 | -3.09 % | +32.85 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,32) | 7.263e+06 | +1.29 % | +34.56 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,32) | 7.283e+06 | +0.27 % | +34.93 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,32) | 7.515e+06 | +3.18 % | +39.22 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,32) | 7.556e+06 | +0.55 % | +39.99 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,64) | 3.279e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,64) | 4.306e+06 | +31.30 % | +31.30 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,64) | 4.180e+06 | -2.94 % | +27.45 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,64) | 4.352e+06 | +4.13 % | +32.72 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,64) | 4.228e+06 | -2.86 % | +28.92 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,64) | 4.320e+06 | +2.18 % | +31.73 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,64) | 4.316e+06 | -0.10 % | +31.60 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,128) | 1.691e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,128) | 2.244e+06 | +32.71 % | +32.71 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,128) | 2.246e+06 | +0.09 % | +32.83 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,128) | 2.239e+06 | -0.29 % | +32.44 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,128) | 2.264e+06 | +1.09 % | +33.89 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,128) | 2.367e+06 | +4.54 % | +39.97 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,128) | 2.359e+06 | -0.32 % | +39.53 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,256) | 8.856e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,256) | 1.205e+06 | +36.04 % | +36.04 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,256) | 1.224e+06 | +1.57 % | +38.17 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,256) | 1.223e+06 | -0.07 % | +38.06 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,256) | 1.191e+06 | -2.60 % | +34.48 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,256) | 1.270e+06 | +6.61 % | +43.37 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,256) | 1.228e+06 | -3.26 % | +38.69 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,512) | 4.637e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,512) | 6.174e+05 | +33.14 % | +33.14 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,512) | 6.080e+05 | -1.53 % | +31.10 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,512) | 6.229e+05 | +2.45 % | +34.31 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,512) | 6.214e+05 | -0.24 % | +33.99 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,512) | 6.296e+05 | +1.33 % | +35.77 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,512) | 6.415e+05 | +1.89 % | +38.33 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,1024) | 2.389e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,1024) | 3.115e+05 | +30.41 % | +30.41 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,1024) | 3.144e+05 | +0.94 % | +31.64 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,1024) | 3.158e+05 | +0.44 % | +32.22 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,1024) | 3.241e+05 | +2.61 % | +35.67 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,1024) | 3.144e+05 | -2.98 % | +31.62 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,1024) | 3.162e+05 | +0.58 % | +32.39 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,2048) | 1.147e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,2048) | 1.549e+05 | +35.02 % | +35.02 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,2048) | 1.568e+05 | +1.25 % | +36.71 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,2048) | 1.519e+05 | -3.13 % | +32.42 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,2048) | 1.526e+05 | +0.44 % | +33.01 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,2048) | 1.567e+05 | +2.72 % | +36.62 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,2048) | 1.563e+05 | -0.28 % | +36.24 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,4096) | 5.982e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,4096) | 7.973e+04 | +33.29 % | +33.29 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,4096) | 8.063e+04 | +1.13 % | +34.80 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,4096) | 8.022e+04 | -0.51 % | +34.11 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,4096) | 8.249e+04 | +2.83 % | +37.90 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,4096) | 8.023e+04 | -2.74 % | +34.12 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,4096) | 8.141e+04 | +1.47 % | +36.09 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,8192) | 2.903e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,8192) | 3.987e+04 | +37.33 % | +37.33 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,8192) | 4.028e+04 | +1.05 % | +38.76 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,8192) | 4.098e+04 | +1.72 % | +41.16 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,8192) | 3.920e+04 | -4.34 % | +35.03 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,8192) | 3.915e+04 | -0.11 % | +34.88 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,8192) | 3.894e+04 | -0.54 % | +34.15 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (3,16384) | 1.448e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (3,16384) | 1.950e+04 | +34.71 % | +34.71 % | ca481d3 | Optimise numeric multiplication for short inputs. (3,16384) | 1.967e+04 | +0.86 % | +35.87 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (3,16384) | 1.949e+04 | -0.95 % | +34.59 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (3,16384) | 1.950e+04 | +0.09 % | +34.71 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (3,16384) | 1.982e+04 | +1.63 % | +36.90 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (3,16384) | 1.973e+04 | -0.46 % | +36.28 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,4) | 1.172e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,4) | 1.941e+07 | +65.61 % | +65.61 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,4) | 2.019e+07 | +4.02 % | +72.27 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,4) | 1.943e+07 | -3.74 % | +65.83 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,4) | 1.863e+07 | -4.15 % | +58.95 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,4) | 1.857e+07 | -0.31 % | +58.46 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,4) | 1.899e+07 | +2.23 % | +61.99 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,8) | 1.213e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,8) | 1.721e+07 | +41.92 % | +41.92 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,8) | 1.709e+07 | -0.67 % | +40.97 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,8) | 1.738e+07 | +1.69 % | +43.35 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,8) | 1.675e+07 | -3.62 % | +38.15 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,8) | 1.659e+07 | -0.97 % | +36.81 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,8) | 1.672e+07 | +0.77 % | +37.87 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,16) | 7.979e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,16) | 1.091e+07 | +36.69 % | +36.69 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,16) | 1.095e+07 | +0.39 % | +37.23 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,16) | 1.089e+07 | -0.54 % | +36.49 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,16) | 1.092e+07 | +0.25 % | +36.83 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,16) | 1.083e+07 | -0.83 % | +35.70 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,16) | 1.061e+07 | -2.00 % | +32.99 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,32) | 5.234e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,32) | 6.820e+06 | +30.30 % | +30.30 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,32) | 6.995e+06 | +2.57 % | +33.65 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,32) | 7.239e+06 | +3.49 % | +38.31 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,32) | 6.980e+06 | -3.57 % | +33.36 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,32) | 7.181e+06 | +2.88 % | +37.20 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,32) | 6.865e+06 | -4.40 % | +31.16 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,64) | 3.222e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,64) | 3.963e+06 | +22.99 % | +22.99 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,64) | 4.018e+06 | +1.39 % | +24.71 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,64) | 3.956e+06 | -1.54 % | +22.78 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,64) | 3.949e+06 | -0.18 % | +22.56 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,64) | 4.069e+06 | +3.05 % | +26.29 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,64) | 3.855e+06 | -5.26 % | +19.65 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,128) | 1.687e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,128) | 2.081e+06 | +23.34 % | +23.34 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,128) | 2.090e+06 | +0.43 % | +23.87 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,128) | 2.132e+06 | +1.99 % | +26.34 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,128) | 2.129e+06 | -0.11 % | +26.21 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,128) | 2.082e+06 | -2.23 % | +23.39 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,128) | 2.098e+06 | +0.77 % | +24.35 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,256) | 8.638e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,256) | 1.094e+06 | +26.67 % | +26.67 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,256) | 1.098e+06 | +0.35 % | +27.11 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,256) | 1.118e+06 | +1.82 % | +29.42 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,256) | 1.107e+06 | -0.94 % | +28.20 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,256) | 1.137e+06 | +2.70 % | +31.66 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,256) | 1.095e+06 | -3.72 % | +26.76 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,512) | 4.400e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,512) | 5.711e+05 | +29.78 % | +29.78 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,512) | 5.725e+05 | +0.25 % | +30.10 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,512) | 5.726e+05 | +0.01 % | +30.12 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,512) | 5.733e+05 | +0.13 % | +30.29 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,512) | 5.655e+05 | -1.36 % | +28.52 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,512) | 5.621e+05 | -0.60 % | +27.74 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,1024) | 2.275e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,1024) | 2.886e+05 | +26.83 % | +26.83 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,1024) | 2.895e+05 | +0.32 % | +27.23 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,1024) | 2.909e+05 | +0.50 % | +27.87 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,1024) | 2.892e+05 | -0.62 % | +27.08 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,1024) | 2.889e+05 | -0.08 % | +26.97 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,1024) | 2.851e+05 | -1.31 % | +25.31 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,2048) | 1.152e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,2048) | 1.431e+05 | +24.25 % | +24.25 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,2048) | 1.395e+05 | -2.54 % | +21.09 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,2048) | 1.421e+05 | +1.93 % | +23.42 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,2048) | 1.448e+05 | +1.88 % | +25.75 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,2048) | 1.426e+05 | -1.56 % | +23.78 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,2048) | 1.405e+05 | -1.42 % | +22.02 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,4096) | 5.760e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,4096) | 7.459e+04 | +29.51 % | +29.51 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,4096) | 7.448e+04 | -0.16 % | +29.30 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,4096) | 7.590e+04 | +1.91 % | +31.77 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,4096) | 7.505e+04 | -1.12 % | +30.30 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,4096) | 7.665e+04 | +2.14 % | +33.08 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,4096) | 7.050e+04 | -8.02 % | +22.40 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,8192) | 2.765e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,8192) | 3.634e+04 | +31.44 % | +31.44 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,8192) | 3.666e+04 | +0.87 % | +32.59 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,8192) | 3.593e+04 | -2.00 % | +29.94 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,8192) | 3.572e+04 | -0.57 % | +29.20 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,8192) | 3.526e+04 | -1.30 % | +27.51 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,8192) | 3.502e+04 | -0.67 % | +26.65 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4,16384) | 1.405e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4,16384) | 1.859e+04 | +32.35 % | +32.35 % | ca481d3 | Optimise numeric multiplication for short inputs. (4,16384) | 1.806e+04 | -2.85 % | +28.57 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4,16384) | 1.807e+04 | +0.05 % | +28.63 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4,16384) | 1.792e+04 | -0.83 % | +27.57 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4,16384) | 1.841e+04 | +2.74 % | +31.07 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4,16384) | 1.742e+04 | -5.39 % | +24.01 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (5,5) | 1.043e+07 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (5,5) | 1.035e+07 | -0.82 % | -0.82 % | ca481d3 | Optimise numeric multiplication for short inputs. (5,5) | 1.051e+07 | +1.60 % | +0.77 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (5,5) | 1.034e+07 | -1.60 % | -0.84 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (5,5) | 1.017e+07 | -1.64 % | -2.46 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (5,5) | 1.795e+07 | +76.45 % | +72.10 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (5,5) | 1.843e+07 | +2.67 % | +76.69 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (6,6) | 9.775e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (6,6) | 9.497e+06 | -2.84 % | -2.84 % | ca481d3 | Optimise numeric multiplication for short inputs. (6,6) | 9.515e+06 | +0.18 % | -2.66 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (6,6) | 9.484e+06 | -0.32 % | -2.97 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (6,6) | 9.739e+06 | +2.68 % | -0.37 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (6,6) | 1.661e+07 | +70.60 % | +69.98 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (6,6) | 1.661e+07 | -0.01 % | +69.95 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (7,7) | 7.308e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (7,7) | 7.449e+06 | +1.93 % | +1.93 % | ca481d3 | Optimise numeric multiplication for short inputs. (7,7) | 7.465e+06 | +0.21 % | +2.14 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (7,7) | 7.482e+06 | +0.23 % | +2.38 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (7,7) | 7.295e+06 | -2.49 % | -0.18 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (7,7) | 7.395e+06 | +1.36 % | +1.18 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (7,7) | 1.017e+07 | +37.49 % | +39.12 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,8) | 7.916e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,8) | 8.206e+06 | +3.67 % | +3.67 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,8) | 8.135e+06 | -0.87 % | +2.77 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,8) | 7.981e+06 | -1.90 % | +0.82 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,8) | 8.065e+06 | +1.06 % | +1.88 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,8) | 8.048e+06 | -0.21 % | +1.68 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,8) | 9.559e+06 | +18.77 % | +20.76 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,16) | 6.325e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,16) | 6.449e+06 | +1.95 % | +1.95 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,16) | 6.367e+06 | -1.27 % | +0.66 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,16) | 6.396e+06 | +0.46 % | +1.12 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,16) | 6.409e+06 | +0.19 % | +1.32 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,16) | 6.500e+06 | +1.42 % | +2.76 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,16) | 8.506e+06 | +30.86 % | +34.47 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,32) | 4.313e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,32) | 4.489e+06 | +4.09 % | +4.09 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,32) | 4.369e+06 | -2.68 % | +1.30 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,32) | 4.350e+06 | -0.42 % | +0.87 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,32) | 4.246e+06 | -2.40 % | -1.55 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,32) | 4.323e+06 | +1.81 % | +0.23 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,32) | 6.039e+06 | +39.70 % | +40.02 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,64) | 2.722e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,64) | 2.701e+06 | -0.77 % | -0.77 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,64) | 2.696e+06 | -0.21 % | -0.97 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,64) | 2.624e+06 | -2.67 % | -3.61 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,64) | 2.648e+06 | +0.93 % | -2.72 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,64) | 2.661e+06 | +0.50 % | -2.23 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,64) | 3.850e+06 | +44.64 % | +41.42 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,128) | 1.408e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,128) | 1.395e+06 | -0.97 % | -0.97 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,128) | 1.459e+06 | +4.61 % | +3.59 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,128) | 1.494e+06 | +2.42 % | +6.10 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,128) | 1.423e+06 | -4.76 % | +1.05 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,128) | 1.381e+06 | -2.97 % | -1.95 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,128) | 2.222e+06 | +60.92 % | +57.78 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,256) | 7.400e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,256) | 7.553e+05 | +2.06 % | +2.06 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,256) | 7.425e+05 | -1.69 % | +0.34 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,256) | 7.503e+05 | +1.05 % | +1.39 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,256) | 7.493e+05 | -0.13 % | +1.26 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,256) | 7.172e+05 | -4.29 % | -3.08 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,256) | 1.145e+06 | +59.66 % | +54.74 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,512) | 3.836e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,512) | 3.803e+05 | -0.87 % | -0.87 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,512) | 3.805e+05 | +0.04 % | -0.83 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,512) | 3.765e+05 | -1.03 % | -1.85 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,512) | 3.936e+05 | +4.53 % | +2.59 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,512) | 3.657e+05 | -7.09 % | -4.69 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,512) | 6.337e+05 | +73.30 % | +65.18 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,1024) | 2.028e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,1024) | 2.089e+05 | +3.06 % | +3.06 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,1024) | 2.070e+05 | -0.95 % | +2.08 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,1024) | 2.010e+05 | -2.90 % | -0.88 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,1024) | 2.011e+05 | +0.09 % | -0.79 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,1024) | 2.087e+05 | +3.77 % | +2.95 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,1024) | 3.206e+05 | +53.60 % | +58.13 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,2048) | 9.974e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,2048) | 9.833e+04 | -1.40 % | -1.40 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,2048) | 1.000e+05 | +1.72 % | +0.29 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,2048) | 1.006e+05 | +0.57 % | +0.87 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,2048) | 9.783e+04 | -2.76 % | -1.91 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,2048) | 1.022e+05 | +4.43 % | +2.43 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,2048) | 1.575e+05 | +54.22 % | +57.97 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,4096) | 5.160e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,4096) | 5.257e+04 | +1.89 % | +1.89 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,4096) | 5.111e+04 | -2.78 % | -0.94 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,4096) | 5.306e+04 | +3.82 % | +2.85 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,4096) | 5.112e+04 | -3.67 % | -0.93 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,4096) | 5.116e+04 | +0.08 % | -0.85 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,4096) | 8.478e+04 | +65.72 % | +64.32 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,8192) | 2.424e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,8192) | 2.380e+04 | -1.80 % | -1.80 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,8192) | 2.470e+04 | +3.75 % | +1.88 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,8192) | 2.407e+04 | -2.55 % | -0.72 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,8192) | 2.426e+04 | +0.80 % | +0.08 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,8192) | 2.402e+04 | -0.97 % | -0.89 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,8192) | 3.904e+04 | +62.50 % | +61.06 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8,16384) | 1.232e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8,16384) | 1.209e+04 | -1.81 % | -1.81 % | ca481d3 | Optimise numeric multiplication for short inputs. (8,16384) | 1.207e+04 | -0.20 % | -2.01 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8,16384) | 1.188e+04 | -1.60 % | -3.58 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8,16384) | 1.210e+04 | +1.89 % | -1.76 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8,16384) | 1.219e+04 | +0.78 % | -0.99 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8,16384) | 1.986e+04 | +62.86 % | +61.24 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,16) | 4.209e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,16) | 4.381e+06 | +4.08 % | +4.08 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,16) | 4.240e+06 | -3.20 % | +0.75 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,16) | 4.261e+06 | +0.50 % | +1.25 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,16) | 4.344e+06 | +1.94 % | +3.22 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,16) | 4.390e+06 | +1.06 % | +4.32 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,16) | 6.024e+06 | +37.21 % | +43.13 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,32) | 3.234e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,32) | 3.386e+06 | +4.68 % | +4.68 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,32) | 3.328e+06 | -1.72 % | +2.89 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,32) | 3.351e+06 | +0.70 % | +3.61 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,32) | 3.288e+06 | -1.89 % | +1.65 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,32) | 3.239e+06 | -1.49 % | +0.14 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,32) | 4.868e+06 | +50.31 % | +50.51 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,64) | 2.044e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,64) | 2.044e+06 | 0.00 % | 0.00 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,64) | 2.044e+06 | +0.01 % | 0.00 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,64) | 2.009e+06 | -1.69 % | -1.68 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,64) | 2.085e+06 | +3.75 % | +2.00 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,64) | 1.808e+06 | -13.27 % | -11.53 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,64) | 3.306e+06 | +82.88 % | +61.79 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,128) | 1.130e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,128) | 1.133e+06 | +0.22 % | +0.22 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,128) | 1.140e+06 | +0.61 % | +0.83 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,128) | 1.144e+06 | +0.37 % | +1.21 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,128) | 1.153e+06 | +0.80 % | +2.02 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,128) | 1.019e+06 | -11.58 % | -9.79 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,128) | 1.905e+06 | +86.82 % | +68.53 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,256) | 5.782e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,256) | 5.903e+05 | +2.10 % | +2.10 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,256) | 6.019e+05 | +1.96 % | +4.10 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,256) | 5.733e+05 | -4.74 % | -0.84 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,256) | 6.001e+05 | +4.67 % | +3.79 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,256) | 5.447e+05 | -9.22 % | -5.78 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,256) | 9.676e+05 | +77.62 % | +67.35 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,512) | 3.038e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,512) | 3.031e+05 | -0.22 % | -0.22 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,512) | 3.123e+05 | +3.01 % | +2.78 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,512) | 3.032e+05 | -2.91 % | -0.21 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,512) | 2.998e+05 | -1.13 % | -1.34 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,512) | 2.933e+05 | -2.16 % | -3.46 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,512) | 5.296e+05 | +80.58 % | +74.33 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,1024) | 1.662e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,1024) | 1.632e+05 | -1.83 % | -1.83 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,1024) | 1.665e+05 | +2.01 % | +0.14 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,1024) | 1.696e+05 | +1.90 % | +2.04 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,1024) | 1.650e+05 | -2.73 % | -0.74 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,1024) | 1.660e+05 | +0.62 % | -0.13 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,1024) | 2.755e+05 | +65.92 % | +65.71 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,2048) | 8.053e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,2048) | 8.282e+04 | +2.84 % | +2.84 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,2048) | 8.382e+04 | +1.21 % | +4.08 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,2048) | 8.044e+04 | -4.03 % | -0.12 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,2048) | 8.025e+04 | -0.24 % | -0.36 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,2048) | 8.147e+04 | +1.53 % | +1.17 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,2048) | 1.357e+05 | +66.59 % | +68.54 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,4096) | 4.231e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,4096) | 4.152e+04 | -1.87 % | -1.87 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,4096) | 4.190e+04 | +0.94 % | -0.95 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,4096) | 4.115e+04 | -1.80 % | -2.74 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,4096) | 4.117e+04 | +0.05 % | -2.69 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,4096) | 4.268e+04 | +3.67 % | +0.88 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,4096) | 7.145e+04 | +67.41 % | +68.88 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,8192) | 1.917e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,8192) | 1.923e+04 | +0.33 % | +0.33 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,8192) | 1.923e+04 | -0.01 % | +0.32 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,8192) | 1.905e+04 | -0.95 % | -0.63 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,8192) | 1.942e+04 | +1.95 % | +1.30 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,8192) | 1.976e+04 | +1.76 % | +3.09 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,8192) | 3.238e+04 | +63.88 % | +68.95 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16,16384) | 9.644e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16,16384) | 9.647e+03 | +0.02 % | +0.02 % | ca481d3 | Optimise numeric multiplication for short inputs. (16,16384) | 9.473e+03 | -1.80 % | -1.78 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16,16384) | 1.002e+04 | +5.73 % | +3.85 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16,16384) | 9.389e+03 | -6.26 % | -2.65 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16,16384) | 9.645e+03 | +2.73 % | +0.01 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16,16384) | 1.622e+04 | +68.14 % | +68.15 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,32) | 2.013e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,32) | 2.046e+06 | +1.65 % | +1.65 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,32) | 2.026e+06 | -0.96 % | +0.67 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,32) | 2.051e+06 | +1.19 % | +1.87 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,32) | 2.060e+06 | +0.44 % | +2.32 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,32) | 1.786e+06 | -13.27 % | -11.26 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,32) | 3.408e+06 | +90.80 % | +69.32 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,64) | 1.406e+06 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,64) | 1.354e+06 | -3.69 % | -3.69 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,64) | 1.395e+06 | +2.99 % | -0.81 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,64) | 1.370e+06 | -1.77 % | -2.56 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,64) | 1.343e+06 | -1.97 % | -4.48 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,64) | 1.119e+06 | -16.72 % | -20.45 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,64) | 2.356e+06 | +110.63 % | +67.56 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,128) | 7.979e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,128) | 8.295e+05 | +3.96 % | +3.96 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,128) | 8.132e+05 | -1.96 % | +1.92 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,128) | 8.153e+05 | +0.25 % | +2.18 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,128) | 8.377e+05 | +2.75 % | +4.98 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,128) | 7.242e+05 | -13.55 % | -9.24 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,128) | 1.393e+06 | +92.39 % | +74.61 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,256) | 4.770e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,256) | 4.680e+05 | -1.89 % | -1.89 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,256) | 4.595e+05 | -1.82 % | -3.67 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,256) | 4.645e+05 | +1.09 % | -2.63 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,256) | 4.557e+05 | -1.88 % | -4.46 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,256) | 4.161e+05 | -8.69 % | -12.76 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,256) | 7.811e+05 | +87.71 % | +63.75 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,512) | 2.304e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,512) | 2.260e+05 | -1.94 % | -1.94 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,512) | 2.321e+05 | +2.73 % | +0.73 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,512) | 2.262e+05 | -2.55 % | -1.84 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,512) | 2.202e+05 | -2.64 % | -4.43 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,512) | 2.125e+05 | -3.50 % | -7.77 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,512) | 4.050e+05 | +90.56 % | +75.75 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,1024) | 1.178e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,1024) | 1.221e+05 | +3.65 % | +3.65 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,1024) | 1.167e+05 | -4.40 % | -0.92 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,1024) | 1.211e+05 | +3.74 % | +2.79 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,1024) | 1.196e+05 | -1.20 % | +1.56 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,1024) | 1.188e+05 | -0.68 % | +0.87 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,1024) | 2.097e+05 | +76.48 % | +78.02 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,2048) | 6.023e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,2048) | 5.920e+04 | -1.72 % | -1.72 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,2048) | 5.869e+04 | -0.85 % | -2.56 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,2048) | 5.969e+04 | +1.69 % | -0.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,2048) | 5.970e+04 | +0.02 % | -0.89 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,2048) | 5.813e+04 | -2.63 % | -3.49 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,2048) | 1.057e+05 | +81.75 % | +75.41 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,4096) | 3.015e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,4096) | 3.042e+04 | +0.92 % | +0.92 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,4096) | 3.015e+04 | -0.91 % | 0.00 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,4096) | 3.042e+04 | +0.91 % | +0.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,4096) | 3.101e+04 | +1.93 % | +2.85 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,4096) | 3.015e+04 | -2.77 % | 0.00 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,4096) | 5.671e+04 | +88.11 % | +88.12 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,8192) | 1.397e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,8192) | 1.358e+04 | -2.79 % | -2.79 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,8192) | 1.346e+04 | -0.91 % | -3.68 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,8192) | 1.371e+04 | +1.87 % | -1.88 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,8192) | 1.360e+04 | -0.78 % | -2.65 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,8192) | 1.371e+04 | +0.78 % | -1.89 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,8192) | 2.439e+04 | +77.94 % | +74.58 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,16384) | 6.677e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (32,16384) | 6.734e+03 | +0.85 % | +0.85 % | ca481d3 | Optimise numeric multiplication for short inputs. (32,16384) | 6.798e+03 | +0.94 % | +1.80 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (32,16384) | 6.858e+03 | +0.89 % | +2.70 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (32,16384) | 6.617e+03 | -3.51 % | -0.90 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (32,16384) | 6.991e+03 | +5.65 % | +4.70 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,16384) | 1.212e+04 | +73.37 % | +81.51 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,64) | 7.302e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,64) | 6.785e+05 | -7.08 % | -7.08 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,64) | 7.102e+05 | +4.67 % | -2.74 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,64) | 7.107e+05 | +0.07 % | -2.67 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,64) | 7.102e+05 | -0.07 % | -2.74 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,64) | 5.515e+05 | -22.34 % | -24.47 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,64) | 1.432e+06 | +159.69 % | +96.14 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,128) | 3.659e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,128) | 3.689e+05 | +0.82 % | +0.82 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,128) | 3.663e+05 | -0.71 % | +0.10 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,128) | 3.767e+05 | +2.86 % | +2.96 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,128) | 3.762e+05 | -0.15 % | +2.81 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,128) | 3.204e+05 | -14.83 % | -12.44 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,128) | 9.630e+05 | +200.58 % | +163.19 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,256) | 2.509e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,256) | 2.396e+05 | -4.52 % | -4.52 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,256) | 2.440e+05 | +1.84 % | -2.77 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,256) | 2.372e+05 | -2.77 % | -5.47 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,256) | 2.394e+05 | +0.91 % | -4.60 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,256) | 2.194e+05 | -8.36 % | -12.57 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,256) | 5.368e+05 | +144.70 % | +113.94 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,512) | 1.193e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,512) | 1.203e+05 | +0.80 % | +0.80 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,512) | 1.213e+05 | +0.82 % | +1.63 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,512) | 1.201e+05 | -0.93 % | +0.68 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,512) | 1.196e+05 | -0.43 % | +0.25 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,512) | 1.121e+05 | -6.32 % | -6.09 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,512) | 2.865e+05 | +155.62 % | +140.06 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,1024) | 5.983e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,1024) | 6.092e+04 | +1.81 % | +1.81 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,1024) | 6.036e+04 | -0.91 % | +0.88 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,1024) | 6.092e+04 | +0.93 % | +1.82 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,1024) | 6.095e+04 | +0.05 % | +1.87 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,1024) | 6.044e+04 | -0.84 % | +1.02 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,1024) | 1.462e+05 | +141.83 % | +144.29 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,2048) | 3.104e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,2048) | 3.160e+04 | +1.80 % | +1.80 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,2048) | 3.160e+04 | -0.01 % | +1.79 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,2048) | 3.133e+04 | -0.87 % | +0.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,2048) | 3.103e+04 | -0.96 % | -0.06 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,2048) | 3.131e+04 | +0.91 % | +0.85 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,2048) | 7.198e+04 | +129.92 % | +131.88 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,4096) | 1.603e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,4096) | 1.618e+04 | +0.93 % | +0.93 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,4096) | 1.589e+04 | -1.76 % | -0.85 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,4096) | 1.589e+04 | -0.04 % | -0.89 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,4096) | 1.589e+04 | +0.01 % | -0.87 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,4096) | 1.560e+04 | -1.85 % | -2.70 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,4096) | 3.748e+04 | +140.29 % | +133.80 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,8192) | 7.092e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,8192) | 7.085e+03 | -0.11 % | -0.11 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,8192) | 7.026e+03 | -0.83 % | -0.93 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,8192) | 7.170e+03 | +2.04 % | +1.09 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,8192) | 7.092e+03 | -1.09 % | -0.01 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,8192) | 7.081e+03 | -0.15 % | -0.15 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,8192) | 1.591e+04 | +124.70 % | +124.36 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,16384) | 3.516e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (64,16384) | 3.548e+03 | +0.91 % | +0.91 % | ca481d3 | Optimise numeric multiplication for short inputs. (64,16384) | 3.546e+03 | -0.05 % | +0.85 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (64,16384) | 3.581e+03 | +0.98 % | +1.84 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (64,16384) | 3.553e+03 | -0.79 % | +1.04 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (64,16384) | 3.579e+03 | +0.75 % | +1.80 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,16384) | 7.986e+03 | +123.12 % | +127.13 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,128) | 2.065e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,128) | 2.086e+05 | +1.01 % | +1.01 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,128) | 2.106e+05 | +0.96 % | +1.99 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,128) | 2.126e+05 | +0.97 % | +2.97 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,128) | 2.084e+05 | -1.99 % | +0.92 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,128) | 1.750e+05 | -16.01 % | -15.24 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,128) | 5.567e+05 | +218.07 % | +169.60 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,256) | 1.225e+05 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,256) | 1.247e+05 | +1.86 % | +1.86 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,256) | 1.281e+05 | +2.73 % | +4.64 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,256) | 1.297e+05 | +1.23 % | +5.93 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,256) | 1.247e+05 | -3.84 % | +1.86 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,256) | 1.142e+05 | -8.41 % | -6.71 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,256) | 3.410e+05 | +198.51 % | +178.48 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,512) | 6.696e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,512) | 6.699e+04 | +0.05 % | +0.05 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,512) | 6.749e+04 | +0.74 % | +0.79 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,512) | 6.821e+04 | +1.07 % | +1.86 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,512) | 6.348e+04 | -6.94 % | -5.20 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,512) | 6.313e+04 | -0.54 % | -5.72 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,512) | 1.842e+05 | +191.83 % | +175.14 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,1024) | 3.443e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,1024) | 3.365e+04 | -2.27 % | -2.27 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,1024) | 3.350e+04 | -0.45 % | -2.71 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,1024) | 3.380e+04 | +0.91 % | -1.83 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,1024) | 3.354e+04 | -0.79 % | -2.60 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,1024) | 3.380e+04 | +0.79 % | -1.83 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,1024) | 8.632e+04 | +155.39 % | +150.71 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,2048) | 1.755e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,2048) | 1.741e+04 | -0.83 % | -0.83 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,2048) | 1.709e+04 | -1.80 % | -2.61 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,2048) | 1.738e+04 | +1.68 % | -0.97 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,2048) | 1.758e+04 | +1.14 % | +0.16 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,2048) | 1.742e+04 | -0.90 % | -0.74 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,2048) | 4.631e+04 | +165.82 % | +163.84 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,4096) | 8.514e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,4096) | 8.674e+03 | +1.88 % | +1.88 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,4096) | 8.581e+03 | -1.07 % | +0.78 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,4096) | 8.433e+03 | -1.72 % | -0.95 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,4096) | 8.273e+03 | -1.90 % | -2.83 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,4096) | 8.338e+03 | +0.79 % | -2.06 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,4096) | 2.386e+04 | +186.19 % | +180.30 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,8192) | 3.891e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,8192) | 4.037e+03 | +3.76 % | +3.76 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,8192) | 3.880e+03 | -3.90 % | -0.29 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,8192) | 3.920e+03 | +1.05 % | +0.76 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,8192) | 3.856e+03 | -1.65 % | -0.91 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,8192) | 3.916e+03 | +1.58 % | +0.66 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,8192) | 9.759e+03 | +149.19 % | +150.83 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,16384) | 1.895e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (128,16384) | 1.931e+03 | +1.90 % | +1.90 % | ca481d3 | Optimise numeric multiplication for short inputs. (128,16384) | 1.895e+03 | -1.88 % | -0.01 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (128,16384) | 1.911e+03 | +0.88 % | +0.87 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (128,16384) | 1.929e+03 | +0.95 % | +1.83 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (128,16384) | 1.912e+03 | -0.92 % | +0.89 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,16384) | 4.829e+03 | +152.60 % | +154.85 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,256) | 5.990e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,256) | 5.853e+04 | -2.29 % | -2.29 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,256) | 5.875e+04 | +0.37 % | -1.93 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,256) | 5.876e+04 | +0.02 % | -1.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,256) | 5.697e+04 | -3.05 % | -4.90 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,256) | 5.288e+04 | -7.17 % | -11.72 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,256) | 1.712e+05 | +223.70 % | +185.77 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,512) | 3.232e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,512) | 3.357e+04 | +3.88 % | +3.88 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,512) | 3.234e+04 | -3.66 % | +0.08 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,512) | 3.296e+04 | +1.92 % | +2.00 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,512) | 3.094e+04 | -6.12 % | -4.25 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,512) | 3.064e+04 | -0.99 % | -5.20 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,512) | 1.019e+05 | +232.50 % | +215.22 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,1024) | 1.711e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,1024) | 1.742e+04 | +1.82 % | +1.82 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,1024) | 1.742e+04 | -0.01 % | +1.81 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,1024) | 1.693e+04 | -2.78 % | -1.02 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,1024) | 1.742e+04 | +2.91 % | +1.85 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,1024) | 1.710e+04 | -1.84 % | -0.02 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,1024) | 4.881e+04 | +185.38 % | +185.31 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,2048) | 9.051e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,2048) | 8.710e+03 | -3.77 % | -3.77 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,2048) | 8.652e+03 | -0.67 % | -4.41 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,2048) | 8.796e+03 | +1.66 % | -2.82 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,2048) | 8.622e+03 | -1.98 % | -4.75 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,2048) | 8.616e+03 | -0.07 % | -4.81 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,2048) | 2.530e+04 | +193.63 % | +179.51 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,4096) | 4.409e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,4096) | 4.455e+03 | +1.05 % | +1.05 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,4096) | 4.379e+03 | -1.71 % | -0.67 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,4096) | 4.348e+03 | -0.72 % | -1.39 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,4096) | 4.454e+03 | +2.45 % | +1.03 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,4096) | 4.373e+03 | -1.83 % | -0.82 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,4096) | 1.345e+04 | +207.51 % | +204.98 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,8192) | 1.986e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,8192) | 1.934e+03 | -2.58 % | -2.58 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,8192) | 1.986e+03 | +2.68 % | +0.02 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,8192) | 1.959e+03 | -1.37 % | -1.35 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,8192) | 2.004e+03 | +2.32 % | +0.94 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,8192) | 1.966e+03 | -1.90 % | -0.98 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,8192) | 5.460e+03 | +177.66 % | +174.94 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (256,16384) | 1.003e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (256,16384) | 9.851e+02 | -1.79 % | -1.79 % | ca481d3 | Optimise numeric multiplication for short inputs. (256,16384) | 9.836e+02 | -0.14 % | -1.94 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (256,16384) | 9.753e+02 | -0.85 % | -2.77 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (256,16384) | 1.037e+03 | +6.35 % | +3.40 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (256,16384) | 9.946e+02 | -4.11 % | -0.85 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (256,16384) | 2.661e+03 | +167.57 % | +165.30 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,512) | 1.685e+04 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,512) | 1.653e+04 | -1.86 % | -1.86 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,512) | 1.668e+04 | +0.90 % | -0.97 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,512) | 1.684e+04 | +0.93 % | -0.06 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,512) | 1.600e+04 | -4.96 % | -5.01 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,512) | 1.555e+04 | -2.80 % | -7.67 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,512) | 5.216e+04 | +235.33 % | +209.61 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,1024) | 8.525e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,1024) | 8.730e+03 | +2.41 % | +2.41 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,1024) | 8.568e+03 | -1.87 % | +0.50 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,1024) | 8.566e+03 | -0.02 % | +0.48 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,1024) | 8.566e+03 | -0.01 % | +0.47 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,1024) | 8.697e+03 | +1.53 % | +2.01 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,1024) | 2.679e+04 | +208.07 % | +214.26 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,2048) | 4.402e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,2048) | 4.362e+03 | -0.91 % | -0.91 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,2048) | 4.401e+03 | +0.91 % | -0.01 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,2048) | 4.398e+03 | -0.07 % | -0.08 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,2048) | 4.359e+03 | -0.90 % | -0.98 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,2048) | 4.362e+03 | +0.08 % | -0.90 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,2048) | 1.383e+04 | +216.94 % | +214.08 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,4096) | 2.316e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,4096) | 2.232e+03 | -3.61 % | -3.61 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,4096) | 2.215e+03 | -0.77 % | -4.35 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,4096) | 2.188e+03 | -1.21 % | -5.50 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,4096) | 2.230e+03 | +1.89 % | -3.72 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,4096) | 2.252e+03 | +0.98 % | -2.77 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,4096) | 7.158e+03 | +217.91 % | +209.10 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,8192) | 9.847e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,8192) | 1.015e+03 | +3.04 % | +3.04 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,8192) | 1.008e+03 | -0.62 % | +2.40 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,8192) | 1.022e+03 | +1.33 % | +3.77 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,8192) | 1.011e+03 | -1.09 % | +2.64 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,8192) | 9.940e+02 | -1.65 % | +0.94 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,8192) | 2.849e+03 | +186.61 % | +189.31 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (512,16384) | 5.133e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (512,16384) | 5.032e+02 | -1.97 % | -1.97 % | ca481d3 | Optimise numeric multiplication for short inputs. (512,16384) | 4.949e+02 | -1.64 % | -3.58 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (512,16384) | 5.035e+02 | +1.73 % | -1.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (512,16384) | 5.130e+02 | +1.90 % | -0.05 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (512,16384) | 4.992e+02 | -2.69 % | -2.74 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (512,16384) | 1.464e+03 | +193.16 % | +185.13 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1024,1024) | 4.277e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1024,1024) | 4.232e+03 | -1.04 % | -1.04 % | ca481d3 | Optimise numeric multiplication for short inputs. (1024,1024) | 4.194e+03 | -0.90 % | -1.93 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1024,1024) | 4.195e+03 | +0.03 % | -1.91 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1024,1024) | 4.341e+03 | +3.48 % | +1.51 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1024,1024) | 4.155e+03 | -4.28 % | -2.84 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1024,1024) | 1.360e+04 | +227.21 % | +217.91 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1024,2048) | 2.189e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1024,2048) | 2.168e+03 | -0.93 % | -0.93 % | ca481d3 | Optimise numeric multiplication for short inputs. (1024,2048) | 2.169e+03 | +0.04 % | -0.89 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1024,2048) | 2.272e+03 | +4.73 % | +3.80 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1024,2048) | 2.189e+03 | -3.66 % | 0.00 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1024,2048) | 2.185e+03 | -0.18 % | -0.18 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1024,2048) | 7.159e+03 | +227.65 % | +227.07 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1024,4096) | 1.125e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1024,4096) | 1.125e+03 | +0.01 % | +0.01 % | ca481d3 | Optimise numeric multiplication for short inputs. (1024,4096) | 1.115e+03 | -0.91 % | -0.89 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1024,4096) | 1.125e+03 | +0.91 % | +0.01 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1024,4096) | 1.157e+03 | +2.81 % | +2.83 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1024,4096) | 1.136e+03 | -1.81 % | +0.97 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1024,4096) | 3.707e+03 | +226.42 % | +229.59 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1024,8192) | 5.046e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1024,8192) | 5.134e+02 | +1.73 % | +1.73 % | ca481d3 | Optimise numeric multiplication for short inputs. (1024,8192) | 5.141e+02 | +0.14 % | +1.88 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1024,8192) | 5.135e+02 | -0.11 % | +1.76 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1024,8192) | 5.045e+02 | -1.76 % | -0.03 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1024,8192) | 5.041e+02 | -0.09 % | -0.12 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1024,8192) | 1.464e+03 | +190.46 % | +190.12 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (1024,16384) | 2.511e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (1024,16384) | 2.532e+02 | +0.83 % | +0.83 % | ca481d3 | Optimise numeric multiplication for short inputs. (1024,16384) | 2.511e+02 | -0.82 % | 0.00 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (1024,16384) | 2.488e+02 | -0.92 % | -0.92 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (1024,16384) | 2.490e+02 | +0.05 % | -0.87 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (1024,16384) | 2.487e+02 | -0.10 % | -0.96 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (1024,16384) | 7.248e+02 | +191.41 % | +188.60 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2048,2048) | 1.093e+03 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2048,2048) | 1.114e+03 | +1.90 % | +1.90 % | ca481d3 | Optimise numeric multiplication for short inputs. (2048,2048) | 1.064e+03 | -4.54 % | -2.72 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2048,2048) | 1.073e+03 | +0.91 % | -1.84 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2048,2048) | 1.083e+03 | +0.87 % | -0.99 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2048,2048) | 1.077e+03 | -0.52 % | -1.51 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2048,2048) | 3.743e+03 | +247.54 % | +242.31 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2048,4096) | 5.569e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2048,4096) | 5.471e+02 | -1.77 % | -1.77 % | ca481d3 | Optimise numeric multiplication for short inputs. (2048,4096) | 5.575e+02 | +1.91 % | +0.11 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2048,4096) | 5.473e+02 | -1.82 % | -1.72 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2048,4096) | 5.628e+02 | +2.82 % | +1.05 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2048,4096) | 5.520e+02 | -1.90 % | -0.87 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2048,4096) | 1.889e+03 | +242.23 % | +239.23 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2048,8192) | 2.523e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2048,8192) | 2.521e+02 | -0.04 % | -0.04 % | ca481d3 | Optimise numeric multiplication for short inputs. (2048,8192) | 2.545e+02 | +0.94 % | +0.90 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2048,8192) | 2.569e+02 | +0.92 % | +1.83 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2048,8192) | 2.477e+02 | -3.59 % | -1.82 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2048,8192) | 2.521e+02 | +1.79 % | -0.06 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2048,8192) | 7.424e+02 | +194.50 % | +194.31 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (2048,16384) | 1.251e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (2048,16384) | 1.274e+02 | +1.83 % | +1.83 % | ca481d3 | Optimise numeric multiplication for short inputs. (2048,16384) | 1.312e+02 | +3.03 % | +4.92 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (2048,16384) | 1.298e+02 | -1.09 % | +3.77 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (2048,16384) | 1.263e+02 | -2.71 % | +0.96 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (2048,16384) | 1.262e+02 | -0.09 % | +0.87 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (2048,16384) | 3.753e+02 | +197.41 % | +199.99 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4096,4096) | 2.645e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4096,4096) | 2.645e+02 | -0.01 % | -0.01 % | ca481d3 | Optimise numeric multiplication for short inputs. (4096,4096) | 2.669e+02 | +0.89 % | +0.88 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4096,4096) | 2.646e+02 | -0.84 % | +0.03 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4096,4096) | 2.705e+02 | +2.21 % | +2.24 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4096,4096) | 2.743e+02 | +1.41 % | +3.68 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4096,4096) | 9.454e+02 | +244.67 % | +257.36 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4096,8192) | 1.258e+02 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4096,8192) | 1.234e+02 | -1.89 % | -1.89 % | ca481d3 | Optimise numeric multiplication for short inputs. (4096,8192) | 1.244e+02 | +0.77 % | -1.14 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4096,8192) | 1.257e+02 | +1.09 % | -0.06 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4096,8192) | 1.236e+02 | -1.69 % | -1.75 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4096,8192) | 1.245e+02 | +0.76 % | -1.00 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4096,8192) | 3.863e+02 | +210.20 % | +207.09 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (4096,16384) | 6.339e+01 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (4096,16384) | 6.442e+01 | +1.62 % | +1.62 % | ca481d3 | Optimise numeric multiplication for short inputs. (4096,16384) | 6.339e+01 | -1.59 % | 0.00 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (4096,16384) | 6.288e+01 | -0.81 % | -0.80 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (4096,16384) | 6.312e+01 | +0.38 % | -0.43 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (4096,16384) | 6.536e+01 | +3.55 % | +3.10 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (4096,16384) | 1.842e+02 | +181.84 % | +190.58 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8192,8192) | 5.904e+01 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8192,8192) | 5.957e+01 | +0.91 % | +0.91 % | ca481d3 | Optimise numeric multiplication for short inputs. (8192,8192) | 6.031e+01 | +1.24 % | +2.16 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8192,8192) | 5.898e+01 | -2.21 % | -0.10 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8192,8192) | 6.206e+01 | +5.22 % | +5.11 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8192,8192) | 6.157e+01 | -0.79 % | +4.29 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8192,8192) | 1.950e+02 | +216.66 % | +230.24 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (8192,16384) | 3.029e+01 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (8192,16384) | 3.095e+01 | +2.19 % | +2.19 % | ca481d3 | Optimise numeric multiplication for short inputs. (8192,16384) | 3.057e+01 | -1.22 % | +0.94 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (8192,16384) | 3.077e+01 | +0.63 % | +1.57 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (8192,16384) | 3.117e+01 | +1.31 % | +2.90 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (8192,16384) | 3.147e+01 | +0.98 % | +3.91 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (8192,16384) | 9.908e+01 | +214.79 % | +227.10 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (16384,16384) | 1.515e+01 | | | 42de72f | SQL/JSON: Various improvements to SQL/JSON query f (16384,16384) | 1.481e+01 | -2.19 % | -2.19 % | ca481d3 | Optimise numeric multiplication for short inputs. (16384,16384) | 1.474e+01 | -0.51 % | -2.69 % | 628c1d1 | Use diff's --strip-trailing-cr flag where appropri (16384,16384) | 1.485e+01 | +0.75 % | -1.96 % | 0dcf753 | Improve the numeric width_bucket() computation. Fo (16384,16384) | 1.542e+01 | +3.84 % | +1.80 % | da87dc0 | Add missing pointer dereference in pg_backend_memo (16384,16384) | 1.538e+01 | -0.27 % | +1.53 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (16384,16384) | 4.689e+01 | +204.93 % | +209.58 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 /Joel
On Mon, Jul 29, 2024, at 16:42, Joel Jacobson wrote: > New results with less noise below. > > Pardon the exceeding of 80 chars line width, > but felt important to include commit hash and relative delta. > > > ndigits | rate | change | accum | commit | > summary > ---------------+------------+-----------+-----------+---------+---------------------------------------------------- I've reviewed the benchmark results, and it looks like v3-0001 made some cases a bit slower: (32,32) | 1.786e+06 | -13.27 % | -11.26 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,64) | 1.119e+06 | -16.72 % | -20.45 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (32,128) | 7.242e+05 | -13.55 % | -9.24 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,64) | 5.515e+05 | -22.34 % | -24.47 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (64,128) | 3.204e+05 | -14.83 % | -12.44 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co (128,128) | 1.750e+05 | -16.01 % | -15.24 % | v3-0001 | Extend mul_var_short() to 5 and 6-digit inputs. Co Thanks to v3-0002, they are all still significantly faster when both patches have been applied, but I wonder if it is expected or not, that v3-0001 temporarily made them a bit slower? Same cases with v3-0002 applied: (32,32) | 3.408e+06 | +90.80 % | +69.32 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,64) | 2.356e+06 | +110.63 % | +67.56 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (32,128) | 1.393e+06 | +92.39 % | +74.61 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (64,64) | 1.432e+06 | +159.69 % | +96.14 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 (128,128) | 5.567e+05 | +218.07 % | +169.60 % | v3-0002 | Optimise numeric multiplication using base-NBASE^2 /Joel
On Mon, 29 Jul 2024 at 18:57, Joel Jacobson <joel@compiler.org> wrote: > > Thanks to v3-0002, they are all still significantly faster when both patches have been applied, > but I wonder if it is expected or not, that v3-0001 temporarily made them a bit slower? > There's no obvious reason why 0001 would make those cases slower, but the fact that, together with 0002, it's a significant net win, and the gains for 5 and 6-digit inputs make it worthwhile, in my opinion. Something I did notice in my tests was that if ndigits was a small multiple of 8, the old code was disproportionately faster, which can be explained by the fact that the computation fits exactly into a whole number of XMM register operations, with no remaining digits to process. For example, these results from above: ndigits1 | ndigits2 | PG17 rate | patch rate | % change ----------+----------+---------------+---------------+---------- 15 | 15 | 3.7595882e+06 | 5.0751355e+06 | +34.99% 16 | 16 | 4.3353435e+06 | 4.970363e+06 | +14.65% 17 | 17 | 3.9258755e+06 | 4.935394e+06 | +25.71% 23 | 23 | 2.7975982e+06 | 4.5065035e+06 | +61.08% 24 | 24 | 3.2456168e+06 | 4.4578115e+06 | +37.35% 25 | 25 | 2.9515055e+06 | 4.0208335e+06 | +36.23% 31 | 31 | 2.169437e+06 | 3.7209152e+06 | +71.52% 32 | 32 | 2.5022498e+06 | 3.6609378e+06 | +46.31% 33 | 33 | 2.27133e+06 | 3.435459e+06 | +51.25% (Note how 16x16 was much faster than 15x15, for example.) The patched code seems to do a better job at levelling out and coping with arbitrary-sized inputs, not just those that fit exactly into a whole number of loops using SSE2 operations. Something else I noticed was that the relative gains for large numbers of digits were much higher with clang than with gcc: gcc 13.3.0: 16383 | 16383 | 21.629467 | 73.58552 | +240.21% clang 15.0.7: 16383 | 16383 | 11.562384 | 73.00517 | +531.40% That seems to be because clang doesn't do a good job of generating efficient SSE2 code in the old case of 16-bit x 16-bit multiplications. Looking on godbolt.org, it generates overly-complicated code using PMULUDQ, which actually does 32-bit x 32-bit multiplications. Gcc, on the other hand, generates a much more compact loop, using PMULHW and PMULLW, which is much faster. With the patch, they both generate the same SSE2 code, so the results are pretty consistent. Regards, Dean
On Mon, Jul 29, 2024, at 22:01, Dean Rasheed wrote: > On Mon, 29 Jul 2024 at 18:57, Joel Jacobson <joel@compiler.org> wrote: >> >> Thanks to v3-0002, they are all still significantly faster when both patches have been applied, >> but I wonder if it is expected or not, that v3-0001 temporarily made them a bit slower? >> > > There's no obvious reason why 0001 would make those cases slower, but > the fact that, together with 0002, it's a significant net win, and the > gains for 5 and 6-digit inputs make it worthwhile, in my opinion. Yes, I agree, I just thought it was noteworthy, but not a problem per se. > Something I did notice in my tests was that if ndigits was a small > multiple of 8, the old code was disproportionately faster, which can > be explained by the fact that the computation fits exactly into a > whole number of XMM register operations, with no remaining digits to > process. For example, these results from above: > > ndigits1 | ndigits2 | PG17 rate | patch rate | % change > ----------+----------+---------------+---------------+---------- > 15 | 15 | 3.7595882e+06 | 5.0751355e+06 | +34.99% > 16 | 16 | 4.3353435e+06 | 4.970363e+06 | +14.65% > 17 | 17 | 3.9258755e+06 | 4.935394e+06 | +25.71% > > 23 | 23 | 2.7975982e+06 | 4.5065035e+06 | +61.08% > 24 | 24 | 3.2456168e+06 | 4.4578115e+06 | +37.35% > 25 | 25 | 2.9515055e+06 | 4.0208335e+06 | +36.23% > > 31 | 31 | 2.169437e+06 | 3.7209152e+06 | +71.52% > 32 | 32 | 2.5022498e+06 | 3.6609378e+06 | +46.31% > 33 | 33 | 2.27133e+06 | 3.435459e+06 | +51.25% > > (Note how 16x16 was much faster than 15x15, for example.) > > The patched code seems to do a better job at levelling out and coping > with arbitrary-sized inputs, not just those that fit exactly into a > whole number of loops using SSE2 operations. That's nice. > Something else I noticed was that the relative gains for large numbers > of digits were much higher with clang than with gcc: > > gcc 13.3.0: > > 16383 | 16383 | 21.629467 | 73.58552 | +240.21% > > clang 15.0.7: > > 16383 | 16383 | 11.562384 | 73.00517 | +531.40% > > That seems to be because clang doesn't do a good job of generating > efficient SSE2 code in the old case of 16-bit x 16-bit > multiplications. Looking on godbolt.org, it generates > overly-complicated code using PMULUDQ, which actually does 32-bit x > 32-bit multiplications. Gcc, on the other hand, generates a much more > compact loop, using PMULHW and PMULLW, which is much faster. With the > patch, they both generate the same SSE2 code, so the results are > pretty consistent. Very nice. I've now also had an initial look at the actual code of the patches: * v3-0001 Looks pretty straight forward, nice with the PRODSUM macros, that really improved readability a lot. I like these simplifications, how `var2ndigits` is used instead of `res_ndigits`: - for (int i = res_ndigits - 3; i >= 1; i--) + for (int i = var2ndigits - 1; i >= 1; i--) But I wonder why does `case 1:` not follow the same pattern? for (int i = res_ndigits - 2; i >= 0; i--) * v3-0002 I think it's non-obvious if the separate code paths for 32-bit and 64-bit, using `#if SIZEOF_DATUM < 8`, to get *fast* 32-bit support, outweighs the benefits of simpler code. You brought up the question if 32-bit systems should be regarded as legacy previously in this thread. Unfortunately, we didn't get any feedback, so I'm starting a separate thread, with subject "Is fast 32-bit code still important?", hoping to get more input to help us make judgement calls. /Joel
On Mon, 29 Jul 2024 at 21:39, Joel Jacobson <joel@compiler.org> wrote: > > I like these simplifications, how `var2ndigits` is used instead of `res_ndigits`: > - for (int i = res_ndigits - 3; i >= 1; i--) > + for (int i = var2ndigits - 1; i >= 1; i--) > > But I wonder why does `case 1:` not follow the same pattern? > for (int i = res_ndigits - 2; i >= 0; i--) > Ah yes, that should be made the same. (I think I did do that at one point, but then accidentally reverted it during a code refactoring.) > * v3-0002 > > I think it's non-obvious if the separate code paths for 32-bit and 64-bit, > using `#if SIZEOF_DATUM < 8`, to get *fast* 32-bit support, outweighs > the benefits of simpler code. > > You brought up the question if 32-bit systems should be regarded > as legacy previously in this thread. > > Unfortunately, we didn't get any feedback, so I'm starting a separate > thread, with subject "Is fast 32-bit code still important?", hoping to get > more input to help us make judgement calls. > Looking at that other thread that you found [1], I think it's entirely possible that there are people who care about 32-bit systems, which means that we might well get complaints, if we make it slower for them. Unfortunately, I don't have any way to test that (I doubt that running a 32-bit executable on my x86-64 system is a realistic test). Regards, Dean [1] https://postgr.es/m/0a71b43129fb447988f152941e1dbcb3@nidsa.net
Dean Rasheed <dean.a.rasheed@gmail.com> writes: > On Mon, 29 Jul 2024 at 21:39, Joel Jacobson <joel@compiler.org> wrote: >> I think it's non-obvious if the separate code paths for 32-bit and 64-bit, >> using `#if SIZEOF_DATUM < 8`, to get *fast* 32-bit support, outweighs >> the benefits of simpler code. > Looking at that other thread that you found [1], I think it's entirely > possible that there are people who care about 32-bit systems, which > means that we might well get complaints, if we make it slower for > them. Unfortunately, I don't have any way to test that (I doubt that > running a 32-bit executable on my x86-64 system is a realistic test). I think we've already done things that might impact 32-bit systems negatively (5e1f3b9eb for instance), and not heard a lot of pushback. I would argue that anyone still running PG on 32-bit must have pretty minimal performance requirements, so that they're unlikely to care if numeric_mul gets slightly faster or slower. Obviously a *big* performance drop might get pushback. regards, tom lane
On Tue, Jul 30, 2024, at 00:31, Tom Lane wrote: > Dean Rasheed <dean.a.rasheed@gmail.com> writes: >> On Mon, 29 Jul 2024 at 21:39, Joel Jacobson <joel@compiler.org> wrote: >>> I think it's non-obvious if the separate code paths for 32-bit and 64-bit, >>> using `#if SIZEOF_DATUM < 8`, to get *fast* 32-bit support, outweighs >>> the benefits of simpler code. > >> Looking at that other thread that you found [1], I think it's entirely >> possible that there are people who care about 32-bit systems, which >> means that we might well get complaints, if we make it slower for >> them. Unfortunately, I don't have any way to test that (I doubt that >> running a 32-bit executable on my x86-64 system is a realistic test). > > I think we've already done things that might impact 32-bit systems > negatively (5e1f3b9eb for instance), and not heard a lot of pushback. > I would argue that anyone still running PG on 32-bit must have pretty > minimal performance requirements, so that they're unlikely to care if > numeric_mul gets slightly faster or slower. Obviously a *big* > performance drop might get pushback. Thanks for guidance. Sounds reasonable to me. Noted from 5e1f3b9eb: "While it adds some space on 32-bit machines, we aren't optimizing for that case anymore." In this case, the extra 32-bit numeric_mul code seems to be 89 lines of code, excluding comments. To me, this seems like quite a lot, so I lean on thinking we should omit that code for now. We can always add it later if we get pushback. /Joel
On Mon, 5 Aug 2024 at 13:34, Joel Jacobson <joel@compiler.org> wrote: > > Noted from 5e1f3b9eb: > "While it adds some space on 32-bit machines, we aren't optimizing for that case anymore." > > In this case, the extra 32-bit numeric_mul code seems to be 89 lines of code, excluding comments. > To me, this seems like quite a lot, so I lean on thinking we should omit that code for now. > We can always add it later if we get pushback. > OK, I guess that's reasonable. There is no clear-cut right answer here, but I don't really want to have a lot of 32-bit-specific code that significantly complicates this function, making it harder to maintain. Without that code, the patch becomes much simpler, which seems like a decent justification for any performance tradeoffs on 32-bit machines that are unlikely to affect many people anyway. Regards, Dean
Attachment
On Tue, Aug 6, 2024, at 13:52, Dean Rasheed wrote: > On Mon, 5 Aug 2024 at 13:34, Joel Jacobson <joel@compiler.org> wrote: >> >> Noted from 5e1f3b9eb: >> "While it adds some space on 32-bit machines, we aren't optimizing for that case anymore." >> >> In this case, the extra 32-bit numeric_mul code seems to be 89 lines of code, excluding comments. >> To me, this seems like quite a lot, so I lean on thinking we should omit that code for now. >> We can always add it later if we get pushback. >> > > OK, I guess that's reasonable. There is no clear-cut right answer > here, but I don't really want to have a lot of 32-bit-specific code > that significantly complicates this function, making it harder to > maintain. Without that code, the patch becomes much simpler, which > seems like a decent justification for any performance tradeoffs on > 32-bit machines that are unlikely to affect many people anyway. > > Regards, > Dean > > Attachments: > * v4-0001-Extend-mul_var_short-to-5-and-6-digit-inputs.patch > * v4-0002-Optimise-numeric-multiplication-using-base-NBASE-.patch I've reviewed and tested both patches and think they are ready to be committed. Neat with the pairs variables, really improved readability a lot, compared to my first version. Also neat you found a way to adjust the res_weight in a simpler way than my quite lengthy expression. Regards, Joel
On Sun, Aug 11, 2024, at 22:04, Joel Jacobson wrote: >> Attachments: >> * v4-0001-Extend-mul_var_short-to-5-and-6-digit-inputs.patch >> * v4-0002-Optimise-numeric-multiplication-using-base-NBASE-.patch > > I've reviewed and tested both patches and think they are ready to be committed. In addition, I've also tested reduced rscale specifically, due to what you wrote earlier: > 2). Attempt to fix the formulae incorporating maxdigits mentioned > above. This part really made my brain hurt, and I'm still not quite > sure that I've got it right. In particular, it needs double-checking > to ensure that it's not losing accuracy in the reduced-rscale case. To test if there are any differences that actually matter in the result, I patched mul_var to log what combinations that occur when running the test suite: ``` if (rscale != var1->dscale + var2->dscale) { printf("NUMERIC_REDUCED_RSCALE %d,%d,%d,%d,%d\n", var1ndigits, var2ndigits, var1->dscale, var2->dscale, rscale -(var1->dscale + var2->dscale)); } ``` I also added a SQL-callable numeric_mul_rscale(var1, var2, rscale_adjustment) function, to be able to check for differences for the reduced rscale combinations. I then ran the test suite against my db and extracted the seen combinations: ``` make installcheck grep -E "^NUMERIC_REDUCED_RSCALE \d+,\d+,\d+,\d+,-\d+$" logfile | sort -u | awk '{print $2}' > plausible_rscale_adjustments.csv ``` This test didn't produce any differences between HEAD and the two patches applied. % psql -f test-mul_var-verify.sql CREATE TABLE COPY 1413 var1ndigits | var2ndigits | var1dscale | var2dscale | rscale_adjustment | var1 | var2 | expected | numeric_mul_rscale -------------+-------------+------------+------------+-------------------+------+------+----------+-------------------- (0 rows) Attaching patch as .txt to not confuse cfbot. Regards, Joel
Attachment
On Mon, Aug 12, 2024, at 12:47, Joel Jacobson wrote: >> 2). Attempt to fix the formulae incorporating maxdigits mentioned >> above. This part really made my brain hurt, and I'm still not quite >> sure that I've got it right. In particular, it needs double-checking >> to ensure that it's not losing accuracy in the reduced-rscale case. > > To test if there are any differences that actually matter in the result, > I patched mul_var to log what combinations that occur when running > the test suite: I expanded the test to generate 10k different random numerics for each of the reduced rscale cases. This actually found some differences, where the last decimal digit differs by one, except in one case where the last decimal digit differs by two. Not sure if this is a real problem though, since these differences might not affect the result of the SQL-callable functions. The case found with the smallest rscale adjustment was this one: -[ RECORD 1 ]------+-------------------------------- var1 | 0.0000000000009873307197037692 var2 | 0.426697279270850 rscale_adjustment | -15 expected | 0.0000000000004212913318381285 numeric_mul_rscale | 0.0000000000004212913318381284 diff | -0.0000000000000000000000000001 Here is a count grouped by diff: diff | count --------------+---------- 0.000e+00 | 14114384 1.000e-108 | 1 1.000e-211 | 1 1.000e-220 | 2 1.000e-228 | 6 1.000e-232 | 2 1.000e-235 | 1 1.000e-28 | 13 1.000e-36 | 1 1.000e-51 | 2 1.000e-67 | 1 1.000e-68 | 1 1.000e-80 | 1 -1.000e-1024 | 2485 -1.000e-108 | 3 -1.000e-144 | 2520 -1.000e-16 | 2514 -1.000e-228 | 4 -1.000e-232 | 1 -1.000e-27 | 36 -1.000e-28 | 538 -1.000e-32 | 2513 -1.000e-48 | 2473 -1.000e-68 | 1 -1.000e-80 | 2494 -2.000e-16 | 2 (26 rows) Should I investigate where each reduced rscale case originates from, and then try to test the actual SQL-callable functions with values that cause the same inputs to mul_var as the cases found, or do we feel confident these differences are not problematic? Regards, Joel
Attachment
On Mon, Aug 12, 2024, at 17:14, Joel Jacobson wrote: > The case found with the smallest rscale adjustment was this one: > -[ RECORD 1 ]------+-------------------------------- > var1 | 0.0000000000009873307197037692 > var2 | 0.426697279270850 > rscale_adjustment | -15 > expected | 0.0000000000004212913318381285 > numeric_mul_rscale | 0.0000000000004212913318381284 > diff | -0.0000000000000000000000000001 To avoid confusion, correction: I mean "largest", since rscale_adjustment is less than or equal to zero. Here is a group by rscale_adjustment to get a better picture: SELECT rscale_adjustment, COUNT(*) FROM test_numeric_mul_rscale, numeric_mul_rscale(var1, var2, rscale_adjustment) WHERE numeric_mul_rscale IS DISTINCT FROM expected GROUP BY rscale_adjustment ORDER BY rscale_adjustment; rscale_adjustment | count -------------------+------- -237 | 2 -235 | 1 -232 | 3 -229 | 2 -228 | 8 -218 | 1 -108 | 4 -77 | 1 -67 | 1 -51 | 2 -38 | 3 -36 | 1 -28 | 5 -22 | 42 -17 | 7 -16 | 14959 -15 | 574 (17 rows) Regards, Joel
On Mon, 12 Aug 2024 at 16:17, Joel Jacobson <joel@compiler.org> wrote: > > On Mon, Aug 12, 2024, at 17:14, Joel Jacobson wrote: > > The case found with the smallest rscale adjustment was this one: > > -[ RECORD 1 ]------+-------------------------------- > > var1 | 0.0000000000009873307197037692 > > var2 | 0.426697279270850 > > rscale_adjustment | -15 > > expected | 0.0000000000004212913318381285 > > numeric_mul_rscale | 0.0000000000004212913318381284 > > diff | -0.0000000000000000000000000001 > Hmm, interesting example. There will of course always be cases where the result isn't exact, but HEAD does produce the expected result in this case, and the intention is to always produce a result at least as accurate as HEAD, so it isn't working as expected. Looking more closely, the problem is that to fully compute the required guard digits, it is necessary to compute at least one extra output base-NBASE digit, because the product of base-NBASE^2 digits contributes to the next base-NBASE digit up. So instead of maxdigitpairs = (maxdigits + 1) / 2; we should do maxdigitpairs = maxdigits / 2 + 1; Additionally, since maxdigits is based on res_weight, we should actually do the res_weight adjustments for odd-length inputs before computing maxdigits. (Otherwise we're actually computing more digits than strictly necessary for odd-length inputs, so this is a minor optimisation.) Updated patch attached, which fixes the above example and all the other differences produced by your test. I think, with a little thought, it ought to be possible to produce examples that round incorrectly in a more systematic (less brute-force) way. It should then be possible to construct examples where the patch differs from HEAD, but hopefully only by being more accurate, not less. Regards, Dean
Attachment
On Tue, Aug 13, 2024, at 00:56, Dean Rasheed wrote: > On Mon, 12 Aug 2024 at 16:17, Joel Jacobson <joel@compiler.org> wrote: >> >> On Mon, Aug 12, 2024, at 17:14, Joel Jacobson wrote: >> > The case found with the smallest rscale adjustment was this one: >> > -[ RECORD 1 ]------+-------------------------------- >> > var1 | 0.0000000000009873307197037692 >> > var2 | 0.426697279270850 >> > rscale_adjustment | -15 >> > expected | 0.0000000000004212913318381285 >> > numeric_mul_rscale | 0.0000000000004212913318381284 >> > diff | -0.0000000000000000000000000001 >> > > Hmm, interesting example. There will of course always be cases where > the result isn't exact, but HEAD does produce the expected result in > this case, and the intention is to always produce a result at least as > accurate as HEAD, so it isn't working as expected. > .. > Updated patch attached, which fixes the above example and all the > other differences produced by your test. I think, with a little > thought, it ought to be possible to produce examples that round > incorrectly in a more systematic (less brute-force) way. It should > then be possible to construct examples where the patch differs from > HEAD, but hopefully only by being more accurate, not less. I reran the tests and v5 produces much fewer diffs than v4. Not sure if the remaining ones are problematic or not. joel@Joels-MBP postgresql % ./test-mul_var-init.sh HEAD is now at a67a49648d Rename C23 keyword SET DROP TABLE CREATE TABLE COPY 1413 DROP TABLE CREATE TABLE setseed --------- (1 row) INSERT 0 14130000 COPY 14130000 joel@Joels-MBP postgresql % ./test-mul_var-verify-v4.sh HEAD is now at a67a49648d Rename C23 keyword SET DROP TABLE CREATE TABLE COPY 14130000 Expanded display is on. -[ RECORD 1 ]------+-------------------------------- var1 | 0.0000000000009873307197037692 var2 | 0.426697279270850 rscale_adjustment | -15 expected | 0.0000000000004212913318381285 numeric_mul_rscale | 0.0000000000004212913318381284 diff | -0.0000000000000000000000000001 Expanded display is off. diff | count --------------+---------- 0.000e+00 | 14114384 1.000e-108 | 1 1.000e-211 | 1 1.000e-220 | 2 1.000e-228 | 6 1.000e-232 | 2 1.000e-235 | 1 1.000e-28 | 13 1.000e-36 | 1 1.000e-51 | 2 1.000e-67 | 1 1.000e-68 | 1 1.000e-80 | 1 -1.000e-1024 | 2485 -1.000e-108 | 3 -1.000e-144 | 2520 -1.000e-16 | 2514 -1.000e-228 | 4 -1.000e-232 | 1 -1.000e-27 | 36 -1.000e-28 | 538 -1.000e-32 | 2513 -1.000e-48 | 2473 -1.000e-68 | 1 -1.000e-80 | 2494 -2.000e-16 | 2 (26 rows) rscale_adjustment | count -------------------+------- -237 | 2 -235 | 1 -232 | 3 -229 | 2 -228 | 8 -218 | 1 -108 | 4 -77 | 1 -67 | 1 -51 | 2 -38 | 3 -36 | 1 -28 | 5 -22 | 42 -17 | 7 -16 | 14959 -15 | 574 (17 rows) joel@Joels-MBP postgresql % ./test-mul_var-verify-v5.sh HEAD is now at a67a49648d Rename C23 keyword SET DROP TABLE CREATE TABLE COPY 14130000 Expanded display is on. -[ RECORD 1 ]------+------------------------------- var1 | 0.0000000000000000489673392928 var2 | 6.713030439846337 rscale_adjustment | -15 expected | 0.0000000000000003287192392308 numeric_mul_rscale | 0.0000000000000003287192392309 diff | 0.0000000000000000000000000001 Expanded display is off. diff | count --------------+---------- 0.000e+00 | 14129971 1.000e-1024 | 1 1.000e-144 | 1 1.000e-16 | 1 1.000e-211 | 1 1.000e-220 | 2 1.000e-228 | 5 1.000e-232 | 1 1.000e-235 | 1 1.000e-28 | 8 1.000e-32 | 2 1.000e-36 | 1 1.000e-51 | 2 1.000e-67 | 1 1.000e-68 | 1 1.000e-80 | 1 (16 rows) rscale_adjustment | count -------------------+------- -237 | 1 -235 | 1 -232 | 1 -229 | 2 -228 | 4 -218 | 1 -77 | 1 -67 | 1 -51 | 2 -38 | 1 -36 | 1 -28 | 2 -17 | 4 -16 | 5 -15 | 2 (15 rows) Regards, Joel
On Tue, Aug 13, 2024, at 09:49, Joel Jacobson wrote: > I reran the tests and v5 produces much fewer diffs than v4. > Not sure if the remaining ones are problematic or not. Attaching scripts if needed. Regards, Joel
Attachment
On Tue, 13 Aug 2024 at 08:49, Joel Jacobson <joel@compiler.org> wrote: > > I reran the tests and v5 produces much fewer diffs than v4. > Not sure if the remaining ones are problematic or not. > > joel@Joels-MBP postgresql % ./test-mul_var-verify-v5.sh > HEAD is now at a67a49648d Rename C23 keyword > SET > DROP TABLE > CREATE TABLE > COPY 14130000 > Expanded display is on. > -[ RECORD 1 ]------+------------------------------- > var1 | 0.0000000000000000489673392928 > var2 | 6.713030439846337 > rscale_adjustment | -15 > expected | 0.0000000000000003287192392308 > numeric_mul_rscale | 0.0000000000000003287192392309 > diff | 0.0000000000000000000000000001 > Yes, that's exactly the sort of thing you'd expect to see. The exact product of var1 and var2 in that case is 0.0000_0000_0000_0003_2871_9239_2308_5000_4574_2504_736 so numeric_mul_rscale() with the patch is producing the correctly rounded result, and "expected" is the result from HEAD, which is off by 1 in the final digit. To make it easier to hit such cases, I tested with the attached test script, which intentionally produces pairs of numbers whose product contains '5' followed by 5 zeros, and rounds at the digit before the '5', so the correct answer should round up, but the truncated product is quite likely not to do so. With HEAD, this gives 710,017 out of 1,000,000 cases that are off by 1 in the final digit (always 1 too low in the final digit), and with the v5 patch, it gives 282,595 cases. Furthermore, it's an exact subset: select count(*) from diffs1; -- HEAD count -------- 710017 (1 row) pgdevel=# select count(*) from diffs2; -- v5 patch count -------- 282595 (1 row) select * from diffs2 except select * from diffs1; n | z | m | w | x | y | expected | numeric_mul_rscale ---+---+---+---+---+---+----------+-------------------- (0 rows) which is exactly what I was hoping to see (no cases where the patch made it less accurate). Regards, Dean
Attachment
On Tue, Aug 13, 2024, at 12:23, Dean Rasheed wrote: > On Tue, 13 Aug 2024 at 08:49, Joel Jacobson <joel@compiler.org> wrote: >> >> I reran the tests and v5 produces much fewer diffs than v4. >> Not sure if the remaining ones are problematic or not. ... > > Yes, that's exactly the sort of thing you'd expect to see. The exact > product of var1 and var2 in that case is > > 0.0000_0000_0000_0003_2871_9239_2308_5000_4574_2504_736 > > so numeric_mul_rscale() with the patch is producing the correctly > rounded result, and "expected" is the result from HEAD, which is off > by 1 in the final digit. > > To make it easier to hit such cases, I tested with the attached test > script, which intentionally produces pairs of numbers whose product > contains '5' followed by 5 zeros, and rounds at the digit before the > '5', so the correct answer should round up, but the truncated product > is quite likely not to do so. > > With HEAD, this gives 710,017 out of 1,000,000 cases that are off by 1 > in the final digit (always 1 too low in the final digit), and with the > v5 patch, it gives 282,595 cases. Furthermore, it's an exact subset: > > select count(*) from diffs1; -- HEAD > count > -------- > 710017 > (1 row) > > pgdevel=# select count(*) from diffs2; -- v5 patch > count > -------- > 282595 > (1 row) > > select * from diffs2 except select * from diffs1; > n | z | m | w | x | y | expected | numeric_mul_rscale > ---+---+---+---+---+---+----------+-------------------- > (0 rows) > > which is exactly what I was hoping to see (no cases where the patch > made it less accurate). Nice. I got the same results: select count(*) from diffs_head; count -------- 710017 (1 row) select count(*) from diffs_v4; count -------- 344045 (1 row) select count(*) from diffs_v5; count -------- 282595 (1 row) select count(*) from (select * from diffs_v4 except select * from diffs_head) as q; count ------- 37236 (1 row) select count(*) from (select * from diffs_v5 except select * from diffs_head) as q; count ------- 0 (1 row) I think this is acceptable, since it produces more correct results. Regards, Joel
On Tue, Aug 13, 2024, at 13:01, Joel Jacobson wrote: > I think this is acceptable, since it produces more correct results. In addition, I've traced the rscale_adjustment -15 mul_var() calls to originate from numeric_exp() and numeric_power(), so I thought it would be good to brute-force test those as well, to get an idea of the probability of different results from those functions. Brute-force testing of course doesn't prove it's impossible to happen, but millions of inputs didn't cause any observable differences in the returned results, so I think it's at least very improbable to happen in practice. Regards, Joel
Attachment
On Wed, 14 Aug 2024 at 07:31, Joel Jacobson <joel@compiler.org> wrote: > > I think this is acceptable, since it produces more correct results. > Thanks for checking. I did a bit more testing myself and didn't see any problems, so I have committed both these patches. > In addition, I've traced the rscale_adjustment -15 mul_var() calls to originate > from numeric_exp() and numeric_power(), so I thought it would be good to > brute-force test those as well, to get an idea of the probability of different > results from those functions. > > Brute-force testing of course doesn't prove it's impossible to happen, > but millions of inputs didn't cause any observable differences in the > returned results, so I think it's at least very improbable to > happen in practice. > Indeed, there certainly will be cases where the result changes. I saw some with ln(), for which HEAD rounded the final digit the wrong way, and the result is now correct, but the opposite cannot be ruled out either, since these functions are inherently inexact. The aim is to have them generate the correctly rounded result in the vast majority of cases, while accepting an occasional off-by-one error in the final digit. Having them generate the correct result in all cases is certainly possible, but would require a fair bit of additional code that probably isn't worth the effort. In my testing, exp() rounded the final digit incorrectly with a probability of roughly 1 in 50-100 million when computing results with a handful of digits (consistent with the "+8" digits added to "sig_digits"), rising to roughly 1 in 5-10 million when computing around 1000 digits (presumably because we don't take into account the number of Taylor series terms when deciding on the local rscale). That wasn't affected significantly by the patch, and it's not surprising that you saw nothing with brute-force testing. In any case, I'm pretty content with those results. Regards, Dean
Dean Rasheed <dean.a.rasheed@gmail.com> writes: > On Wed, 14 Aug 2024 at 07:31, Joel Jacobson <joel@compiler.org> wrote: >> I think this is acceptable, since it produces more correct results. > Thanks for checking. I did a bit more testing myself and didn't see > any problems, so I have committed both these patches. About a dozen buildfarm members are complaining thus (eg [1]): gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute-Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -g -O2 -ftree-vectorize-I. -I. -I../../../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o numeric.o numeric.c numeric.c: In function \342\200\230mul_var\342\200\231: numeric.c:9209:9: warning: \342\200\230carry\342\200\231 may be used uninitialized in this function [-Wmaybe-uninitialized] term = PRODSUM1(var1digits, 0, var2digits, 0) + carry; ^ numeric.c:8972:10: note: \342\200\230carry\342\200\231 was declared here uint32 carry; ^ I guess these compilers aren't able to convince themselves that the first switch must initialize "carry". regards, tom lane [1] https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=arowana&dt=2024-08-24%2004%3A19%3A29&stg=build
On Sat, 24 Aug 2024 at 19:17, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > About a dozen buildfarm members are complaining > Ah, OK. I've pushed a fix. Regards, Dean
Dean Rasheed <dean.a.rasheed@gmail.com> writes: > Ah, OK. I've pushed a fix. There is an open CF entry pointing at this thread [1]. Shouldn't it be marked committed now? regards, tom lane [1] https://commitfest.postgresql.org/49/5115/
On Tue, 3 Sept 2024 at 21:31, Tom Lane <tgl@sss.pgh.pa.us> wrote: > > Dean Rasheed <dean.a.rasheed@gmail.com> writes: > > Ah, OK. I've pushed a fix. > > There is an open CF entry pointing at this thread [1]. > Shouldn't it be marked committed now? > Oops, yes I missed that CF entry. I've closed it now. Joel, are you still planning to work on the Karatsuba multiplication patch? If not, we should close that CF entry too. Regards, Dean
On Wed, Sep 4, 2024, at 09:22, Dean Rasheed wrote: > On Tue, 3 Sept 2024 at 21:31, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> >> Dean Rasheed <dean.a.rasheed@gmail.com> writes: >> > Ah, OK. I've pushed a fix. >> >> There is an open CF entry pointing at this thread [1]. >> Shouldn't it be marked committed now? >> > > Oops, yes I missed that CF entry. I've closed it now. > > Joel, are you still planning to work on the Karatsuba multiplication > patch? If not, we should close that CF entry too. No, I think it's probably not worth it given that we have now optimises mul_var() in other ways. Will maybe have a look atit again in the future. Patch withdrawn for now. Thanks for really good guidance and help on the numeric, much fun and I've learned a lot. /Joel