summaryrefslogtreecommitdiff
path: root/internal/io
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-06-12 21:20:34 +0300
committerPaul Buetow <paul@buetow.org>2025-06-12 21:20:34 +0300
commitdabfbbd00ad5032f5839d2285dc501635a805879 (patch)
treebc173de15355f8cc01e90ca759e039854a5640a9 /internal/io
parent513f8fdaf93ea723a10307c8e10517eec7e49866 (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.go68
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.")
+}