bench/encoder_bench_test.go

package bench_test

import (
	"io"
	"testing"
	"time"

	"mercemay.top/src/lambdalog/internal/encoder"
	logjson "mercemay.top/src/lambdalog/internal/encoder/json"
)

func makeRecord(fields int) encoder.Record {
	fs := make([]encoder.Field, fields)
	for i := range fs {
		fs[i] = encoder.Field{Key: "k", Value: "v"}
	}
	return encoder.Record{
		Time:      time.Unix(1700000000, 0).UTC(),
		Level:     "info",
		Message:   "hello",
		RequestID: "req-1",
		Fields:    fs,
	}
}

func BenchmarkJSONEncoder_Small(b *testing.B) {
	enc := logjson.Encoder{}
	rec := makeRecord(2)
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		if err := enc.Encode(io.Discard, rec); err != nil {
			b.Fatalf("encode: %v", err)
		}
	}
}

func BenchmarkJSONEncoder_Medium(b *testing.B) {
	enc := logjson.Encoder{}
	rec := makeRecord(8)
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = enc.Encode(io.Discard, rec)
	}
}

func BenchmarkJSONEncoder_Large(b *testing.B) {
	enc := logjson.Encoder{}
	rec := makeRecord(32)
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = enc.Encode(io.Discard, rec)
	}
}

func BenchmarkJSONEncoder_Parallel(b *testing.B) {
	enc := logjson.Encoder{}
	rec := makeRecord(8)
	b.ReportAllocs()
	b.ResetTimer()
	b.RunParallel(func(pb *testing.PB) {
		for pb.Next() {
			_ = enc.Encode(io.Discard, rec)
		}
	})
}

func BenchmarkFormatTimestamp(b *testing.B) {
	t := time.Unix(1700000000, 42).UTC()
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = encoder.FormatTimestamp(t)
	}
}

func BenchmarkFormatLevel(b *testing.B) {
	b.ReportAllocs()
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_ = encoder.FormatLevel("WARN")
	}
}