podman

Форк
0
/
fastfloat_amd64_test.tmpl 
140 строк · 5.0 Кб
1
// Code generated by Makefile, DO NOT EDIT.
2

3
/*
4
 * Copyright 2021 ByteDance Inc.
5
 *
6
 * Licensed under the Apache License, Version 2.0 (the "License");
7
 * you may not use this file except in compliance with the License.
8
 * You may obtain a copy of the License at
9
 *
10
 *     http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing, software
13
 * distributed under the License is distributed on an "AS IS" BASIS,
14
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 * See the License for the specific language governing permissions and
16
 * limitations under the License.
17
 */
18

19
package {{PACKAGE}}
20

21
import (
22
    `encoding/json`
23
    `math`
24
    `math/rand`
25
    `strconv`
26
    `testing`
27

28
    `github.com/stretchr/testify/assert`
29
)
30

31
func TestFastFloat_Encode(t *testing.T) {
32
    var buf [64]byte
33
    assert.Equal(t, "0"                         , string(buf[:f64toa(&buf[0], 0)]))
34
    assert.Equal(t, "-0"                         , string(buf[:f64toa(&buf[0], math.Float64frombits(0x8000000000000000))]))
35
    assert.Equal(t, "12340000000"               , string(buf[:f64toa(&buf[0], 1234e7)]))
36
    assert.Equal(t, "12.34"                     , string(buf[:f64toa(&buf[0], 1234e-2)]))
37
    assert.Equal(t, "0.001234"                  , string(buf[:f64toa(&buf[0], 1234e-6)]))
38
    assert.Equal(t, "1e+30"                      , string(buf[:f64toa(&buf[0], 1e30)]))
39
    assert.Equal(t, "1.234e+33"                  , string(buf[:f64toa(&buf[0], 1234e30)]))
40
    assert.Equal(t, "1.234e+308"                 , string(buf[:f64toa(&buf[0], 1234e305)]))
41
    assert.Equal(t, "1.234e-317"                , string(buf[:f64toa(&buf[0], 1234e-320)]))
42
    assert.Equal(t, "1.7976931348623157e+308"    , string(buf[:f64toa(&buf[0], 1.7976931348623157e308)]))
43
    assert.Equal(t, "-12340000000"              , string(buf[:f64toa(&buf[0], -1234e7)]))
44
    assert.Equal(t, "-12.34"                    , string(buf[:f64toa(&buf[0], -1234e-2)]))
45
    assert.Equal(t, "-0.001234"                 , string(buf[:f64toa(&buf[0], -1234e-6)]))
46
    assert.Equal(t, "-1e+30"                     , string(buf[:f64toa(&buf[0], -1e30)]))
47
    assert.Equal(t, "-1.234e+33"                 , string(buf[:f64toa(&buf[0], -1234e30)]))
48
    assert.Equal(t, "-1.234e+308"                , string(buf[:f64toa(&buf[0], -1234e305)]))
49
    assert.Equal(t, "-1.234e-317"               , string(buf[:f64toa(&buf[0], -1234e-320)]))
50
    assert.Equal(t, "-2.2250738585072014e-308"  , string(buf[:f64toa(&buf[0], -2.2250738585072014e-308)]))
51
}
52

53
func TestFastFloat_Random(t *testing.T) {
54
    var buf [64]byte
55
    N := 10000
56
    for i := 0; i < N; i++ {
57
        b64 := uint64(rand.Uint32())<<32 | uint64(rand.Uint32())
58
        f64 := math.Float64frombits(b64)
59

60
        jout, jerr := json.Marshal(f64)
61
        n := f64toa(&buf[0], f64)
62
        if jerr == nil {
63
            assert.Equal(t, jout, buf[:n])
64
        } else {
65
            assert.True(t, n == 0)
66
        }
67

68
        f32 := math.Float32frombits(rand.Uint32())
69
        jout, jerr = json.Marshal(f32)
70
        n = f32toa(&buf[0], f32)
71
        if jerr == nil {
72
            assert.Equal(t, jout, buf[:n])
73
        } else {
74
            assert.True(t, n == 0)
75
        }
76
    }
77
}
78

79
func BenchmarkParseFloat64(b *testing.B) {
80
    var f64toaBenches = []struct {
81
        name    string
82
        float   float64
83
    }{
84
        {"Zero", 0},
85
        {"Decimal", 33909},
86
        {"Float", 339.7784},
87
        {"Exp", -5.09e75},
88
        {"NegExp", -5.11e-95},
89
        {"LongExp", 1.234567890123456e-78},
90
        {"Big", 123456789123456789123456789},
91
    
92
    }
93
    for _, c := range f64toaBenches {
94
        f64bench := []struct {
95
            name string
96
            test func(*testing.B)
97
        }{{
98
            name: "StdLib",
99
            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) }},
100
        }, {
101
            name: "FastFloat",
102
            test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { f64toa(&buf[0], c.float) }},
103
        }}
104
        for _, bm := range f64bench {
105
            name := bm.name + "_" + c.name
106
            b.Run(name, bm.test)
107
        }
108
    }
109
}
110

111
func BenchmarkParseFloat32(b *testing.B) {
112
    var f32toaBenches = []struct {
113
        name    string
114
        float   float32
115
    }{
116
        {"Zero", 0},
117
        {"Integer", 33909},
118
        {"ExactFraction", 3.375},
119
        {"Point", 339.7784},
120
        {"Exp", -5.09e25},
121
        {"NegExp", -5.11e-25},
122
        {"Shortest", 1.234567e-8},
123
    }
124
    for _, c := range f32toaBenches {
125
        bench := []struct {
126
            name string
127
            test func(*testing.B)
128
        }{{
129
            name: "StdLib32",
130
            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) }},
131
        }, {
132
            name: "FastFloat32",
133
            test: func(b *testing.B) { var buf [64]byte; for i := 0; i < b.N; i++ { f32toa(&buf[0], c.float) }},
134
        }}
135
        for _, bm := range bench {
136
            name := bm.name + "_" + c.name
137
            b.Run(name, bm.test)
138
        }
139
    }
140
}
141

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.