Skip to content

Reduce allocations in FIXDecimal.Write - #787

Open
Denx00 wants to merge 1 commit into
quickfixgo:mainfrom
Denx00:perf/fixdecimal-write-fast-path
Open

Denx00 wants to merge 1 commit into
quickfixgo:mainfrom
Denx00:perf/fixdecimal-write-fast-path

Conversation

@Denx00

@Denx00 Denx00 commented Oct 25, 2026

Copy link
Copy Markdown

Closes #786.

FIXDecimal.Write formats via decimal.StringFixed, which rounds through big.Int and builds intermediate strings. This adds a fast path that formats directly from the int64 coefficient, rounding half away from zero as StringFixed does. It falls back to the existing path for coefficients beyond int64, negative scale, and scale >= 20, so output is unchanged.

Benchmark (BenchmarkFIXDecimalWrite, benchstat, 10 runs):

before after
time/op 155 ns 20.5 ns -86.8%
B/op 208 24 -88.5%
allocs/op 11 2 -81.8%

Tests: TestFIXDecimalWriteMatchesStringFixed compares against StringFixed over edge coefficients (including MinInt64), exponents -25..25 and several scales, including rounding ties and negative values that round to zero. go test -race and go vet pass. log/mongo fails on main too, since it needs a MongoDB instance.

Write went through decimal.StringFixed, which rounds via big.Int and
builds intermediate strings: 11 allocs/op for a typical price. Format
directly from the int64 coefficient when it fits, rounding half away
from zero as StringFixed does, and fall back otherwise (large
coefficients, negative or >19 scale).

BenchmarkFIXDecimalWrite: 203ns, 208B, 11 allocs -> 21ns, 24B, 2 allocs.
A differential test checks the result against StringFixed over edge
coefficients, exponents and scales.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reduce allocations in FIXDecimal.Write

1 participant