Skip to content

Commit c9890ce

Browse files
authored
expression.Div Micro Benchmarks (#2329)
1 parent 0a8f917 commit c9890ce

File tree

1 file changed

+138
-0
lines changed

1 file changed

+138
-0
lines changed

sql/expression/div_test.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,141 @@ func TestIntDiv(t *testing.T) {
177177
})
178178
}
179179
}
180+
181+
// Results:
182+
// BenchmarkDivInt-16 10000 695805 ns/op
183+
func BenchmarkDivInt(b *testing.B) {
184+
require := require.New(b)
185+
ctx := sql.NewEmptyContext()
186+
div := NewDiv(
187+
NewLiteral(1, types.Int64),
188+
NewLiteral(3, types.Int64),
189+
)
190+
var res interface{}
191+
var err error
192+
for i := 0; i < b.N; i++ {
193+
res, err = div.Eval(ctx, nil)
194+
require.NoError(err)
195+
}
196+
if dec, ok := res.(decimal.Decimal); ok {
197+
res = dec.StringFixed(dec.Exponent() * -1)
198+
}
199+
exp := "0.3333"
200+
if res != exp {
201+
b.Logf("Expected %v, got %v", exp, res)
202+
}
203+
}
204+
205+
// Results:
206+
// BenchmarkDivFloat-16 10000 695044 ns/op
207+
func BenchmarkDivFloat(b *testing.B) {
208+
require := require.New(b)
209+
ctx := sql.NewEmptyContext()
210+
div := NewDiv(
211+
NewLiteral(1.0, types.Float64),
212+
NewLiteral(3.0, types.Float64),
213+
)
214+
var res interface{}
215+
var err error
216+
for i := 0; i < b.N; i++ {
217+
res, err = div.Eval(ctx, nil)
218+
require.NoError(err)
219+
}
220+
exp := 1.0 / 3.0
221+
if res != exp {
222+
b.Logf("Expected %v, got %v", exp, res)
223+
}
224+
}
225+
226+
// Results:
227+
// BenchmarkDivHighScaleDecimals-16 10000 694577 ns/op
228+
func BenchmarkDivHighScaleDecimals(b *testing.B) {
229+
require := require.New(b)
230+
ctx := sql.NewEmptyContext()
231+
div := NewDiv(
232+
NewLiteral(decimal.NewFromFloat(0.123456789), types.MustCreateDecimalType(types.DecimalTypeMaxPrecision, types.DecimalTypeMaxScale)),
233+
NewLiteral(decimal.NewFromFloat(0.987654321), types.MustCreateDecimalType(types.DecimalTypeMaxPrecision, types.DecimalTypeMaxScale)),
234+
)
235+
var res interface{}
236+
var err error
237+
for i := 0; i < b.N; i++ {
238+
res, err = div.Eval(ctx, nil)
239+
require.NoError(err)
240+
}
241+
if dec, ok := res.(decimal.Decimal); ok {
242+
res = dec.StringFixed(dec.Exponent() * -1)
243+
}
244+
exp := "0.124999998860937500014238281250"
245+
if res != exp {
246+
b.Logf("Expected %v, got %v", exp, res)
247+
}
248+
}
249+
250+
// Results:
251+
// BenchmarkDivManyInts-16 10000 1151316 ns/op
252+
func BenchmarkDivManyInts(b *testing.B) {
253+
require := require.New(b)
254+
var div sql.Expression = NewLiteral(1, types.Int64)
255+
for i := 2; i < 10; i++ {
256+
div = NewDiv(div, NewLiteral(int64(i), types.Int64))
257+
}
258+
ctx := sql.NewEmptyContext()
259+
var res interface{}
260+
var err error
261+
for i := 0; i < b.N; i++ {
262+
res, err = div.Eval(ctx, nil)
263+
require.NoError(err)
264+
}
265+
if dec, ok := res.(decimal.Decimal); ok {
266+
res = dec.StringFixed(dec.Exponent() * -1)
267+
}
268+
exp := "0.000002755731922398589054232804"
269+
if res != exp {
270+
b.Logf("Expected %v, got %v", exp, res)
271+
}
272+
}
273+
274+
// Results:
275+
// BenchmarkManyFloats-16 4322 618849 ns/op
276+
func BenchmarkManyFloats(b *testing.B) {
277+
require := require.New(b)
278+
ctx := sql.NewEmptyContext()
279+
var div sql.Expression = NewLiteral(1.0, types.Float64)
280+
for i := 2; i < 10; i++ {
281+
div = NewDiv(div, NewLiteral(float64(i), types.Float64))
282+
}
283+
var res interface{}
284+
var err error
285+
for i := 0; i < b.N; i++ {
286+
res, err = div.Eval(ctx, nil)
287+
require.NoError(err)
288+
}
289+
exp := 1.0 / 2.0 / 3.0 / 4.0 / 5.0 / 6.0 / 7.0 / 8.0 / 9.0
290+
if res != exp {
291+
b.Logf("Expected %v, got %v", exp, res)
292+
}
293+
}
294+
295+
// Results:
296+
// BenchmarkDivManyDecimals-16 5721 699095 ns/op
297+
func BenchmarkDivManyDecimals(b *testing.B) {
298+
require := require.New(b)
299+
var div sql.Expression = NewLiteral(decimal.NewFromInt(int64(1)), types.DecimalType_{})
300+
for i := 2; i < 10; i++ {
301+
div = NewDiv(div, NewLiteral(decimal.NewFromInt(int64(i)), types.DecimalType_{}))
302+
}
303+
ctx := sql.NewEmptyContext()
304+
var res interface{}
305+
var err error
306+
for i := 0; i < b.N; i++ {
307+
res, err = div.Eval(ctx, nil)
308+
require.NoError(err)
309+
}
310+
if dec, ok := res.(decimal.Decimal); ok {
311+
res = dec.StringFixed(dec.Exponent() * -1)
312+
}
313+
exp := "0.000002755731922398589054232804"
314+
if res != exp {
315+
b.Logf("Expected %v, got %v", exp, res)
316+
}
317+
}

0 commit comments

Comments
 (0)