...

Text file src/github.com/bytedance/sonic/internal/native/fastint_test.tmpl

Documentation: github.com/bytedance/sonic/internal/native

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

View as plain text