dateparse icon indicating copy to clipboard operation
dateparse copied to clipboard

Can't reproduce benchmark results

Open vitalyisaev2 opened this issue 1 year ago • 1 comments

Seems like Go standard library was fixed since this library was introduced, so now time.Parse beats datetime.ParseAny:

package bench

import (
	"testing"
	"time"

	"github.com/araddon/dateparse"
	"github.com/stretchr/testify/require"
)

func TestDateEquivalence(t *testing.T) {
	format := "2006-01-02"
	input := "1988-11-20"

	out1, err := time.Parse(format, input)
	require.NotNil(t, out1)
	require.NoError(t, err)

	out2, err := dateparse.ParseAny(input)
	require.NotNil(t, out2)
	require.NoError(t, err)

	require.True(t, out1.Equal(out2))
}

func TestTimeEquivalence(t *testing.T) {
	format := "2006-01-02 15:04:05.999999"
	input := "1988-11-20 11:12:13.444444"

	out1, err := time.Parse(format, input)
	require.NotNil(t, out1)
	require.NoError(t, err)

	out2, err := dateparse.ParseAny(input)
	require.NotNil(t, out2)
	require.NoError(t, err)

	require.True(t, out1.Equal(out2))
}

func BenchmarkDateParseStdLib(b *testing.B) {
	format := "2006-01-02"
	input := "1988-11-20"
	for i := 0; i < b.N; i++ {
		out, err := time.Parse(format, input)
		require.NotNil(b, out)
		require.NoError(b, err)
	}
}

func BenchmarkDateParseAraddonDateparse(b *testing.B) {
	input := "1988-11-20"
	for i := 0; i < b.N; i++ {
		out, err := dateparse.ParseStrict(input)
		require.NotNil(b, out)
		require.NoError(b, err)
	}
}

func BenchmarkTimeParseStdLib(b *testing.B) {
	format := "2006-01-02 15:04:05.999999"
	input := "1988-11-20 11:12:13.444444"
	for i := 0; i < b.N; i++ {
		out, err := time.Parse(format, input)
		require.NotNil(b, out)
		require.NoError(b, err)
	}
}

func BenchmarkTimeParseAraddonTimeparse(b *testing.B) {
	input := "1988-11-20 11:12:13.444444"
	for i := 0; i < b.N; i++ {
		out, err := dateparse.ParseAny(input)
		require.NotNil(b, out)
		require.NoError(b, err)
	}
}

Results:

cpu: 11th Gen Intel(R) Core(TM) i7-11850H @ 2.50GHz
BenchmarkDateParseStdLib
BenchmarkDateParseStdLib-16                      2813982               417.9 ns/op
BenchmarkDateParseAraddonDateparse
BenchmarkDateParseAraddonDateparse-16            2003248               575.2 ns/op
BenchmarkTimeParseStdLib
BenchmarkTimeParseStdLib-16                      2293155               520.0 ns/op
BenchmarkTimeParseAraddonTimeparse
BenchmarkTimeParseAraddonTimeparse-16            1585695               749.0 ns/op

vitalyisaev2 avatar Jul 03 '24 08:07 vitalyisaev2

I'm not an author/maintainer of this library, but I suspect you misunderstand the main purpose of this library: To be fast at parsing unknown date/time formats, as illustrated by the benchmarks in this library:

BenchmarkShotgunParse-10           79652             15060 ns/op           19448 B/op        474 allocs/op
BenchmarkParseAny-10              308557              3892 ns/op            4288 B/op         42 allocs/op

The (first) slower version uses time.Parse to do the work.

bep avatar Mar 20 '25 20:03 bep