On Apr 27, 2024, at 10:31 AM, Steven Hartland <stevenmhartl...@gmail.com> wrote:


Do you have the test code for that specific test?

That would allow others to have a look at it and also confirm if the test is somehow optimising the function call away.

On Sat, 27 Apr 2024 at 05:12, robert engels <reng...@ix.netcom.com> wrote:
Apologies. The assembly files were reversed. But the timings remain the same.

I will get the assembly of the test compiles tomorrow  - but if these differ - that suggests that the test harness between versions has changed as well - meaning can’t compare benchmark performances across versions ?

Under the assumption that the register passing should be more efficient than the stack passing.

On Apr 26, 2024, at 10:32 PM, Robert Engels <reng...@ix.netcom.com> wrote:

Why would it be optimized away in 1.12 and not optimized away in 1.21?

I could have made a mistake in my recording so I’ll test it again tomorrow. 

On Apr 26, 2024, at 10:03 PM, 'Keith Randall' via golang-nuts <golang-nuts@googlegroups.com> wrote:

Isn't that assembly exactly the opposite? The code that is passing in registers should be 1.21, the one passing on the stack would be 1.12. At least, that's what should be the case with the register ABI that launched in 1.17 (for amd64).
Please post a full program and a full command line you're using, so it is immediately obvious how one would reproduce.

Also, the assembly of Fixed.Add isn't the thing I'm curious about. It is the assembly of BenchmarkAddFixed. Fixed.Add will probably be inlined into that function, and possibly optimized away.

On Friday, April 26, 2024 at 5:44:01 AM UTC-7 robert engels wrote:
There seems to be a material difference in the generated code.

The function is:

func (f Fixed) Add(f0 Fixed) Fixed {
    if f.IsNaN() || f0.IsNaN() {
        return NaN
    }
    return Fixed{fp: f.fp + f0.fp}
}

In 1.12 it appears to place the receiver and the argument in the AX and BX registers as a calling convention, but in 1.21 these are passed on the stack.

1.12 assembly:

github.com/robaho/fixed.Fixed.Add STEXT nosplit size=33 args=0x10 locals=0x0 funcid=0x0 align=0x0
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) TEXT github.com/robaho/fixed.Fixed.Add(SB), NOSPLIT|NOFRAME|ABIInternal, $0-16
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $0, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $1, gclocals·g2BeySu+wFnoycgXfElmcg==(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $5, github.com/robaho/fixed.Fixed.Add.arginfo1(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $6, github.com/robaho/fixed.Fixed.Add.argliveinfo(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) PCDATA $3, $1
0x0000 00000 (<unknown line number>) NOP
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) XCHGL AX, AX
0x0001 00001 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) MOVQ $9223372036854775807, CX
0x000b 00011 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) CMPQ AX, CX
0x000e 00014 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) JEQ 21
0x0010 00016 (<unknown line number>) NOP
0x0010 00016 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) CMPQ BX, CX
0x0013 00019 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) JNE 29
0x0015 00021 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:174) MOVQ github.com/robaho/fixed.NaN(SB), AX
0x001c 00028 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:174) RET
0x001d 00029 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:176) ADDQ BX, AX
0x0020 00032 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:176) RET
0x0000 90 48 b9 ff ff ff ff ff ff ff 7f 48 39 c8 74 05  .H.........H9.t.
0x0010 48 39 cb 75 08 48 8b 05 00 00 00 00 c3 48 01 d8  H9.u.H.......H..
0x0020 c3                                               .

1.21.5 assembly:

