package bench
import (
"bytes"
"fmt"
"testing"
"time"
"mercemay.top/src/tilstream/internal/feed"
"mercemay.top/src/tilstream/internal/feed/writer/atom10"
"mercemay.top/src/tilstream/internal/feed/writer/jsonfeed"
"mercemay.top/src/tilstream/internal/feed/writer/rss20"
)
func makeItems(n int) []feed.Item {
items := make([]feed.Item, n)
start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
for i := 0; i < n; i++ {
items[i] = feed.Item{
Title: fmt.Sprintf("Post %d", i),
Link: fmt.Sprintf("https://example.com/%d", i),
GUID: fmt.Sprintf("https://example.com/%d", i),
Summary: "summary text for benchmarking feed writers",
Content: "<p>body content</p>",
Published: start.Add(time.Duration(i) * time.Hour),
Categories: []string{"bench", "go"},
}
}
return items
}
func BenchmarkRSS20(b *testing.B) {
items := makeItems(500)
ch := rss20.Channel{Title: "T", Link: "L", Description: "D"}
wr := rss20.NewWriter()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
var buf bytes.Buffer
if err := wr.Write(&buf, ch, items); err != nil {
b.Fatal(err)
}
}
}
func BenchmarkAtom10(b *testing.B) {
items := makeItems(500)
wr := atom10.NewWriter()
f := atom10.Feed{Title: "T", ID: "id"}
b.ReportAllocs()
for i := 0; i < b.N; i++ {
var buf bytes.Buffer
if err := wr.Write(&buf, f, items); err != nil {
b.Fatal(err)
}
}
}
func BenchmarkJSONFeed(b *testing.B) {
items := makeItems(500)
wr := jsonfeed.NewWriter()
f := jsonfeed.Feed{Title: "T"}
b.ReportAllocs()
for i := 0; i < b.N; i++ {
var buf bytes.Buffer
if err := wr.Write(&buf, f, items); err != nil {
b.Fatal(err)
}
}
}