You've already forked json-iterator
mirror of
https://github.com/json-iterator/go.git
synced 2025-07-03 23:30:41 +02:00
Remove allocs from WriteFloat32/WriteFloat64
The use of strconv.FormatFloat causes a string allocation, by setting aside a reusable buffer and using strconv.AppendFloat this can be avoided. Before: BenchmarkRespond-4 300 5392189 ns/op 618936 B/op 20010 allocs/op After: BenchmarkRespond-4 300 4713746 ns/op 139744 B/op 10 allocs/op This benchmark is using a custom encoder that calls WriteFloat64 20k times, which is the bulk of the work.
This commit is contained in:
@ -21,7 +21,9 @@ func (stream *Stream) WriteFloat32(val float32) {
|
||||
fmt = 'e'
|
||||
}
|
||||
}
|
||||
stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 32))
|
||||
stream.floatBuf = strconv.AppendFloat(stream.floatBuf, float64(val), fmt, -1, 32)
|
||||
stream.Write(stream.floatBuf)
|
||||
stream.floatBuf = stream.floatBuf[:0]
|
||||
}
|
||||
|
||||
// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster
|
||||
@ -63,7 +65,9 @@ func (stream *Stream) WriteFloat64(val float64) {
|
||||
fmt = 'e'
|
||||
}
|
||||
}
|
||||
stream.WriteRaw(strconv.FormatFloat(float64(val), fmt, -1, 64))
|
||||
stream.floatBuf = strconv.AppendFloat(stream.floatBuf, float64(val), fmt, -1, 64)
|
||||
stream.Write(stream.floatBuf)
|
||||
stream.floatBuf = stream.floatBuf[:0]
|
||||
}
|
||||
|
||||
// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster
|
||||
|
Reference in New Issue
Block a user