"".Fixed.Add STEXT nosplit size=54 args=0x18 locals=0x0
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) TEXT "".Fixed.Add(SB), NOSPLIT|ABIInternal, $0-24
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $0, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:172) FUNCDATA $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) PCDATA $2, $0
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) PCDATA $0, $0
0x0000 00000 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) XCHGL AX, AX
0x0001 00001 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) MOVQ "".f+8(SP), AX
0x0006 00006 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) MOVQ $9223372036854775807, CX
0x0010 00016 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) CMPQ AX, CX
0x0013 00019 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) JNE 34
0x0015 00021 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:174) MOVQ "".NaN(SB), AX
0x001c 00028 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:174) MOVQ AX, "".~r1+24(SP)
0x0021 00033 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:174) RET
0x0022 00034 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) XCHGL AX, AX
0x0023 00035 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) MOVQ "".f0+16(SP), DX
0x0028 00040 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:144) CMPQ DX, CX
0x002b 00043 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:173) JEQ 21
0x002d 00045 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:176) ADDQ DX, AX
0x0030 00048 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:176) MOVQ AX, "".~r1+24(SP)
0x0035 00053 (/Users/robertengels/go/src/github.com/robaho/fixed/fixed.go:176) RET
0x0000 90 48 8b 44 24 08 48 b9 ff ff ff ff ff ff ff 7f  .H.D$.H.........
0x0010 48 39 c8 75 0d 48 8b 05 00 00 00 00 48 89 44 24  H9.u.H......H.D$
0x0020 18 c3 90 48 8b 54 24 10 48 39 ca 74 e8 48 01 d0  ...H.T$.H9.t.H..
0x0030 48 89 44 24 18 c3                                H.D$..
rel 24+4 t=15 "".NaN+0



On Apr 26, 2024, at 6:20 AM, Robert Engels <ren...@ix.netcom.com> wrote:

I agree but in this case it is very consistent. Even if that were the case, wouldn’t that mean that 1.12 had better optimization in this case?

I will dig in today and report back with the generated code. 

On Apr 26, 2024, at 12:17 AM, 'Keith Randall' via golang-nuts <golan...@googlegroups.com> wrote:

> There is a pretty significant degradation in AddFixed() which may be concerning to the Go team

What is the benchmark for this?
I am usually suspicious of sub-nanosecond benchmark times. Generally that indicates that the benchmark completely optimized away and all you are measuring is an empty loop.
Hard to know for sure without looking at the generated code for BenchmarkAddFixed.

On Thursday, April 25, 2024 at 10:54:42 AM UTC-7 Robert Engels wrote:
There is a pretty significant degradation in AddFixed() which may be concerning to the Go team, because the code of AddFixed is simply:

// Add adds f0 to f producing a Fixed. If either operand is NaN, NaN is returned
func (f Fixed) Add(f0 Fixed) Fixed {
    if f.IsNaN() || f0.IsNaN() {
        return NaN
    }
    return Fixed{fp: f.fp + f0.fp}
}

Here is the combined output:

