ITADN

`UnmarshalJSON`, `Scan` and `NewFromString` performance improvements

#403Pull RequestPauliusLozys 创建于 2025-06-09
P
PauliusLozyscommented
This PR improves `UnmarshalJSON` performance by reducing unnecessary allocation caused by `unquoteIfQuoted` function. This also touches on `Scan` method to split `default` case into `string` and `[]byte` cases. This PR also slightly touches `NewFromString` function by making so scientific notation and dots are checked in a single loop. Benchmarks: Old: ``` goos: linux goarch: amd64 pkg: github.com/shopspring/decimal cpu: AMD Ryzen 7 7700X 8-Core Processor BenchmarkDecimal_UnmarshalJSON-16 10973582 105.5 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11399134 103.7 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11480460 103.4 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11440952 103.6 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11305298 103.2 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11353047 102.5 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11419255 103.4 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11392092 103.3 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11341843 104.6 ns/op 96 B/op 5 allocs/op BenchmarkDecimal_UnmarshalJSON-16 11605540 103.0 ns/op 96 B/op 5 allocs/op PASS ok github.com/shopspring/decimal 12.861s ``` New: ``` goos: linux goarch: amd64 pkg: github.com/shopspring/decimal cpu: AMD Ryzen 7 7700X 8-Core Processor BenchmarkDecimal_UnmarshalJSON-16 13650522 83.84 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14697308 80.16 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14545791 80.81 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14889534 79.66 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 15066388 79.93 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14768164 80.08 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14964182 80.74 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 15048375 80.77 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14638641 80.14 ns/op 72 B/op 4 allocs/op BenchmarkDecimal_UnmarshalJSON-16 14878336 80.23 ns/op 72 B/op 4 allocs/op PASS ok github.com/shopspring/decimal 12.701s ``` Benchstat comparison: ``` goos: linux goarch: amd64 pkg: github.com/shopspring/decimal cpu: AMD Ryzen 7 7700X 8-Core Processor │ old.txt │ new.txt │ │ sec/op │ sec/op vs base │ Decimal_UnmarshalJSON-16 103.40n ± 1% 80.20n ± 1% -22.44% (p=0.000 n=10) │ old.txt │ new.txt │ │ B/op │ B/op vs base │ Decimal_UnmarshalJSON-16 96.00 ± 0% 72.00 ± 0% -25.00% (p=0.000 n=10) │ old.txt │ new.txt │ │ allocs/op │ allocs/op vs base │ Decimal_UnmarshalJSON-16 5.000 ± 0% 4.000 ± 0% -20.00% (p=0.000 n=10) ```
合并状态:未合并 0 条评论