Skip to content

Commit cbbd385

Browse files
rscgopherbot
authored andcommitted
strconv: remove arch-specific decision in formatBase10
There is only one architecture-specific code segment left in formatBase10. Remove it for simplicity. The only affected system is ppc64le, which does add 10-20% to the runtime, but that's a ppc64le problem, not a strconv problem. Changing the "uint32" to "uint" makes ppc64le not slower anymore, meaning that somehow uint32 divide-by-constant is slower than uint divide-by-constant on ppc64le. If this minor slowdown matters, it should be addressed by improving the generated code for ppc64le division, not by complicating strconv. Even though some percentages look big, the geomean is +6% and the worst case slowdown is only about 6ns/call. benchmark \ host local s7 s7:GOARCH=386 linux-amd64 linux-386 linux-ppc64le vs base vs base vs base vs base vs base vs base AppendFloat/Decimal ~ ~ -0.75% ~ ~ ~ AppendFloat/Float ~ ~ ~ ~ ~ ~ AppendFloat/Exp ~ ~ ~ ~ ~ ~ AppendFloat/NegExp ~ ~ ~ ~ ~ ~ AppendFloat/LongExp ~ ~ ~ ~ ~ ~ AppendFloat/Big ~ ~ ~ ~ ~ ~ AppendFloat/BinaryExp ~ ~ ~ ~ -2.92% +10.31% AppendFloat/32Integer ~ ~ ~ ~ ~ ~ AppendFloat/32ExactFraction ~ ~ -0.43% ~ ~ ~ AppendFloat/32Point ~ ~ ~ ~ ~ ~ AppendFloat/32Exp ~ ~ ~ ~ ~ ~ AppendFloat/32NegExp ~ ~ ~ ~ ~ ~ AppendFloat/32Shortest ~ ~ ~ ~ ~ ~ AppendFloat/32Fixed8Hard ~ ~ -1.12% ~ -4.19% +5.39% AppendFloat/32Fixed9Hard ~ ~ ~ ~ ~ +12.09% AppendFloat/64Fixed1 ~ ~ ~ ~ -0.78% ~ AppendFloat/64Fixed2 ~ ~ +0.53% ~ -0.74% ~ AppendFloat/64Fixed3 ~ ~ ~ ~ -0.82% ~ AppendFloat/64Fixed4 ~ ~ ~ ~ -0.63% +2.55% AppendFloat/64Fixed12 ~ ~ +0.63% -1.83% -1.01% +5.68% AppendFloat/64Fixed16 ~ ~ +0.63% ~ -1.33% ~ AppendFloat/64Fixed12Hard ~ ~ +1.31% ~ -0.34% +4.43% AppendFloat/64Fixed17Hard ~ ~ ~ ~ -1.66% +4.63% AppendFloat/64Fixed18Hard ~ ~ ~ ~ ~ ~ AppendFloat/Slowpath64 ~ ~ ~ ~ ~ ~ AppendFloat/SlowpathDenormal64 ~ ~ ~ ~ ~ ~ AppendInt ~ ~ ~ ~ -0.77% +11.06% AppendUint ~ ~ +0.42% ~ -1.35% +7.27% AppendIntSmall ~ ~ ~ ~ ~ ~ AppendUintVarlen/digits=1 ~ ~ ~ ~ ~ ~ AppendUintVarlen/digits=2 ~ ~ ~ ~ ~ +4.80% AppendUintVarlen/digits=3 ~ ~ -1.61% ~ -4.49% +10.04% AppendUintVarlen/digits=4 ~ ~ -2.09% ~ -2.88% +9.99% AppendUintVarlen/digits=5 ~ ~ -3.97% ~ -8.92% +7.19% AppendUintVarlen/digits=6 ~ ~ -3.88% ~ -7.84% +5.25% AppendUintVarlen/digits=7 ~ ~ -2.93% ~ -11.08% ~ AppendUintVarlen/digits=8 ~ ~ -2.88% ~ -10.09% +10.74% AppendUintVarlen/digits=9 ~ ~ -3.69% ~ -10.98% +11.56% AppendUintVarlen/digits=10 ~ ~ +0.90% ~ -1.09% +34.49% AppendUintVarlen/digits=11 ~ ~ +2.11% ~ +0.72% +20.63% AppendUintVarlen/digits=12 ~ ~ +1.21% ~ -2.26% +27.38% AppendUintVarlen/digits=13 ~ ~ +2.07% ~ -2.13% +15.37% AppendUintVarlen/digits=14 ~ ~ ~ ~ -3.27% +19.32% AppendUintVarlen/digits=15 ~ ~ +0.56% ~ -3.18% +8.55% AppendUintVarlen/digits=16 ~ ~ ~ ~ -4.31% +15.69% AppendUintVarlen/digits=17 ~ ~ ~ ~ -4.50% +7.61% AppendUintVarlen/digits=18 ~ ~ ~ ~ -5.54% +12.74% AppendUintVarlen/digits=19 ~ ~ +0.87% ~ +0.41% +13.82% AppendUintVarlen/digits=20 ~ ~ +1.40% ~ +0.82% +15.80% host: local │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-12 21.04n ± 2% 21.10n ± 0% ~ (p=0.542 n=20) AppendFloat/Float-12 32.77n ± 1% 32.56n ± 0% ~ (p=0.213 n=20) AppendFloat/Exp-12 32.42n ± 1% 32.42n ± 0% ~ (p=0.995 n=20) AppendFloat/NegExp-12 31.78n ± 2% 31.79n ± 2% ~ (p=0.542 n=20) AppendFloat/LongExp-12 31.54n ± 1% 31.45n ± 1% ~ (p=0.507 n=20) AppendFloat/Big-12 33.75n ± 1% 33.59n ± 1% ~ (p=0.597 n=20) AppendFloat/BinaryExp-12 19.16n ± 1% 19.14n ± 1% ~ (p=0.635 n=20) AppendFloat/32Integer-12 21.59n ± 1% 21.63n ± 1% ~ (p=0.569 n=20) AppendFloat/32ExactFraction-12 31.12n ± 1% 31.17n ± 1% ~ (p=0.337 n=20) AppendFloat/32Point-12 31.11n ± 1% 31.13n ± 0% ~ (p=0.899 n=20) AppendFloat/32Exp-12 32.27n ± 0% 32.24n ± 1% ~ (p=0.794 n=20) AppendFloat/32NegExp-12 30.56n ± 1% 30.64n ± 1% ~ (p=0.899 n=20) AppendFloat/32Shortest-12 26.88n ± 0% 27.11n ± 1% ~ (p=0.001 n=20) AppendFloat/32Fixed8Hard-12 20.63n ± 1% 20.63n ± 0% ~ (p=0.596 n=20) AppendFloat/32Fixed9Hard-12 22.69n ± 1% 22.81n ± 1% ~ (p=0.763 n=20) AppendFloat/64Fixed1-12 18.65n ± 0% 18.73n ± 1% ~ (p=0.112 n=20) AppendFloat/64Fixed2-12 18.91n ± 1% 18.88n ± 0% ~ (p=0.569 n=20) AppendFloat/64Fixed3-12 18.73n ± 1% 18.60n ± 0% ~ (p=0.003 n=20) AppendFloat/64Fixed4-12 17.87n ± 3% 17.84n ± 1% ~ (p=0.569 n=20) AppendFloat/64Fixed12-12 28.18n ± 0% 28.30n ± 0% ~ (p=0.010 n=20) AppendFloat/64Fixed16-12 24.38n ± 1% 24.34n ± 1% ~ (p=0.683 n=20) AppendFloat/64Fixed12Hard-12 21.61n ± 0% 21.63n ± 1% ~ (p=0.542 n=20) AppendFloat/64Fixed17Hard-12 27.02n ± 1% 26.94n ± 0% ~ (p=0.077 n=20) AppendFloat/64Fixed18Hard-12 2.179µ ± 1% 2.189µ ± 1% ~ (p=0.337 n=20) AppendFloat/Slowpath64-12 29.93n ± 1% 30.01n ± 1% ~ (p=0.402 n=20) AppendFloat/SlowpathDenormal64-12 28.29n ± 1% 28.35n ± 0% ~ (p=0.952 n=20) AppendInt-12 400.7n ± 1% 401.8n ± 1% ~ (p=0.176 n=20) AppendUint-12 95.87n ± 1% 96.06n ± 1% ~ (p=0.208 n=20) AppendIntSmall-12 3.450n ± 0% 3.455n ± 1% ~ (p=0.203 n=20) AppendUintVarlen/digits=1-12 3.150n ± 1% 3.175n ± 1% ~ (p=0.147 n=20) AppendUintVarlen/digits=2-12 2.654n ± 0% 2.667n ± 1% ~ (p=0.003 n=20) AppendUintVarlen/digits=3-12 5.044n ± 0% 5.069n ± 0% ~ (p=0.026 n=20) AppendUintVarlen/digits=4-12 5.046n ± 0% 5.047n ± 1% ~ (p=0.408 n=20) AppendUintVarlen/digits=5-12 5.851n ± 0% 5.860n ± 1% ~ (p=0.132 n=20) AppendUintVarlen/digits=6-12 6.118n ± 0% 6.120n ± 0% ~ (p=0.888 n=20) AppendUintVarlen/digits=7-12 7.333n ± 0% 7.334n ± 0% ~ (p=0.588 n=20) AppendUintVarlen/digits=8-12 7.312n ± 1% 7.322n ± 0% ~ (p=0.805 n=20) AppendUintVarlen/digits=9-12 7.832n ± 1% 7.838n ± 1% ~ (p=0.465 n=20) AppendUintVarlen/digits=10-12 8.606n ± 1% 8.602n ± 1% ~ (p=0.974 n=20) AppendUintVarlen/digits=11-12 8.908n ± 0% 8.899n ± 1% ~ (p=0.931 n=20) AppendUintVarlen/digits=12-12 9.178n ± 0% 9.118n ± 0% ~ (p=0.007 n=20) AppendUintVarlen/digits=13-12 9.398n ± 1% 9.405n ± 1% ~ (p=0.888 n=20) AppendUintVarlen/digits=14-12 10.24n ± 0% 10.22n ± 0% ~ (p=0.154 n=20) AppendUintVarlen/digits=15-12 10.50n ± 0% 10.48n ± 0% ~ (p=0.692 n=20) AppendUintVarlen/digits=16-12 11.66n ± 0% 11.75n ± 2% ~ (p=0.087 n=20) AppendUintVarlen/digits=17-12 11.65n ± 0% 11.72n ± 1% ~ (p=0.079 n=20) AppendUintVarlen/digits=18-12 12.38n ± 1% 12.42n ± 2% ~ (p=0.035 n=20) AppendUintVarlen/digits=19-12 13.59n ± 1% 13.60n ± 0% ~ (p=0.673 n=20) AppendUintVarlen/digits=20-12 13.85n ± 1% 13.84n ± 0% ~ (p=0.634 n=20) geomean 17.99n 18.01n +0.09% host: s7 │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-32 22.24n ± 0% 22.20n ± 0% ~ (p=0.143 n=20) AppendFloat/Float-32 34.70n ± 0% 34.59n ± 0% ~ (p=0.057 n=20) AppendFloat/Exp-32 34.85n ± 0% 34.77n ± 0% ~ (p=0.051 n=20) AppendFloat/NegExp-32 35.19n ± 0% 35.17n ± 0% ~ (p=0.533 n=20) AppendFloat/LongExp-32 36.80n ± 0% 36.78n ± 0% ~ (p=0.941 n=20) AppendFloat/Big-32 38.63n ± 0% 38.71n ± 0% ~ (p=0.143 n=20) AppendFloat/BinaryExp-32 17.39n ± 0% 17.36n ± 0% ~ (p=0.049 n=20) AppendFloat/32Integer-32 22.29n ± 0% 22.23n ± 0% ~ (p=0.068 n=20) AppendFloat/32ExactFraction-32 33.52n ± 0% 33.44n ± 0% ~ (p=0.058 n=20) AppendFloat/32Point-32 32.96n ± 0% 32.93n ± 0% ~ (p=0.256 n=20) AppendFloat/32Exp-32 35.31n ± 0% 35.24n ± 0% ~ (p=0.014 n=20) AppendFloat/32NegExp-32 33.56n ± 0% 33.50n ± 0% ~ (p=0.032 n=20) AppendFloat/32Shortest-32 30.03n ± 0% 29.97n ± 0% ~ (p=0.351 n=20) AppendFloat/32Fixed8Hard-32 22.93n ± 0% 22.94n ± 0% ~ (p=0.920 n=20) AppendFloat/32Fixed9Hard-32 26.27n ± 0% 26.22n ± 0% ~ (p=0.693 n=20) AppendFloat/64Fixed1-32 21.15n ± 0% 21.09n ± 0% ~ (p=0.006 n=20) AppendFloat/64Fixed2-32 20.75n ± 0% 20.75n ± 0% ~ (p=0.898 n=20) AppendFloat/64Fixed3-32 21.29n ± 0% 21.28n ± 0% ~ (p=0.524 n=20) AppendFloat/64Fixed4-32 20.59n ± 0% 20.63n ± 0% ~ (p=0.350 n=20) AppendFloat/64Fixed12-32 32.53n ± 0% 32.51n ± 0% ~ (p=0.804 n=20) AppendFloat/64Fixed16-32 28.43n ± 0% 28.34n ± 0% ~ (p=0.060 n=20) AppendFloat/64Fixed12Hard-32 27.27n ± 0% 27.22n ± 0% ~ (p=0.056 n=20) AppendFloat/64Fixed17Hard-32 30.76n ± 0% 30.70n ± 0% ~ (p=0.304 n=20) AppendFloat/64Fixed18Hard-32 1.812µ ± 0% 1.806µ ± 1% ~ (p=0.216 n=20) AppendFloat/Slowpath64-32 35.48n ± 0% 35.43n ± 0% ~ (p=0.129 n=20) AppendFloat/SlowpathDenormal64-32 35.62n ± 0% 35.60n ± 0% ~ (p=0.273 n=20) AppendInt-32 387.5n ± 0% 387.9n ± 0% ~ (p=0.417 n=20) AppendUint-32 104.9n ± 0% 104.9n ± 0% ~ (p=0.641 n=20) AppendIntSmall-32 3.329n ± 5% 3.489n ± 5% ~ (p=0.723 n=20) AppendUintVarlen/digits=1-32 2.396n ± 7% 2.398n ± 8% ~ (p=0.409 n=20) AppendUintVarlen/digits=2-32 2.399n ± 7% 2.315n ± 4% ~ (p=0.386 n=20) AppendUintVarlen/digits=3-32 5.516n ± 0% 5.506n ± 0% ~ (p=0.026 n=20) AppendUintVarlen/digits=4-32 5.515n ± 0% 5.510n ± 0% ~ (p=0.291 n=20) AppendUintVarlen/digits=5-32 5.748n ± 1% 5.731n ± 0% ~ (p=0.014 n=20) AppendUintVarlen/digits=6-32 5.873n ± 0% 5.853n ± 0% ~ (p=0.011 n=20) AppendUintVarlen/digits=7-32 6.460n ± 0% 6.444n ± 0% ~ (p=0.041 n=20) AppendUintVarlen/digits=8-32 6.457n ± 0% 6.446n ± 0% ~ (p=0.047 n=20) AppendUintVarlen/digits=9-32 7.377n ± 0% 7.373n ± 0% ~ (p=0.569 n=20) AppendUintVarlen/digits=10-32 8.496n ± 0% 8.492n ± 0% ~ (p=0.525 n=20) AppendUintVarlen/digits=11-32 8.674n ± 0% 8.653n ± 0% ~ (p=0.060 n=20) AppendUintVarlen/digits=12-32 9.416n ± 0% 9.386n ± 0% ~ (p=0.035 n=20) AppendUintVarlen/digits=13-32 9.621n ± 0% 9.594n ± 0% ~ (p=0.069 n=20) AppendUintVarlen/digits=14-32 10.34n ± 0% 10.35n ± 0% ~ (p=0.332 n=20) AppendUintVarlen/digits=15-32 10.48n ± 0% 10.52n ± 0% ~ (p=0.196 n=20) AppendUintVarlen/digits=16-32 11.27n ± 0% 11.27n ± 0% ~ (p=0.445 n=20) AppendUintVarlen/digits=17-32 11.50n ± 0% 11.48n ± 0% ~ (p=0.283 n=20) AppendUintVarlen/digits=18-32 12.15n ± 0% 12.18n ± 0% ~ (p=0.414 n=20) AppendUintVarlen/digits=19-32 13.42n ± 0% 13.42n ± 0% ~ (p=0.782 n=20) AppendUintVarlen/digits=20-32 13.70n ± 0% 13.71n ± 0% ~ (p=0.540 n=20) geomean 18.71n 18.70n -0.08% host: s7:GOARCH=386 │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-32 42.03n ± 0% 41.71n ± 1% -0.75% (p=0.000 n=20) AppendFloat/Float-32 69.99n ± 0% 69.85n ± 0% ~ (p=0.062 n=20) AppendFloat/Exp-32 73.07n ± 0% 73.13n ± 0% ~ (p=0.240 n=20) AppendFloat/NegExp-32 72.75n ± 0% 72.72n ± 0% ~ (p=0.298 n=20) AppendFloat/LongExp-32 74.20n ± 0% 74.13n ± 0% ~ (p=0.952 n=20) AppendFloat/Big-32 82.88n ± 0% 82.91n ± 0% ~ (p=0.909 n=20) AppendFloat/BinaryExp-32 32.12n ± 0% 32.23n ± 0% ~ (p=0.014 n=20) AppendFloat/32Integer-32 41.18n ± 0% 41.15n ± 0% ~ (p=0.212 n=20) AppendFloat/32ExactFraction-32 62.65n ± 0% 62.38n ± 0% -0.43% (p=0.000 n=20) AppendFloat/32Point-32 59.98n ± 0% 59.82n ± 0% ~ (p=0.109 n=20) AppendFloat/32Exp-32 72.62n ± 0% 72.69n ± 0% ~ (p=0.417 n=20) AppendFloat/32NegExp-32 62.36n ± 0% 62.49n ± 0% ~ (p=0.578 n=20) AppendFloat/32Shortest-32 58.03n ± 0% 57.95n ± 0% ~ (p=0.615 n=20) AppendFloat/32Fixed8Hard-32 36.75n ± 0% 36.34n ± 0% -1.12% (p=0.000 n=20) AppendFloat/32Fixed9Hard-32 53.83n ± 0% 53.96n ± 0% ~ (p=0.126 n=20) AppendFloat/64Fixed1-32 48.52n ± 0% 48.72n ± 0% ~ (p=0.075 n=20) AppendFloat/64Fixed2-32 46.50n ± 0% 46.74n ± 0% +0.53% (p=0.000 n=20) AppendFloat/64Fixed3-32 46.43n ± 0% 46.24n ± 1% ~ (p=0.147 n=20) AppendFloat/64Fixed4-32 42.52n ± 0% 42.69n ± 0% ~ (p=0.038 n=20) AppendFloat/64Fixed12-32 54.51n ± 1% 54.85n ± 0% +0.63% (p=0.000 n=20) AppendFloat/64Fixed16-32 52.61n ± 0% 52.94n ± 0% +0.63% (p=0.000 n=20) AppendFloat/64Fixed12Hard-32 50.78n ± 0% 51.45n ± 0% +1.31% (p=0.000 n=20) AppendFloat/64Fixed17Hard-32 59.91n ± 0% 59.91n ± 0% ~ (p=0.713 n=20) AppendFloat/64Fixed18Hard-32 3.984µ ± 1% 4.000µ ± 1% ~ (p=0.569 n=20) AppendFloat/Slowpath64-32 73.42n ± 0% 73.37n ± 0% ~ (p=0.425 n=20) AppendFloat/SlowpathDenormal64-32 73.27n ± 0% 73.36n ± 0% ~ (p=0.298 n=20) AppendInt-32 1.036µ ± 1% 1.041µ ± 1% ~ (p=0.024 n=20) AppendUint-32 261.1n ± 0% 262.1n ± 1% +0.42% (p=0.000 n=20) AppendIntSmall-32 5.515n ± 0% 5.506n ± 0% ~ (p=0.394 n=20) AppendUintVarlen/digits=1-32 3.679n ± 0% 3.685n ± 0% ~ (p=0.815 n=20) AppendUintVarlen/digits=2-32 3.683n ± 0% 3.687n ± 0% ~ (p=0.899 n=20) AppendUintVarlen/digits=3-32 8.988n ± 2% 8.843n ± 1% -1.61% (p=0.000 n=20) AppendUintVarlen/digits=4-32 9.300n ± 1% 9.106n ± 1% -2.09% (p=0.000 n=20) AppendUintVarlen/digits=5-32 10.235n ± 1% 9.829n ± 1% -3.97% (p=0.000 n=20) AppendUintVarlen/digits=6-32 10.44n ± 1% 10.03n ± 0% -3.88% (p=0.000 n=20) AppendUintVarlen/digits=7-32 11.27n ± 1% 10.94n ± 1% -2.93% (p=0.000 n=20) AppendUintVarlen/digits=8-32 11.46n ± 1% 11.13n ± 1% -2.88% (p=0.000 n=20) AppendUintVarlen/digits=9-32 12.74n ± 0% 12.27n ± 1% -3.69% (p=0.000 n=20) AppendUintVarlen/digits=10-32 15.57n ± 0% 15.71n ± 1% +0.90% (p=0.000 n=20) AppendUintVarlen/digits=11-32 15.65n ± 1% 15.98n ± 0% +2.11% (p=0.000 n=20) AppendUintVarlen/digits=12-32 16.54n ± 0% 16.73n ± 0% +1.21% (p=0.000 n=20) AppendUintVarlen/digits=13-32 16.69n ± 0% 17.04n ± 0% +2.07% (p=0.000 n=20) AppendUintVarlen/digits=14-32 17.52n ± 1% 17.62n ± 0% ~ (p=0.005 n=20) AppendUintVarlen/digits=15-32 17.76n ± 0% 17.86n ± 0% +0.56% (p=0.001 n=20) AppendUintVarlen/digits=16-32 18.68n ± 1% 18.59n ± 0% ~ (p=0.006 n=20) AppendUintVarlen/digits=17-32 18.78n ± 1% 18.74n ± 0% ~ (p=0.040 n=20) AppendUintVarlen/digits=18-32 19.63n ± 1% 19.54n ± 0% ~ (p=0.202 n=20) AppendUintVarlen/digits=19-32 24.02n ± 1% 24.23n ± 1% +0.87% (p=0.000 n=20) AppendUintVarlen/digits=20-32 23.87n ± 1% 24.20n ± 1% +1.40% (p=0.000 n=20) geomean 35.08n 35.00n -0.21% host: linux-amd64 │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-16 62.16n ± 1% 61.81n ± 0% ~ (p=0.060 n=20) AppendFloat/Float-16 91.66n ± 1% 91.22n ± 1% ~ (p=0.606 n=20) AppendFloat/Exp-16 95.42n ± 2% 95.22n ± 1% ~ (p=0.417 n=20) AppendFloat/NegExp-16 96.88n ± 1% 95.89n ± 1% ~ (p=0.185 n=20) AppendFloat/LongExp-16 102.0n ± 1% 101.6n ± 1% ~ (p=0.794 n=20) AppendFloat/Big-16 110.8n ± 1% 110.8n ± 1% ~ (p=0.984 n=20) AppendFloat/BinaryExp-16 46.33n ± 1% 46.19n ± 1% ~ (p=0.723 n=20) AppendFloat/32Integer-16 62.62n ± 2% 61.88n ± 1% ~ (p=0.286 n=20) AppendFloat/32ExactFraction-16 89.09n ± 3% 88.25n ± 2% ~ (p=0.101 n=20) AppendFloat/32Point-16 86.17n ± 1% 86.90n ± 1% ~ (p=0.251 n=20) AppendFloat/32Exp-16 101.7n ± 1% 101.2n ± 1% ~ (p=0.379 n=20) AppendFloat/32NegExp-16 92.17n ± 1% 92.81n ± 1% ~ (p=0.165 n=20) AppendFloat/32Shortest-16 82.38n ± 1% 82.89n ± 1% ~ (p=0.185 n=20) AppendFloat/32Fixed8Hard-16 60.32n ± 1% 60.41n ± 1% ~ (p=0.337 n=20) AppendFloat/32Fixed9Hard-16 69.58n ± 1% 69.22n ± 1% ~ (p=0.794 n=20) AppendFloat/64Fixed1-16 57.56n ± 1% 57.65n ± 1% ~ (p=0.597 n=20) AppendFloat/64Fixed2-16 55.84n ± 1% 55.54n ± 1% ~ (p=0.059 n=20) AppendFloat/64Fixed3-16 57.12n ± 2% 56.55n ± 1% ~ (p=0.449 n=20) AppendFloat/64Fixed4-16 55.38n ± 2% 54.50n ± 2% ~ (p=0.010 n=20) AppendFloat/64Fixed12-16 88.28n ± 1% 86.67n ± 1% -1.83% (p=0.000 n=20) AppendFloat/64Fixed16-16 73.41n ± 1% 73.56n ± 2% ~ (p=0.794 n=20) AppendFloat/64Fixed12Hard-16 72.08n ± 1% 71.71n ± 1% ~ (p=0.116 n=20) AppendFloat/64Fixed17Hard-16 79.78n ± 1% 79.78n ± 1% ~ (p=0.224 n=20) AppendFloat/64Fixed18Hard-16 4.720µ ± 1% 4.746µ ± 1% ~ (p=0.877 n=20) AppendFloat/Slowpath64-16 98.71n ± 1% 98.79n ± 1% ~ (p=0.678 n=20) AppendFloat/SlowpathDenormal64-16 97.58n ± 2% 98.16n ± 2% ~ (p=0.862 n=20) AppendInt-16 1.185µ ± 1% 1.194µ ± 1% ~ (p=0.457 n=20) AppendUint-16 292.6n ± 1% 293.9n ± 1% ~ (p=0.351 n=20) AppendIntSmall-16 7.197n ± 1% 7.203n ± 1% ~ (p=0.952 n=20) AppendUintVarlen/digits=1-16 5.905n ± 1% 5.897n ± 2% ~ (p=0.474 n=20) AppendUintVarlen/digits=2-16 5.770n ± 1% 5.733n ± 1% ~ (p=0.180 n=20) AppendUintVarlen/digits=3-16 14.00n ± 2% 14.00n ± 1% ~ (p=0.909 n=20) AppendUintVarlen/digits=4-16 13.99n ± 1% 14.03n ± 1% ~ (p=0.578 n=20) AppendUintVarlen/digits=5-16 15.88n ± 2% 15.83n ± 1% ~ (p=0.542 n=20) AppendUintVarlen/digits=6-16 16.25n ± 1% 16.30n ± 1% ~ (p=0.899 n=20) AppendUintVarlen/digits=7-16 17.66n ± 1% 17.70n ± 1% ~ (p=0.440 n=20) AppendUintVarlen/digits=8-16 18.54n ± 1% 18.58n ± 2% ~ (p=0.262 n=20) AppendUintVarlen/digits=9-16 20.25n ± 2% 20.43n ± 1% ~ (p=0.007 n=20) AppendUintVarlen/digits=10-16 23.88n ± 1% 24.00n ± 1% ~ (p=0.473 n=20) AppendUintVarlen/digits=11-16 24.42n ± 1% 24.57n ± 2% ~ (p=0.743 n=20) AppendUintVarlen/digits=12-16 25.54n ± 2% 25.88n ± 1% ~ (p=0.499 n=20) AppendUintVarlen/digits=13-16 26.55n ± 1% 26.60n ± 1% ~ (p=0.774 n=20) AppendUintVarlen/digits=14-16 28.18n ± 1% 28.16n ± 1% ~ (p=0.606 n=20) AppendUintVarlen/digits=15-16 28.66n ± 1% 28.85n ± 0% ~ (p=0.031 n=20) AppendUintVarlen/digits=16-16 29.84n ± 1% 30.00n ± 1% ~ (p=0.151 n=20) AppendUintVarlen/digits=17-16 30.54n ± 1% 30.60n ± 1% ~ (p=0.952 n=20) AppendUintVarlen/digits=18-16 32.01n ± 1% 32.26n ± 2% ~ (p=0.239 n=20) AppendUintVarlen/digits=19-16 35.50n ± 1% 35.56n ± 1% ~ (p=0.256 n=20) AppendUintVarlen/digits=20-16 35.94n ± 1% 35.96n ± 1% ~ (p=0.867 n=20) geomean 50.35n 50.35n -0.01% host: linux-386 │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-16 122.9n ± 0% 122.9n ± 0% ~ (p=0.351 n=20) AppendFloat/Float-16 226.7n ± 0% 227.1n ± 0% ~ (p=0.003 n=20) AppendFloat/Exp-16 238.3n ± 0% 238.3n ± 0% ~ (p=0.301 n=20) AppendFloat/NegExp-16 239.2n ± 0% 239.5n ± 0% ~ (p=0.015 n=20) AppendFloat/LongExp-16 237.6n ± 0% 237.8n ± 0% ~ (p=0.357 n=20) AppendFloat/Big-16 275.6n ± 0% 275.7n ± 0% ~ (p=0.576 n=20) AppendFloat/BinaryExp-16 90.33n ± 0% 87.69n ± 0% -2.92% (p=0.000 n=20) AppendFloat/32Integer-16 121.7n ± 0% 121.8n ± 0% ~ (p=0.340 n=20) AppendFloat/32ExactFraction-16 209.4n ± 0% 209.4n ± 0% ~ (p=0.566 n=20) AppendFloat/32Point-16 196.1n ± 0% 196.5n ± 0% ~ (p=0.036 n=20) AppendFloat/32Exp-16 246.3n ± 0% 246.4n ± 0% ~ (p=0.407 n=20) AppendFloat/32NegExp-16 205.4n ± 0% 205.4n ± 0% ~ (p=0.221 n=20) AppendFloat/32Shortest-16 187.8n ± 0% 187.8n ± 0% ~ (p=0.671 n=20) AppendFloat/32Fixed8Hard-16 112.3n ± 0% 107.6n ± 0% -4.19% (p=0.000 n=20) AppendFloat/32Fixed9Hard-16 182.3n ± 0% 182.1n ± 0% ~ (p=0.098 n=20) AppendFloat/64Fixed1-16 167.0n ± 0% 165.7n ± 0% -0.78% (p=0.000 n=20) AppendFloat/64Fixed2-16 161.9n ± 0% 160.7n ± 0% -0.74% (p=0.000 n=20) AppendFloat/64Fixed3-16 157.7n ± 0% 156.4n ± 0% -0.82% (p=0.000 n=20) AppendFloat/64Fixed4-16 134.4n ± 0% 133.5n ± 0% -0.63% (p=0.000 n=20) AppendFloat/64Fixed12-16 178.2n ± 0% 176.4n ± 0% -1.01% (p=0.000 n=20) AppendFloat/64Fixed16-16 168.7n ± 0% 166.4n ± 0% -1.33% (p=0.000 n=20) AppendFloat/64Fixed12Hard-16 162.8n ± 0% 162.2n ± 0% -0.34% (p=0.000 n=20) AppendFloat/64Fixed17Hard-16 201.9n ± 0% 198.6n ± 0% -1.66% (p=0.000 n=20) AppendFloat/64Fixed18Hard-16 14.45µ ± 0% 14.46µ ± 0% ~ (p=0.189 n=20) AppendFloat/Slowpath64-16 232.8n ± 0% 232.8n ± 0% ~ (p=0.995 n=20) AppendFloat/SlowpathDenormal64-16 229.0n ± 0% 228.9n ± 0% ~ (p=0.605 n=20) AppendInt-16 3.123µ ± 0% 3.099µ ± 0% -0.77% (p=0.000 n=20) AppendUint-16 832.0n ± 0% 820.8n ± 0% -1.35% (p=0.000 n=20) AppendIntSmall-16 13.27n ± 0% 13.28n ± 0% ~ (p=0.127 n=20) AppendUintVarlen/digits=1-16 10.19n ± 0% 10.20n ± 0% ~ (p=0.414 n=20) AppendUintVarlen/digits=2-16 10.19n ± 0% 10.19n ± 0% ~ (p=0.700 n=20) AppendUintVarlen/digits=3-16 21.47n ± 0% 20.51n ± 0% -4.49% (p=0.000 n=20) AppendUintVarlen/digits=4-16 21.68n ± 0% 21.05n ± 0% -2.88% (p=0.000 n=20) AppendUintVarlen/digits=5-16 26.28n ± 0% 23.94n ± 0% -8.92% (p=0.000 n=20) AppendUintVarlen/digits=6-16 26.77n ± 0% 24.67n ± 0% -7.84% (p=0.000 n=20) AppendUintVarlen/digits=7-16 30.65n ± 0% 27.25n ± 0% -11.08% (p=0.000 n=20) AppendUintVarlen/digits=8-16 31.27n ± 0% 28.11n ± 0% -10.09% (p=0.000 n=20) AppendUintVarlen/digits=9-16 36.55n ± 0% 32.53n ± 0% -10.98% (p=0.000 n=20) AppendUintVarlen/digits=10-16 42.53n ± 0% 42.06n ± 0% -1.09% (p=0.000 n=20) AppendUintVarlen/digits=11-16 42.21n ± 0% 42.51n ± 0% +0.72% (p=0.000 n=20) AppendUintVarlen/digits=12-16 45.44n ± 0% 44.41n ± 0% -2.26% (p=0.000 n=20) AppendUintVarlen/digits=13-16 46.04n ± 0% 45.06n ± 0% -2.13% (p=0.000 n=20) AppendUintVarlen/digits=14-16 49.35n ± 0% 47.73n ± 0% -3.27% (p=0.000 n=20) AppendUintVarlen/digits=15-16 50.04n ± 0% 48.45n ± 0% -3.18% (p=0.000 n=20) AppendUintVarlen/digits=16-16 53.51n ± 0% 51.21n ± 0% -4.31% (p=0.000 n=20) AppendUintVarlen/digits=17-16 53.60n ± 0% 51.19n ± 0% -4.50% (p=0.000 n=20) AppendUintVarlen/digits=18-16 57.21n ± 0% 54.03n ± 0% -5.54% (p=0.000 n=20) AppendUintVarlen/digits=19-16 64.41n ± 0% 64.68n ± 0% +0.41% (p=0.000 n=20) AppendUintVarlen/digits=20-16 64.51n ± 0% 65.04n ± 0% +0.82% (p=0.000 n=20) geomean 104.9n 102.8n -2.02% host: linux-ppc64le │ e8ffcf3095c │ 3c5742b667a │ │ sec/op │ sec/op vs base │ AppendFloat/Decimal-5 53.78n ± 1% 53.62n ± 1% ~ (p=0.588 n=20) AppendFloat/Float-5 76.29n ± 2% 75.77n ± 2% ~ (p=0.402 n=20) AppendFloat/Exp-5 83.73n ± 0% 82.25n ± 2% ~ (p=0.009 n=20) AppendFloat/NegExp-5 84.22n ± 1% 83.15n ± 1% ~ (p=0.031 n=20) AppendFloat/LongExp-5 88.66n ± 1% 88.34n ± 1% ~ (p=0.213 n=20) AppendFloat/Big-5 93.25n ± 0% 92.73n ± 1% ~ (p=0.007 n=20) AppendFloat/BinaryExp-5 40.69n ± 0% 44.88n ± 1% +10.31% (p=0.000 n=20) AppendFloat/32Integer-5 54.17n ± 0% 54.39n ± 1% ~ (p=0.245 n=20) AppendFloat/32ExactFraction-5 79.89n ± 1% 79.41n ± 1% ~ (p=0.457 n=20) AppendFloat/32Point-5 74.81n ± 1% 74.89n ± 0% ~ (p=0.625 n=20) AppendFloat/32Exp-5 85.59n ± 1% 85.42n ± 1% ~ (p=0.331 n=20) AppendFloat/32NegExp-5 82.74n ± 1% 82.22n ± 1% ~ (p=0.025 n=20) AppendFloat/32Shortest-5 69.72n ± 0% 69.79n ± 1% ~ (p=0.625 n=20) AppendFloat/32Fixed8Hard-5 54.60n ± 0% 57.54n ± 0% +5.39% (p=0.000 n=20) AppendFloat/32Fixed9Hard-5 58.49n ± 1% 65.56n ± 0% +12.09% (p=0.000 n=20) AppendFloat/64Fixed1-5 47.07n ± 1% 47.81n ± 1% ~ (p=0.002 n=20) AppendFloat/64Fixed2-5 47.88n ± 1% 48.52n ± 1% ~ (p=0.007 n=20) AppendFloat/64Fixed3-5 47.47n ± 1% 48.32n ± 1% ~ (p=0.007 n=20) AppendFloat/64Fixed4-5 45.12n ± 1% 46.26n ± 1% +2.55% (p=0.000 n=20) AppendFloat/64Fixed12-5 79.27n ± 0% 83.78n ± 1% +5.68% (p=0.000 n=20) AppendFloat/64Fixed16-5 69.28n ± 1% 70.69n ± 0% ~ (p=0.001 n=20) AppendFloat/64Fixed12Hard-5 65.42n ± 0% 68.31n ± 1% +4.43% (p=0.000 n=20) AppendFloat/64Fixed17Hard-5 73.89n ± 0% 77.30n ± 1% +4.63% (p=0.000 n=20) AppendFloat/64Fixed18Hard-5 5.163µ ± 1% 5.169µ ± 0% ~ (p=0.733 n=20) AppendFloat/Slowpath64-5 86.31n ± 1% 86.70n ± 2% ~ (p=0.578 n=20) AppendFloat/SlowpathDenormal64-5 83.10n ± 1% 82.97n ± 1% ~ (p=0.218 n=20) AppendInt-5 1.013µ ± 1% 1.125µ ± 0% +11.06% (p=0.000 n=20) AppendUint-5 268.2n ± 0% 287.7n ± 1% +7.27% (p=0.000 n=20) AppendIntSmall-5 6.644n ± 3% 6.936n ± 2% ~ (p=0.023 n=20) AppendUintVarlen/digits=1-5 5.556n ± 4% 5.381n ± 3% ~ (p=0.108 n=20) AppendUintVarlen/digits=2-5 5.165n ± 1% 5.413n ± 1% +4.80% (p=0.000 n=20) AppendUintVarlen/digits=3-5 10.26n ± 1% 11.29n ± 2% +10.04% (p=0.000 n=20) AppendUintVarlen/digits=4-5 10.11n ± 1% 11.12n ± 1% +9.99% (p=0.000 n=20) AppendUintVarlen/digits=5-5 12.37n ± 2% 13.26n ± 1% +7.19% (p=0.000 n=20) AppendUintVarlen/digits=6-5 12.85n ± 3% 13.52n ± 1% +5.25% (p=0.000 n=20) AppendUintVarlen/digits=7-5 15.46n ± 7% 16.52n ± 1% ~ (p=0.005 n=20) AppendUintVarlen/digits=8-5 14.99n ± 1% 16.60n ± 1% +10.74% (p=0.000 n=20) AppendUintVarlen/digits=9-5 18.13n ± 1% 20.23n ± 1% +11.56% (p=0.000 n=20) AppendUintVarlen/digits=10-5 19.05n ± 3% 25.62n ± 1% +34.49% (p=0.000 n=20) AppendUintVarlen/digits=11-5 21.64n ± 2% 26.11n ± 1% +20.63% (p=0.000 n=20) AppendUintVarlen/digits=12-5 21.91n ± 1% 27.91n ± 0% +27.38% (p=0.000 n=20) AppendUintVarlen/digits=13-5 24.60n ± 1% 28.38n ± 1% +15.37% (p=0.000 n=20) AppendUintVarlen/digits=14-5 25.80n ± 1% 30.79n ± 0% +19.32% (p=0.000 n=20) AppendUintVarlen/digits=15-5 28.90n ± 1% 31.38n ± 3% +8.55% (p=0.000 n=20) AppendUintVarlen/digits=16-5 28.13n ± 2% 32.54n ± 0% +15.69% (p=0.000 n=20) AppendUintVarlen/digits=17-5 30.82n ± 1% 33.16n ± 1% +7.61% (p=0.000 n=20) AppendUintVarlen/digits=18-5 32.03n ± 0% 36.12n ± 1% +12.74% (p=0.000 n=20) AppendUintVarlen/digits=19-5 35.99n ± 3% 40.97n ± 1% +13.82% (p=0.000 n=20) AppendUintVarlen/digits=20-5 35.15n ± 1% 40.71n ± 0% +15.80% (p=0.000 n=20) geomean 44.34n 47.15n +6.34% Change-Id: Ia6a3971a76f39d6187b10d6944071ee1c1b47316 Reviewed-on: https://go-review.googlesource.com/c/go/+/716462 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Alan Donovan <adonovan@google.com> Auto-Submit: Russ Cox <rsc@golang.org>
1 parent 6aca04a commit cbbd385

