fastint_test.tmpl raw

   1  // +build amd64 
   2  
   3  
   4  // Code generated by Makefile, DO NOT EDIT.
   5  
   6  /*
   7   * Copyright 2021 ByteDance Inc.
   8   *
   9   * Licensed under the Apache License, Version 2.0 (the "License");
  10   * you may not use this file except in compliance with the License.
  11   * You may obtain a copy of the License at
  12   *
  13   *     http://www.apache.org/licenses/LICENSE-2.0
  14   *
  15   * Unless required by applicable law or agreed to in writing, software
  16   * distributed under the License is distributed on an "AS IS" BASIS,
  17   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  18   * See the License for the specific language governing permissions and
  19   * limitations under the License.
  20   */
  21  
  22  package {{PACKAGE}}
  23  
  24  import (
  25      `strconv`
  26      `testing`
  27      `fmt`
  28  
  29      `github.com/stretchr/testify/assert`
  30  )
  31  
  32  func TestFastInt_IntToString(t *testing.T) {
  33      var buf [32]byte
  34      assert.Equal(t, "0"                    , string(buf[:i64toa(&buf[0], 0)]))
  35      assert.Equal(t, "1"                    , string(buf[:i64toa(&buf[0], 1)]))
  36      assert.Equal(t, "12"                   , string(buf[:i64toa(&buf[0], 12)]))
  37      assert.Equal(t, "123"                  , string(buf[:i64toa(&buf[0], 123)]))
  38      assert.Equal(t, "1234"                 , string(buf[:i64toa(&buf[0], 1234)]))
  39      assert.Equal(t, "12345"                , string(buf[:i64toa(&buf[0], 12345)]))
  40      assert.Equal(t, "123456"               , string(buf[:i64toa(&buf[0], 123456)]))
  41      assert.Equal(t, "1234567"              , string(buf[:i64toa(&buf[0], 1234567)]))
  42      assert.Equal(t, "12345678"             , string(buf[:i64toa(&buf[0], 12345678)]))
  43      assert.Equal(t, "123456789"            , string(buf[:i64toa(&buf[0], 123456789)]))
  44      assert.Equal(t, "1234567890"           , string(buf[:i64toa(&buf[0], 1234567890)]))
  45      assert.Equal(t, "12345678901"          , string(buf[:i64toa(&buf[0], 12345678901)]))
  46      assert.Equal(t, "123456789012"         , string(buf[:i64toa(&buf[0], 123456789012)]))
  47      assert.Equal(t, "1234567890123"        , string(buf[:i64toa(&buf[0], 1234567890123)]))
  48      assert.Equal(t, "12345678901234"       , string(buf[:i64toa(&buf[0], 12345678901234)]))
  49      assert.Equal(t, "123456789012345"      , string(buf[:i64toa(&buf[0], 123456789012345)]))
  50      assert.Equal(t, "1234567890123456"     , string(buf[:i64toa(&buf[0], 1234567890123456)]))
  51      assert.Equal(t, "12345678901234567"    , string(buf[:i64toa(&buf[0], 12345678901234567)]))
  52      assert.Equal(t, "123456789012345678"   , string(buf[:i64toa(&buf[0], 123456789012345678)]))
  53      assert.Equal(t, "1234567890123456789"  , string(buf[:i64toa(&buf[0], 1234567890123456789)]))
  54      assert.Equal(t, "9223372036854775807"  , string(buf[:i64toa(&buf[0], 9223372036854775807)]))
  55      assert.Equal(t, "-1"                   , string(buf[:i64toa(&buf[0], -1)]))
  56      assert.Equal(t, "-12"                  , string(buf[:i64toa(&buf[0], -12)]))
  57      assert.Equal(t, "-123"                 , string(buf[:i64toa(&buf[0], -123)]))
  58      assert.Equal(t, "-1234"                , string(buf[:i64toa(&buf[0], -1234)]))
  59      assert.Equal(t, "-12345"               , string(buf[:i64toa(&buf[0], -12345)]))
  60      assert.Equal(t, "-123456"              , string(buf[:i64toa(&buf[0], -123456)]))
  61      assert.Equal(t, "-1234567"             , string(buf[:i64toa(&buf[0], -1234567)]))
  62      assert.Equal(t, "-12345678"            , string(buf[:i64toa(&buf[0], -12345678)]))
  63      assert.Equal(t, "-123456789"           , string(buf[:i64toa(&buf[0], -123456789)]))
  64      assert.Equal(t, "-1234567890"          , string(buf[:i64toa(&buf[0], -1234567890)]))
  65      assert.Equal(t, "-12345678901"         , string(buf[:i64toa(&buf[0], -12345678901)]))
  66      assert.Equal(t, "-123456789012"        , string(buf[:i64toa(&buf[0], -123456789012)]))
  67      assert.Equal(t, "-1234567890123"       , string(buf[:i64toa(&buf[0], -1234567890123)]))
  68      assert.Equal(t, "-12345678901234"      , string(buf[:i64toa(&buf[0], -12345678901234)]))
  69      assert.Equal(t, "-123456789012345"     , string(buf[:i64toa(&buf[0], -123456789012345)]))
  70      assert.Equal(t, "-1234567890123456"    , string(buf[:i64toa(&buf[0], -1234567890123456)]))
  71      assert.Equal(t, "-12345678901234567"   , string(buf[:i64toa(&buf[0], -12345678901234567)]))
  72      assert.Equal(t, "-123456789012345678"  , string(buf[:i64toa(&buf[0], -123456789012345678)]))
  73      assert.Equal(t, "-1234567890123456789" , string(buf[:i64toa(&buf[0], -1234567890123456789)]))
  74      assert.Equal(t, "-9223372036854775808" , string(buf[:i64toa(&buf[0], -9223372036854775808)]))
  75  }
  76  
  77  func TestFastInt_UintToString(t *testing.T) {
  78      var buf [32]byte
  79      assert.Equal(t, "0"                    , string(buf[:u64toa(&buf[0], 0)]))
  80      assert.Equal(t, "1"                    , string(buf[:u64toa(&buf[0], 1)]))
  81      assert.Equal(t, "12"                   , string(buf[:u64toa(&buf[0], 12)]))
  82      assert.Equal(t, "123"                  , string(buf[:u64toa(&buf[0], 123)]))
  83      assert.Equal(t, "1234"                 , string(buf[:u64toa(&buf[0], 1234)]))
  84      assert.Equal(t, "12345"                , string(buf[:u64toa(&buf[0], 12345)]))
  85      assert.Equal(t, "123456"               , string(buf[:u64toa(&buf[0], 123456)]))
  86      assert.Equal(t, "1234567"              , string(buf[:u64toa(&buf[0], 1234567)]))
  87      assert.Equal(t, "12345678"             , string(buf[:u64toa(&buf[0], 12345678)]))
  88      assert.Equal(t, "123456789"            , string(buf[:u64toa(&buf[0], 123456789)]))
  89      assert.Equal(t, "1234567890"           , string(buf[:u64toa(&buf[0], 1234567890)]))
  90      assert.Equal(t, "12345678901"          , string(buf[:u64toa(&buf[0], 12345678901)]))
  91      assert.Equal(t, "123456789012"         , string(buf[:u64toa(&buf[0], 123456789012)]))
  92      assert.Equal(t, "1234567890123"        , string(buf[:u64toa(&buf[0], 1234567890123)]))
  93      assert.Equal(t, "12345678901234"       , string(buf[:u64toa(&buf[0], 12345678901234)]))
  94      assert.Equal(t, "123456789012345"      , string(buf[:u64toa(&buf[0], 123456789012345)]))
  95      assert.Equal(t, "1234567890123456"     , string(buf[:u64toa(&buf[0], 1234567890123456)]))
  96      assert.Equal(t, "12345678901234567"    , string(buf[:u64toa(&buf[0], 12345678901234567)]))
  97      assert.Equal(t, "123456789012345678"   , string(buf[:u64toa(&buf[0], 123456789012345678)]))
  98      assert.Equal(t, "1234567890123456789"  , string(buf[:u64toa(&buf[0], 1234567890123456789)]))
  99      assert.Equal(t, "12345678901234567890" , string(buf[:u64toa(&buf[0], 12345678901234567890)]))
 100      assert.Equal(t, "18446744073709551615" , string(buf[:u64toa(&buf[0], 18446744073709551615)]))
 101  }
 102  
 103  func BenchmarkFastInt_IntToString(b *testing.B) {
 104      benchmarks := []struct {
 105          name string
 106          test func(*testing.B)
 107      }{{
 108          name: "StdLib-Positive",
 109          test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendInt(buf[:0], int64(i), 10) }},
 110      }, {
 111          name: "StdLib-Negative",
 112          test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendInt(buf[:0], -int64(i), 10) }},
 113      }, {
 114          name: "FastInt-Positive",
 115          test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { i64toa(&buf[0], int64(i)) }},
 116      }, {
 117          name: "FastInt-Negative",
 118          test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { i64toa(&buf[0], -int64(i)) }},
 119      }}
 120      for _, bm := range benchmarks {
 121          b.Run(bm.name, bm.test)
 122      }
 123  }
 124  
 125  type utoaBench struct {
 126      name string
 127      num  uint64
 128  }
 129  
 130  func BenchmarkFastInt_UintToString(b *testing.B) {
 131      maxUint := "18446744073709551615"
 132      benchs := make([]utoaBench, len(maxUint) + 1)
 133      benchs[0].name = "Zero"
 134      benchs[0].num  = 0
 135      for i := 1; i <= len(maxUint); i++ {
 136          benchs[i].name = strconv.FormatInt(int64(i), 10) + "-Digs"
 137          benchs[i].num, _ = strconv.ParseUint(string(maxUint[:i]), 10, 64)
 138      }
 139  
 140      for _, t := range(benchs) {
 141          benchmarks := []struct {
 142              name string
 143              test func(*testing.B)
 144          }{{
 145              name: "StdLib",
 146              test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { strconv.AppendUint(buf[:0], t.num, 10) }},
 147          }, {
 148              name: "FastInt",
 149              test: func(b *testing.B) { var buf [32]byte; for i := 0; i < b.N; i++ { u64toa(&buf[0], t.num) }},
 150          }}
 151          for _, bm := range benchmarks {
 152              name := fmt.Sprintf("%s_%s", bm.name, t.name)
 153              b.Run(name, bm.test)
 154          }
 155      }
 156  }