summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl')
-rw-r--r--vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl138
1 files changed, 138 insertions, 0 deletions
diff --git a/vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl b/vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl
new file mode 100644
index 000000000..7ed9e4704
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/internal/native/fastfloat_amd64_test.tmpl
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2021 ByteDance Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package {{PACKAGE}}
+
+import (
+ `math`
+ `strconv`
+ `testing`
+ `math/rand`
+ `encoding/json`
+
+ `github.com/stretchr/testify/assert`
+)
+
+func TestFastFloat_Encode(t *testing.T) {
+ var buf [64]byte
+ assert.Equal(t, "0" , string(buf[:__f64toa(&buf[0], 0)]))
+ assert.Equal(t, "-0" , string(buf[:__f64toa(&buf[0], math.Float64frombits(0x8000000000000000))]))
+ assert.Equal(t, "12340000000" , string(buf[:__f64toa(&buf[0], 1234e7)]))
+ assert.Equal(t, "12.34" , string(buf[:__f64toa(&buf[0], 1234e-2)]))
+ assert.Equal(t, "0.001234" , string(buf[:__f64toa(&buf[0], 1234e-6)]))
+ assert.Equal(t, "1e+30" , string(buf[:__f64toa(&buf[0], 1e30)]))
+ assert.Equal(t, "1.234e+33" , string(buf[:__f64toa(&buf[0], 1234e30)]))
+ assert.Equal(t, "1.234e+308" , string(buf[:__f64toa(&buf[0], 1234e305)]))
+ assert.Equal(t, "1.234e-317" , string(buf[:__f64toa(&buf[0], 1234e-320)]))
+ assert.Equal(t, "1.7976931348623157e+308" , string(buf[:__f64toa(&buf[0], 1.7976931348623157e308)]))
+ assert.Equal(t, "-12340000000" , string(buf[:__f64toa(&buf[0], -1234e7)]))
+ assert.Equal(t, "-12.34" , string(buf[:__f64toa(&buf[0], -1234e-2)]))
+ assert.Equal(t, "-0.001234" , string(buf[:__f64toa(&buf[0], -1234e-6)]))
+ assert.Equal(t, "-1e+30" , string(buf[:__f64toa(&buf[0], -1e30)]))
+ assert.Equal(t, "-1.234e+33" , string(buf[:__f64toa(&buf[0], -1234e30)]))
+ assert.Equal(t, "-1.234e+308" , string(buf[:__f64toa(&buf[0], -1234e305)]))
+ assert.Equal(t, "-1.234e-317" , string(buf[:__f64toa(&buf[0], -1234e-320)]))
+ assert.Equal(t, "-2.2250738585072014e-308" , string(buf[:__f64toa(&buf[0], -2.2250738585072014e-308)]))
+}
+
+func TestFastFloat_Random(t *testing.T) {
+ var buf [64]byte
+ N := 10000
+ for i := 0; i < N; i++ {
+ b64 := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
+ f64 := math.Float64frombits(b64)
+
+ jout, jerr := json.Marshal(f64)
+ n := __f64toa(&buf[0], f64)
+ if jerr == nil {
+ assert.Equal(t, jout, buf[:n])
+ } else {
+ assert.True(t, n == 0)
+ }
+
+ f32 := math.Float32frombits(rand.Uint32())
+ jout, jerr = json.Marshal(f32)
+ n = __f32toa(&buf[0], f32)
+ if jerr == nil {
+ assert.Equal(t, jout, buf[:n])
+ } else {
+ assert.True(t, n == 0)
+ }
+ }
+}
+
+func BenchmarkParseFloat64(b *testing.B) {
+ var f64toaBenches = []struct {
+ name string
+ float float64
+ }{
+ {"Zero", 0},
+ {"Decimal", 33909},
+ {"Float", 339.7784},
+ {"Exp", -5.09e75},
+ {"NegExp", -5.11e-95},
+ {"LongExp", 1.234567890123456e-78},
+ {"Big", 123456789123456789123456789},
+
+ }
+ for _, c := range f64toaBenches {
+ f64bench := []struct {
+ name string
+ test func(*testing.B)
+ }{{
+ name: "StdLib",
+ test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { strconv.AppendFloat(buf[:0], c.float, 'g', -1, 64) }},
+ }, {
+ name: "FastFloat",
+ test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { __f64toa(&buf[0], c.float) }},
+ }}
+ for _, bm := range f64bench {
+ name := bm.name + "_" + c.name
+ b.Run(name, bm.test)
+ }
+ }
+}
+
+func BenchmarkParseFloat32(b *testing.B) {
+ var f32toaBenches = []struct {
+ name string
+ float float32
+ }{
+ {"Zero", 0},
+ {"Integer", 33909},
+ {"ExactFraction", 3.375},
+ {"Point", 339.7784},
+ {"Exp", -5.09e25},
+ {"NegExp", -5.11e-25},
+ {"Shortest", 1.234567e-8},
+ }
+ for _, c := range f32toaBenches {
+ bench := []struct {
+ name string
+ test func(*testing.B)
+ }{{
+ name: "StdLib32",
+ test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { strconv.AppendFloat(buf[:0], float64(c.float), 'g', -1, 32) }},
+ }, {
+ name: "FastFloat32",
+ test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { __f32toa(&buf[0], c.float) }},
+ }}
+ for _, bm := range bench {
+ name := bm.name + "_" + c.name
+ b.Run(name, bm.test)
+ }
+ }
+} \ No newline at end of file