│ go1.12.17.txt │ go1.21.5.txt │ go1.22.2.txt │
│ sec/op │ sec/op vs base │ sec/op vs base │
AddFixed-8 0.6000n ± 2% 0.9593n ± 1% +59.89% (p=0.002 n=6) 0.8012n ± 12% +33.53% (p=0.002 n=6)
AddDecimal-8 246.00n ± 1% 66.47n ± 14% -72.98% (p=0.002 n=6) 66.23n ± 1% -73.08% (p=0.002 n=6)
AddBigInt-8 14.400n ± 1% 9.560n ± 2% -33.61% (p=0.002 n=6) 9.525n ± 7% -33.85% (p=0.002 n=6)
AddBigFloat-8 79.90n ± 3% 63.09n ± 0% -21.03% (p=0.002 n=6) 66.20n ± 1% -17.15% (p=0.002 n=6)
MulFixed-8 4.950n ± 3% 3.512n ± 0% -29.04% (p=0.002 n=6) 3.809n ± 2% -23.06% (p=0.002 n=6)
MulDecimal-8 73.45n ± 3% 65.90n ± 0% -10.29% (p=0.002 n=6) 67.20n ± 1% -8.52% (p=0.002 n=6)
MulBigInt-8 17.45n ± 1% 10.38n ± 2% -40.52% (p=0.002 n=6) 10.43n ± 1% -40.23% (p=0.002 n=6)
MulBigFloat-8 36.00n ± 2% 23.85n ± 1% -33.75% (p=0.002 n=6) 24.00n ± 1% -33.35% (p=0.002 n=6)
DivFixed-8 4.700n ± 1% 3.689n ± 1% -21.51% (p=0.002 n=6) 3.695n ± 2% -21.39% (p=0.002 n=6)
DivDecimal-8 767.0n ± 11% 462.9n ± 0% -39.65% (p=0.002 n=6) 470.4n ± 4% -38.68% (p=0.002 n=6)
DivBigInt-8 45.25n ± 1% 34.68n ± 10% -23.36% (p=0.002 n=6) 34.98n ± 1% -22.70% (p=0.002 n=6)
DivBigFloat-8 108.0n ± 1% 110.8n ± 0% +2.64% (p=0.002 n=6) 113.6n ± 0% +5.19% (p=0.002 n=6)
CmpFixed-8 0.3800n ± 3% 0.2500n ± 1% -34.22% (p=0.002 n=6) 0.2511n ± 1% -33.92% (p=0.002 n=6)
CmpDecimal-8 7.925n ± 1% 6.942n ± 1% -12.40% (p=0.002 n=6) 6.503n ± 1% -17.94% (p=0.002 n=6)
CmpBigInt-8 5.800n ± 0% 4.795n ± 2% -17.32% (p=0.002 n=6) 4.807n ± 1% -17.12% (p=0.002 n=6)
CmpBigFloat-8 5.310n ± 2% 4.417n ± 1% -16.83% (p=0.002 n=6) 4.475n ± 9% -15.73% (p=0.002 n=6)
StringFixed-8 57.10n ± 9% 50.40n ± 1% -11.73% (p=0.002 n=6) 50.70n ± 1% -11.22% (p=0.002 n=6)
StringNFixed-8 55.60n ± 0% 51.41n ± 15% ~ (p=0.061 n=6) 49.78n ± 1% -10.48% (p=0.002 n=6)
StringDecimal-8 216.0n ± 2% 215.2n ± 21% ~ (p=1.000 n=6) 197.2n ± 0% -8.68% (p=0.002 n=6)
StringBigInt-8 121.00n ± 1% 98.81n ± 1% -18.33% (p=0.002 n=6) 98.61n ± 4% -18.50% (p=0.002 n=6)
StringBigFloat-8 413.0n ± 3% 387.6n ± 1% -6.15% (p=0.002 n=6) 408.4n ± 2% -1.10% (p=0.026 n=6)
WriteTo-8 37.15n ± 15% 26.14n ± 45% -29.65% (p=0.041 n=6) 26.40n ± 40% -28.94% (p=0.015 n=6)
geomean 28.20n 21.86n -22.49% 21.79n -22.76%
│ go1.12.17.txt │ go1.21.5.txt │ go1.22.2.txt │
│ B/op │ B/op vs base │ B/op vs base │
AddFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
AddDecimal-8 176.00 ± 0% 80.00 ± 0% -54.55% (p=0.002 n=6) 80.00 ± 0% -54.55% (p=0.002 n=6)
AddBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
AddBigFloat-8 48.00 ± 0% 48.00 ± 0% ~ (p=1.000 n=6) ¹ 48.00 ± 0% ~ (p=1.000 n=6) ¹
MulFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
MulDecimal-8 80.00 ± 0% 80.00 ± 0% ~ (p=1.000 n=6) ¹ 80.00 ± 0% ~ (p=1.000 n=6) ¹
MulBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
MulBigFloat-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
DivFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
DivDecimal-8 568.0 ± 0% 384.0 ± 0% -32.39% (p=0.002 n=6) 384.0 ± 0% -32.39% (p=0.002 n=6)
DivBigInt-8 8.000 ± 0% 8.000 ± 0% ~ (p=1.000 n=6) ¹ 8.000 ± 0% ~ (p=1.000 n=6) ¹
DivBigFloat-8 24.00 ± 0% 24.00 ± 0% ~ (p=1.000 n=6) ¹ 24.00 ± 0% ~ (p=1.000 n=6) ¹
CmpFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpDecimal-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpBigFloat-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
StringFixed-8 32.00 ± 0% 24.00 ± 0% -25.00% (p=0.002 n=6) 24.00 ± 0% -25.00% (p=0.002 n=6)
StringNFixed-8 32.00 ± 0% 24.00 ± 0% -25.00% (p=0.002 n=6) 24.00 ± 0% -25.00% (p=0.002 n=6)
StringDecimal-8 64.00 ± 0% 56.00 ± 0% -12.50% (p=0.002 n=6) 56.00 ± 0% -12.50% (p=0.002 n=6)
StringBigInt-8 24.00 ± 0% 16.00 ± 0% -33.33% (p=0.002 n=6) 16.00 ± 0% -33.33% (p=0.002 n=6)
StringBigFloat-8 192.0 ± 0% 176.0 ± 0% -8.33% (p=0.002 n=6) 176.0 ± 0% -8.33% (p=0.002 n=6)
WriteTo-8 21.00 ± 14% 23.00 ± 13% +9.52% (p=0.002 n=6) 23.00 ± 13% +9.52% (p=0.002 n=6)
geomean ² -9.89% ² -9.89% ²
¹ all samples are equal
² summaries must be >0 to compute geomean
│ go1.12.17.txt │ go1.21.5.txt │ go1.22.2.txt │
│ allocs/op │ allocs/op vs base │ allocs/op vs base │
AddFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
AddDecimal-8 8.000 ± 0% 2.000 ± 0% -75.00% (p=0.002 n=6) 2.000 ± 0% -75.00% (p=0.002 n=6)
AddBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
AddBigFloat-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ 1.000 ± 0% ~ (p=1.000 n=6) ¹
MulFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
MulDecimal-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ 2.000 ± 0% ~ (p=1.000 n=6) ¹
MulBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
MulBigFloat-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
DivFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
DivDecimal-8 21.00 ± 0% 12.00 ± 0% -42.86% (p=0.002 n=6) 12.00 ± 0% -42.86% (p=0.002 n=6)
DivBigInt-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ 1.000 ± 0% ~ (p=1.000 n=6) ¹
DivBigFloat-8 2.000 ± 0% 2.000 ± 0% ~ (p=1.000 n=6) ¹ 2.000 ± 0% ~ (p=1.000 n=6) ¹
CmpFixed-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpDecimal-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpBigInt-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
CmpBigFloat-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
StringFixed-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ 1.000 ± 0% ~ (p=1.000 n=6) ¹
StringNFixed-8 1.000 ± 0% 1.000 ± 0% ~ (p=1.000 n=6) ¹ 1.000 ± 0% ~ (p=1.000 n=6) ¹
StringDecimal-8 5.000 ± 0% 4.000 ± 0% -20.00% (p=0.002 n=6) 4.000 ± 0% -20.00% (p=0.002 n=6)
StringBigInt-8 2.000 ± 0% 1.000 ± 0% -50.00% (p=0.002 n=6) 1.000 ± 0% -50.00% (p=0.002 n=6)
StringBigFloat-8 8.000 ± 0% 7.000 ± 0% -12.50% (p=0.002 n=6) 7.000 ± 0% -12.50% (p=0.002 n=6)
WriteTo-8 0.000 ± 0% 0.000 ± 0% ~ (p=1.000 n=6) ¹ 0.000 ± 0% ~ (p=1.000 n=6) ¹
geomean ² -12.73% ² -12.73% ²
¹ all samples are equal
² summaries must be >0 to compute geomean