File tree

1 file changed

+7
-38
lines changed

1 file changed

+7
-38
lines changed

src/internal/strconv/itoa.go

Lines changed: 7 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,7 @@
44

55
package strconv
66

7-
import (
8-
"internal/goarch"
9-
"math/bits"
10-
)
7+
import "math/bits"
118

129
// FormatUint returns the string representation of i in the given base,
1310
// for 2 <= base <= 36. The result uses the lower-case letters 'a' to 'z'
@@ -184,41 +181,13 @@ func small(i int) string {
184181
//
185182
// the decimal representation is in a[i:].
186183
func formatBase10(a []byte, u uint64) int {
187-
// Decide implementation strategy based on architecture.
188-
const (
189-
// 64-bit systems can work in 64-bit math the whole time
190-
// or can split the uint64 into uint32-sized chunks.
191-
// On most systems, the uint32 math is faster, but not all.
192-
// The decision here is based on benchmarking.
193-
itoaPure64 = host64bit && goarch.GOARCH != "amd64" && goarch.GOARCH != "arm64" && goarch.GOARCH != "s390x"
194-
)
195-
196-
if itoaPure64 {
197-
// Convert 2 digits at a time, using 64-bit math.
198-
i := len(a)
199-
u := uint(u)
200-
for u >= 100 {
201-
var dd uint
202-
u, dd = u/100, (u%100)*2
203-
i -= 2
204-
a[i+0], a[i+1] = smalls[dd+0], smalls[dd+1]
205-
}
206-
207-
dd := u * 2
208-
i--
209-
a[i] = smalls[dd+1]
210-
if u >= 10 {
211-
i--
212-
a[i] = smalls[dd]
213-
}
214-
return i
215-
}
216-
217-
// Split into 9-digit chunks that fit in uint32s and convert each chunk using 32-bit math.
218-
// Most numbers are small, so the comparison u >= 1e9 is usually pure overhead,
219-
// so we approximate it by u>>29 != 0, which is usually faster and good enough.
184+
// Split into 9-digit chunks that fit in uint32s
185+
// and convert each chunk using uint32 math instead of uint64 math.
186+
// The obvious way to write the outer loop is "for u >= 1e9", but most numbers are small,
187+
// so the setup for the comparison u >= 1e9 is usually pure overhead.
188+
// Instead, we approximate it by u>>29 != 0, which is usually faster and good enough.
220189
i := len(a)
221-
for (host64bit && u>>29 != 0) || (!host64bit && (u>>32 != 0 || uint32(u)>>29 != 0)) {
190+
for (host64bit && u>>29 != 0) || (!host64bit && uint32(u)>>29|uint32(u>>32) != 0) {
222191
var lo uint32
223192
u, lo = u/1e9, uint32(u%1e9)
224193

0 commit comments

Comments
 (0)