github.com/bytedance/sonic@v1.11.7-0.20240517092252-d2edb31b167b/internal/native/neon/fastfloat_arm64_test.go (about)

     1  // Code generated by Makefile, DO NOT EDIT.
     2  
     3  // Code generated by Makefile, DO NOT EDIT.
     4  
     5  /*
     6   * Copyright 2021 ByteDance Inc.
     7   *
     8   * Licensed under the Apache License, Version 2.0 (the "License");
     9   * you may not use this file except in compliance with the License.
    10   * You may obtain a copy of the License at
    11   *
    12   *     http://www.apache.org/licenses/LICENSE-2.0
    13   *
    14   * Unless required by applicable law or agreed to in writing, software
    15   * distributed under the License is distributed on an "AS IS" BASIS,
    16   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    17   * See the License for the specific language governing permissions and
    18   * limitations under the License.
    19   */
    20  
    21  package neon
    22  
    23  import (
    24      `encoding/json`
    25      `math`
    26      `math/rand`
    27      `strconv`
    28      `testing`
    29  
    30      `github.com/stretchr/testify/assert`
    31  )
    32  
    33  func TestFastFloat_Encode(t *testing.T) {
    34      var buf [64]byte
    35      assert.Equal(t, "0"                         , string(buf[:f64toa(&buf[0], 0)]))
    36      assert.Equal(t, "-0"                         , string(buf[:f64toa(&buf[0], math.Float64frombits(0x8000000000000000))]))
    37      assert.Equal(t, "12340000000"               , string(buf[:f64toa(&buf[0], 1234e7)]))
    38      assert.Equal(t, "12.34"                     , string(buf[:f64toa(&buf[0], 1234e-2)]))
    39      assert.Equal(t, "0.001234"                  , string(buf[:f64toa(&buf[0], 1234e-6)]))
    40      assert.Equal(t, "1e+30"                      , string(buf[:f64toa(&buf[0], 1e30)]))
    41      assert.Equal(t, "1.234e+33"                  , string(buf[:f64toa(&buf[0], 1234e30)]))
    42      assert.Equal(t, "1.234e+308"                 , string(buf[:f64toa(&buf[0], 1234e305)]))
    43      assert.Equal(t, "1.234e-317"                , string(buf[:f64toa(&buf[0], 1234e-320)]))
    44      assert.Equal(t, "1.7976931348623157e+308"    , string(buf[:f64toa(&buf[0], 1.7976931348623157e308)]))
    45      assert.Equal(t, "-12340000000"              , string(buf[:f64toa(&buf[0], -1234e7)]))
    46      assert.Equal(t, "-12.34"                    , string(buf[:f64toa(&buf[0], -1234e-2)]))
    47      assert.Equal(t, "-0.001234"                 , string(buf[:f64toa(&buf[0], -1234e-6)]))
    48      assert.Equal(t, "-1e+30"                     , string(buf[:f64toa(&buf[0], -1e30)]))
    49      assert.Equal(t, "-1.234e+33"                 , string(buf[:f64toa(&buf[0], -1234e30)]))
    50      assert.Equal(t, "-1.234e+308"                , string(buf[:f64toa(&buf[0], -1234e305)]))
    51      assert.Equal(t, "-1.234e-317"               , string(buf[:f64toa(&buf[0], -1234e-320)]))
    52      assert.Equal(t, "-2.2250738585072014e-308"  , string(buf[:f64toa(&buf[0], -2.2250738585072014e-308)]))
    53  }
    54  
    55  func TestFastFloat_Random(t *testing.T) {
    56      var buf [64]byte
    57      N := 10000
    58      for i := 0; i < N; i++ {
    59          b64 := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
    60          f64 := math.Float64frombits(b64)
    61  
    62          jout, jerr := json.Marshal(f64)
    63          n := f64toa(&buf[0], f64)
    64          if jerr == nil {
    65              assert.Equal(t, jout, buf[:n])
    66          } else {
    67              assert.True(t, n == 0)
    68          }
    69  
    70          f32 := math.Float32frombits(rand.Uint32())
    71          jout, jerr = json.Marshal(f32)
    72          n = f32toa(&buf[0], f32)
    73          if jerr == nil {
    74              assert.Equal(t, jout, buf[:n])
    75          } else {
    76              assert.True(t, n == 0)
    77          }
    78      }
    79  }
    80  
    81  func BenchmarkParseFloat64(b *testing.B) {
    82      var f64toaBenches = []struct {
    83          name    string
    84          float   float64
    85      }{
    86          {"Zero", 0},
    87          {"Decimal1", 39},
    88          {"Decimal2", 33909},
    89          {"Float1", 3.77},
    90          {"Float2", 339.778442},
    91          {"Exp1", 5.9e5},
    92          {"Exp2", 521.091e25},
    93          {"NegExp1", -5.1e-5},
    94          {"NegExp2", -52.132e-35},
    95          {"LongExp", 1.234567890123456e-78},
    96          {"Big", 123456789123456789123456789},
    97      
    98      }
    99      for _, c := range f64toaBenches {
   100          f64bench := []struct {
   101              name string
   102              test func(*testing.B)
   103          }{{
   104              name: "StdLib",
   105              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) }},
   106          }, {
   107              name: "FastFloat",
   108              test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { f64toa(&buf[0], c.float) }},
   109          }}
   110          for _, bm := range f64bench {
   111              name := bm.name + "_" + c.name
   112              b.Run(name, bm.test)
   113          }
   114      }
   115  }
   116  
   117  func BenchmarkParseFloat32(b *testing.B) {
   118      var f32toaBenches = []struct {
   119          name    string
   120          float   float32
   121      }{
   122          {"Zero", 0},
   123          {"Decimal1", 39},
   124          {"Decimal2", 33909},
   125          {"Float1", 3.77},
   126          {"Float2", 339.778442},
   127          {"Exp1", 5.9e5},
   128          {"Exp2", 521.091e19},
   129          {"NegExp1", -5.1e-5},
   130          {"NegExp2", -52.132e-19},
   131          {"Shortest", 1.234567e-8},
   132      }
   133      for _, c := range f32toaBenches {
   134          bench := []struct {
   135              name string
   136              test func(*testing.B)
   137          }{{
   138              name: "StdLib32",
   139              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) }},
   140          }, {
   141              name: "FastFloat32",
   142              test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { f32toa(&buf[0], c.float) }},
   143          }}
   144          for _, bm := range bench {
   145              name := bm.name + "_" + c.name
   146              b.Run(name, bm.test)
   147          }
   148      }
   149  }