On Apr 25, 2024, at 12:25 PM, Robert Engels <rob...@me.com> wrote:

Thanks. I noticed those but didn’t look into how to address. Appreciate it. I will rerun.

On Apr 25, 2024, at 12:23 PM, Steven Hartland <stevenm...@gmail.com> wrote:

Thanks for these, not sure if you noticed the notes from each run e.g. need >= 4 samples to detect a difference at alpha level 0.05.

Basically run the benchmark with a -count=6 or more and then run the tool, and you get a the comparison values which are typically the interesting bit

On Thu, 25 Apr 2024 at 00:29, Robert Engels <rob...@me.com> wrote:
│ /Users/robertengels/go1.21.5.txt │ /Users/robertengels/go1.22.2.txt │
│ sec/op │ sec/op vs base │
AddFixed-8 0.9603n ± ∞ ¹ 0.7931n ± ∞ ¹ ~ (p=1.000 n=1) ²
AddDecimal-8 66.41n ± ∞ ¹ 66.27n ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigInt-8 9.452n ± ∞ ¹ 10.650n ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigFloat-8 63.26n ± ∞ ¹ 66.33n ± ∞ ¹ ~ (p=1.000 n=1) ²
MulFixed-8 3.519n ± ∞ ¹ 3.939n ± ∞ ¹ ~ (p=1.000 n=1) ²
MulDecimal-8 65.98n ± ∞ ¹ 67.07n ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigInt-8 10.69n ± ∞ ¹ 10.49n ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigFloat-8 23.72n ± ∞ ¹ 24.12n ± ∞ ¹ ~ (p=1.000 n=1) ²
DivFixed-8 3.675n ± ∞ ¹ 3.661n ± ∞ ¹ ~ (p=1.000 n=1) ²
DivDecimal-8 460.8n ± ∞ ¹ 469.6n ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigInt-8 34.82n ± ∞ ¹ 34.90n ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigFloat-8 110.4n ± ∞ ¹ 113.6n ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpFixed-8 0.2529n ± ∞ ¹ 0.2784n ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpDecimal-8 6.883n ± ∞ ¹ 6.475n ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigInt-8 4.779n ± ∞ ¹ 4.805n ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigFloat-8 4.411n ± ∞ ¹ 5.081n ± ∞ ¹ ~ (p=1.000 n=1) ²
StringFixed-8 50.36n ± ∞ ¹ 50.64n ± ∞ ¹ ~ (p=1.000 n=1) ²
StringNFixed-8 53.41n ± ∞ ¹ 49.66n ± ∞ ¹ ~ (p=1.000 n=1) ²
StringDecimal-8 197.6n ± ∞ ¹ 197.0n ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigInt-8 98.17n ± ∞ ¹ 98.00n ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigFloat-8 386.2n ± ∞ ¹ 395.2n ± ∞ ¹ ~ (p=1.000 n=1) ²
WriteTo-8 31.82n ± ∞ ¹ 31.71n ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean 22.01n 22.28n +1.26%
¹ need >= 6 samples for confidence interval at level 0.95
² need >= 4 samples to detect a difference at alpha level 0.05
│ /Users/robertengels/go1.21.5.txt │ /Users/robertengels/go1.22.2.txt │
│ B/op │ B/op vs base │
AddFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddDecimal-8 80.00 ± ∞ ¹ 80.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigFloat-8 48.00 ± ∞ ¹ 48.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulDecimal-8 80.00 ± ∞ ¹ 80.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigFloat-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivDecimal-8 384.0 ± ∞ ¹ 384.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigInt-8 8.000 ± ∞ ¹ 8.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigFloat-8 24.00 ± ∞ ¹ 24.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpDecimal-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigFloat-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringFixed-8 24.00 ± ∞ ¹ 24.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringNFixed-8 24.00 ± ∞ ¹ 24.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringDecimal-8 56.00 ± ∞ ¹ 56.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigInt-8 16.00 ± ∞ ¹ 16.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigFloat-8 176.0 ± ∞ ¹ 176.0 ± ∞ ¹ ~ (p=1.000 n=1) ²
WriteTo-8 29.00 ± ∞ ¹ 28.00 ± ∞ ¹ ~ (p=1.000 n=1) ³
geomean ⁴ -0.16% ⁴
¹ need >= 6 samples for confidence interval at level 0.95
² all samples are equal
³ need >= 4 samples to detect a difference at alpha level 0.05
⁴ summaries must be >0 to compute geomean
│ /Users/robertengels/go1.21.5.txt │ /Users/robertengels/go1.22.2.txt │
│ allocs/op │ allocs/op vs base │
AddFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddDecimal-8 2.000 ± ∞ ¹ 2.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
AddBigFloat-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulDecimal-8 2.000 ± ∞ ¹ 2.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
MulBigFloat-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivDecimal-8 12.00 ± ∞ ¹ 12.00 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigInt-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
DivBigFloat-8 2.000 ± ∞ ¹ 2.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpFixed-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpDecimal-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigInt-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
CmpBigFloat-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringFixed-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringNFixed-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringDecimal-8 4.000 ± ∞ ¹ 4.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigInt-8 1.000 ± ∞ ¹ 1.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
StringBigFloat-8 7.000 ± ∞ ¹ 7.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
WriteTo-8 0.000 ± ∞ ¹ 0.000 ± ∞ ¹ ~ (p=1.000 n=1) ²
geomean ³ +0.00% ³

