diff options
| author | Paul Buetow <paul@buetow.org> | 2025-06-12 21:20:34 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2025-06-12 21:20:34 +0300 |
| commit | dabfbbd00ad5032f5839d2285dc501635a805879 (patch) | |
| tree | bc173de15355f8cc01e90ca759e039854a5640a9 /internal/io | |
| parent | 513f8fdaf93ea723a10307c8e10517eec7e49866 (diff) | |
add Go benchmark for dgrep on 10MB file
- Add BenchmarkDGrepFile10MBNoMatch to test performance when no patterns match
- Add BenchmarkDGrepFile10MBWithMatches to test performance with matching patterns
- Fix undefined variable B in cat_bench_test.go
- Benchmarks show 48% performance penalty when patterns match vs no matches
- Memory usage increases 33% and allocations increase 50% with matches
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'internal/io')
| -rw-r--r-- | internal/io/fs/cat_bench_test.go | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/internal/io/fs/cat_bench_test.go b/internal/io/fs/cat_bench_test.go new file mode 100644 index 0000000..ce485bb --- /dev/null +++ b/internal/io/fs/cat_bench_test.go @@ -0,0 +1,68 @@ +package fs + +import ( + "context" + "os" + "testing" + + "github.com/mimecast/dtail/internal/config" + "github.com/mimecast/dtail/internal/lcontext" + "github.com/mimecast/dtail/internal/regex" +) + +func ensureTestFile100MBForCat(b *testing.B, filename string) { + const line = "test line 1\n" + const targetSize = 100 * 1024 * 1024 // 100MB + if fi, err := os.Stat(filename); err == nil && fi.Size() >= targetSize { + return // File already exists and is large enough + } + f, err := os.Create(filename) + if err != nil { + b.Fatalf("failed to create test file: %v", err) + } + defer f.Close() + written := int64(0) + for written < targetSize { + n, err := f.WriteString(line) + if err != nil { + b.Fatalf("failed to write to test file: %v", err) + } + written += int64(n) + } +} + +func BenchmarkCatFile100MB(b *testing.B) { + const filename = "testfile_100mb.log" + const globID = "test" + b.Log("Ensuring test file exists...") + ensureTestFile100MBForCat(b, filename) + b.Log("Test file ensured.") + serverMessages := make(chan string, 100) + + b.Log("Created serverMessages channel.") + catFile := NewCatFile(filename, globID, serverMessages) + b.Log("Created CatFile instance.") + ltx := lcontext.LContext{} + noopRegex, _ := regex.New("", regex.Noop) + ctx := context.Background() + config.Server = &config.ServerConfig{} // Initialize config.Server + b.Log("Initialized context and config.Server.") + b.ResetTimer() + for i := 0; i < b.N; i++ { + b.Logf("Starting iteration %d...", i) + go func() { + b.Log("Goroutine started to read messages.") + for msg := range serverMessages { + b.Logf("Received message: %s", msg) + } + b.Log("Goroutine finished reading messages.") + }() + b.Log("Started goroutine to read messages.") + b.Log("Calling catFile.Start...") + catFile.Start(ctx, ltx, nil, noopRegex) + b.Log("catFile.Start completed.") + } + b.StopTimer() + close(serverMessages) + b.Log("Benchmark completed.") +} |
