Files
yay/pkg/settings/lua/autocmd_bench_test.go
T
Jo 70d7a0f0a8 fix(lua): Reduce event size of PostInstall and SearchFilter hooks (#2871)
* remove fields from events that might not be needed yet

* reduce event size
2026-06-17 21:40:02 +02:00

245 lines
5.3 KiB
Go

package lua
import (
"testing"
)
// makeSearchFilterEngine returns an Engine with one SearchFilter hook that
// returns all results unchanged (a passthrough). Callers must defer e.Close().
func makeSearchFilterEngine(b *testing.B) *Engine {
b.Helper()
e := New()
if err := e.L.DoString(`
yay.create_autocmd("SearchFilter", {
callback = function(event)
local out = {}
for _, r in ipairs(event.data.results) do
out[#out + 1] = { source = r.source, name = r.name }
end
return out
end,
})
`); err != nil {
b.Fatalf("lua setup: %v", err)
}
return e
}
// makeAURPreInstallEngine returns an Engine with one AURPreInstall hook that
// does nothing. Callers must defer e.Close().
func makeAURPreInstallEngine(b *testing.B) *Engine {
b.Helper()
e := New()
if err := e.L.DoString(`
yay.create_autocmd("AURPreInstall", {
callback = function(_event) end,
})
`); err != nil {
b.Fatalf("lua setup: %v", err)
}
return e
}
// makeUpgradeSelectEngine returns an Engine with one UpgradeSelect hook that
// returns nil (no exclusions). Callers must defer e.Close().
func makeUpgradeSelectEngine(b *testing.B) *Engine {
b.Helper()
e := New()
if err := e.L.DoString(`
yay.create_autocmd("UpgradeSelect", {
callback = function(_event) return nil end,
})
`); err != nil {
b.Fatalf("lua setup: %v", err)
}
return e
}
// makePostInstallEngine returns an Engine with one PostInstall hook that does
// nothing. Callers must defer e.Close().
func makePostInstallEngine(b *testing.B) *Engine {
b.Helper()
e := New()
if err := e.L.DoString(`
yay.create_autocmd("PostInstall", {
callback = function(_event) end,
})
`); err != nil {
b.Fatalf("lua setup: %v", err)
}
return e
}
func makeSearchFilterEvent(n int) *SearchFilterEvent {
results := make([]SearchResultPackage, n)
for i := range results {
results[i] = SearchResultPackage{
Source: "aur",
Name: "pkg-" + string(rune('a'+i%26)),
Description: "benchmark package",
Votes: 100 + i,
Popularity: float64(i) * 0.1,
FirstSubmitted: 1_600_000_000 + i*1000,
LastModified: 1_700_000_000 + i*1000,
}
}
return &SearchFilterEvent{Results: results}
}
func makeAURPreInstallEvent() *AURPreInstallEvent {
return &AURPreInstallEvent{
Base: "my-pkg",
Version: "1.0-1",
Packages: []AURPreInstallPackage{
{Name: "my-pkg", Version: "1.0-1", Reason: "explicit"},
},
SRCINFO: AURPreInstallSRCINFO{
Pkgbase: "my-pkg",
Pkgver: "1.0",
Pkgrel: "1",
},
}
}
func makeUpgradeSelectEvent(n int) *UpgradeSelectEvent {
pkgs := make([]UpgradeSelectPackage, n)
for i := range pkgs {
pkgs[i] = UpgradeSelectPackage{
ID: i + 1,
Name: "pkg-" + string(rune('a'+i%26)),
Repository: "aur",
LocalVersion: "1.0",
RemoteVersion: "2.0",
Reason: "explicit",
LastModified: 1_700_000_000 + int64(i)*1000,
}
}
return &UpgradeSelectEvent{Upgrades: pkgs}
}
func makePostInstallEvent(n int) *PostInstallEvent {
pkgs := make([]PostInstallPackage, n)
for i := range pkgs {
pkgs[i] = PostInstallPackage{
Name: "pkg-" + string(rune('a'+i%26)),
Version: "2.0-1",
Source: "aur",
Reason: "explicit",
}
}
return &PostInstallEvent{Packages: pkgs}
}
// BenchmarkRunSearchFilter_10 measures Lua SearchFilter dispatch with 10 packages.
func BenchmarkRunSearchFilter_10(b *testing.B) {
e := makeSearchFilterEngine(b)
defer e.Close()
event := makeSearchFilterEvent(10)
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
if _, err := e.RunSearchFilter(event); err != nil {
b.Fatal(err)
}
}
}
// BenchmarkRunSearchFilter_100 measures Lua SearchFilter dispatch with 100 packages.
func BenchmarkRunSearchFilter_100(b *testing.B) {
e := makeSearchFilterEngine(b)
defer e.Close()
event := makeSearchFilterEvent(100)
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
if _, err := e.RunSearchFilter(event); err != nil {
b.Fatal(err)
}
}
}
// BenchmarkRunAURPreInstall measures the overhead of dispatching an
// AURPreInstall Lua event for a single package.
func BenchmarkRunAURPreInstall(b *testing.B) {
e := makeAURPreInstallEngine(b)
defer e.Close()
event := makeAURPreInstallEvent()
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
if err := e.RunAURPreInstall(event); err != nil {
b.Fatal(err)
}
}
}
// BenchmarkRunUpgradeSelect_10 measures Lua UpgradeSelect dispatch with 10
// pending upgrades.
func BenchmarkRunUpgradeSelect_10(b *testing.B) {
e := makeUpgradeSelectEngine(b)
defer e.Close()
event := makeUpgradeSelectEvent(10)
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
if _, err := e.RunUpgradeSelect(event); err != nil {
b.Fatal(err)
}
}
}
// BenchmarkRunPostInstall_10 measures Lua PostInstall dispatch with 10
// packages.
func BenchmarkRunPostInstall_10(b *testing.B) {
e := makePostInstallEngine(b)
defer e.Close()
event := makePostInstallEvent(10)
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
if err := e.RunPostInstall(event); err != nil {
b.Fatal(err)
}
}
}
// BenchmarkHasAutocmd_miss measures the cost of HasAutocmd when no hook is
// registered — the common no-op fast path.
func BenchmarkHasAutocmd_miss(b *testing.B) {
e := New()
defer e.Close()
b.ReportAllocs()
b.ResetTimer()
for b.Loop() {
e.HasAutocmd(EventSearchFilter)
}
}