On Apr 24, 2024, at 6:20 PM, Steven Hartland <stevenm...@gmail.com> wrote:

What’s it look like when your run it through 
https://pkg.go.dev/golang.org/x/perf/cmd/benchstat which will provide a nice side by side comparison?

On Wed, 24 Apr 2024 at 19:26, 'Robert Engels' via golang-nuts <golan...@googlegroups.com> wrote:
I have a fairly stable project github.com/robaho/fixed which is almost 100% cpu bound. It doesn’t change so it makes a great way to compare the performance of different Go versions using the same hardware. I took the time to re-run the tests today.

Using 1.21.17:

BenchmarkAddFixed-8 2000000000 0.59 ns/op 0 B/op 0 allocs/op
BenchmarkAddDecimal-8 5000000 243 ns/op 176 B/op 8 allocs/op
BenchmarkAddBigInt-8 100000000 14.3 ns/op 0 B/op 0 allocs/op
BenchmarkAddBigFloat-8 20000000 78.8 ns/op 48 B/op 1 allocs/op
BenchmarkMulFixed-8 300000000 4.88 ns/op 0 B/op 0 allocs/op
BenchmarkMulDecimal-8 20000000 72.0 ns/op 80 B/op 2 allocs/op
BenchmarkMulBigInt-8 100000000 17.1 ns/op 0 B/op 0 allocs/op
BenchmarkMulBigFloat-8 30000000 35.5 ns/op 0 B/op 0 allocs/op
BenchmarkDivFixed-8 300000000 4.71 ns/op 0 B/op 0 allocs/op
BenchmarkDivDecimal-8 2000000 779 ns/op 568 B/op 21 allocs/op
BenchmarkDivBigInt-8 30000000 46.1 ns/op 8 B/op 1 allocs/op
BenchmarkDivBigFloat-8 20000000 108 ns/op 24 B/op 2 allocs/op
BenchmarkCmpFixed-8 2000000000 0.38 ns/op 0 B/op 0 allocs/op
BenchmarkCmpDecimal-8 200000000 8.05 ns/op 0 B/op 0 allocs/op
BenchmarkCmpBigInt-8 300000000 5.87 ns/op 0 B/op 0 allocs/op
BenchmarkCmpBigFloat-8 300000000 5.46 ns/op 0 B/op 0 allocs/op
BenchmarkStringFixed-8 20000000 57.4 ns/op 32 B/op 1 allocs/op
BenchmarkStringNFixed-8 20000000 55.6 ns/op 32 B/op 1 allocs/op
BenchmarkStringDecimal-8 10000000 218 ns/op 64 B/op 5 allocs/op
BenchmarkStringBigInt-8 10000000 122 ns/op 24 B/op 2 allocs/op
BenchmarkStringBigFloat-8 3000000 416 ns/op 192 B/op 8 allocs/op
BenchmarkWriteTo-8 30000000 45.8 ns/op 18 B/op 0 allocs/op

and version 1.21.5:

BenchmarkAddFixed-8 1000000000 0.9735 ns/op 0 B/op 0 allocs/op
BenchmarkAddDecimal-8 14311995 69.99 ns/op 80 B/op 2 allocs/op
BenchmarkAddBigInt-8 100000000 13.42 ns/op 0 B/op 0 allocs/op
BenchmarkAddBigFloat-8 17506702 63.84 ns/op 48 B/op 1 allocs/op
BenchmarkMulFixed-8 313983104 3.732 ns/op 0 B/op 0 allocs/op
BenchmarkMulDecimal-8 18046520 66.59 ns/op 80 B/op 2 allocs/op
BenchmarkMulBigInt-8 100000000 10.79 ns/op 0 B/op 0 allocs/op
BenchmarkMulBigFloat-8 49186024 24.30 ns/op 0 B/op 0 allocs/op
BenchmarkDivFixed-8 306888069 3.721 ns/op 0 B/op 0 allocs/op
BenchmarkDivDecimal-8 2510688 462.4 ns/op 384 B/op 12 allocs/op
BenchmarkDivBigInt-8 33993822 37.02 ns/op 8 B/op 1 allocs/op
BenchmarkDivBigFloat-8 9415330 111.5 ns/op 24 B/op 2 allocs/op
BenchmarkCmpFixed-8 1000000000 0.2548 ns/op 0 B/op 0 allocs/op
BenchmarkCmpDecimal-8 168714549 7.086 ns/op 0 B/op 0 allocs/op
BenchmarkCmpBigInt-8 234895634 4.952 ns/op 0 B/op 0 allocs/op
BenchmarkCmpBigFloat-8 260814464 4.503 ns/op 0 B/op 0 allocs/op
BenchmarkStringFixed-8 23725470 50.57 ns/op 24 B/op 1 allocs/op
BenchmarkStringNFixed-8 23666628 50.67 ns/op 24 B/op 1 allocs/op
BenchmarkStringDecimal-8 5665790 200.1 ns/op 56 B/op 4 allocs/op
BenchmarkStringBigInt-8 10596398 100.2 ns/op 16 B/op 1 allocs/op
BenchmarkStringBigFloat-8 2922332 391.2 ns/op 176 B/op 7 allocs/op
BenchmarkWriteTo-8 45734523 31.53 ns/op 23 B/op 0 allocs/op
which is pretty impressive across the board.

Only 2 tests show any degradation and most show significant improvement.

On the two that degrade, AddFixed is a fairly trivial add of 2 longs, so that is surprising. Strangely, WriteTo shows a different number of B/op on different runs (all of the other tests are stable).


-- 
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/A6412E4C-03BD-477B-A725-06510DDD618A%40me.com.




--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/834a058c-83de-4fef-8d40-adb4e709d03cn%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/7287234a-8bf7-4a36-944c-314090fbd57cn%40googlegroups.com.

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/7AC00FD1-4403-4636-B805-D72707AC15AD%40ix.netcom.com.

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/36A95EB4-F84E-42BE-A1B7-D091467F9483%40ix.netcom.com.

--
You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/4BA9781A-3086-42CE-8066-A41C0F7B41F8%40ix.netcom.com.

Reply via email to