summaryrefslogtreecommitdiff
path: root/benchmarks/dcat_direct_benchmark_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-07-01 21:03:53 +0300
committerPaul Buetow <paul@buetow.org>2025-07-01 21:03:53 +0300
commit4e4034a129e3400ffccb23975a6f3a0cd3011309 (patch)
tree4f77f8b72c9fe93481c66053749a56aa78ee9651 /benchmarks/dcat_direct_benchmark_test.go
parentde974de3d8f4ed38ff7fac6447fdcfec2c00cfc1 (diff)
perf: optimize turbo mode for 2.87x faster serverless performance
Major performance improvements in turbo mode: - Fixed trace logging overhead by adding early level checks before expensive runtime.Caller() operations - Improved buffering strategy by removing forced immediate flush in serverless mode - Turbo mode now 2.87x faster (was 3-5x slower before optimization) Changes: - internal/io/dlog/dlog.go: Added early return in Trace() and Devel() when logging disabled - internal/server/handlers/turbo_writer.go: Removed serverless immediate flush condition Performance results: - Before: Turbo mode was 3-5x slower than non-turbo mode - After: Turbo mode is 2.87x faster (65% improvement) - All integration tests pass Added comprehensive benchmarking tools in benchmarks/ directory 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'benchmarks/dcat_direct_benchmark_test.go')
-rw-r--r--benchmarks/dcat_direct_benchmark_test.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/benchmarks/dcat_direct_benchmark_test.go b/benchmarks/dcat_direct_benchmark_test.go
new file mode 100644
index 0000000..0d23749
--- /dev/null
+++ b/benchmarks/dcat_direct_benchmark_test.go
@@ -0,0 +1,118 @@
+package benchmarks
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "os/exec"
+ "testing"
+ "path/filepath"
+)
+
+// BenchmarkDCatDirect benchmarks dcat in direct/serverless mode
+func BenchmarkDCatDirect(b *testing.B) {
+ // Create test file if it doesn't exist
+ testFile := filepath.Join(b.TempDir(), "benchmark_test.log")
+
+ // Create a 100K line file for benchmarking
+ var buf bytes.Buffer
+ for i := 0; i < 100000; i++ {
+ fmt.Fprintf(&buf, "2025-01-01 10:00:00 INFO [app] Processing request ID=%d status=OK latency=42ms user=user%d path=/api/v1/endpoint%d\n",
+ i, i%100, i%10)
+ }
+
+ if err := os.WriteFile(testFile, buf.Bytes(), 0644); err != nil {
+ b.Fatal(err)
+ }
+
+ // Ensure dcat binary exists
+ dcatPath := "../dcat"
+ if _, err := os.Stat(dcatPath); err != nil {
+ b.Skip("dcat binary not found, run 'make build' first")
+ }
+
+ b.Run("NonTurbo", func(b *testing.B) {
+ os.Unsetenv("DTAIL_TURBOBOOST_ENABLE")
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ cmd := exec.Command(dcatPath, testFile)
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ if err := cmd.Run(); err != nil {
+ b.Fatal(err)
+ }
+ }
+ })
+
+ b.Run("Turbo", func(b *testing.B) {
+ os.Setenv("DTAIL_TURBOBOOST_ENABLE", "yes")
+ defer os.Unsetenv("DTAIL_TURBOBOOST_ENABLE")
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ cmd := exec.Command(dcatPath, testFile)
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ if err := cmd.Run(); err != nil {
+ b.Fatal(err)
+ }
+ }
+ })
+}
+
+// BenchmarkDCatDirectWithSizes tests different file sizes
+func BenchmarkDCatDirectWithSizes(b *testing.B) {
+ sizes := []struct {
+ name string
+ lines int
+ }{
+ {"1K", 1000},
+ {"10K", 10000},
+ {"100K", 100000},
+ }
+
+ dcatPath := "../dcat"
+ if _, err := os.Stat(dcatPath); err != nil {
+ b.Skip("dcat binary not found, run 'make build' first")
+ }
+
+ for _, size := range sizes {
+ b.Run(size.name, func(b *testing.B) {
+ // Create test file
+ testFile := filepath.Join(b.TempDir(), fmt.Sprintf("benchmark_%s.log", size.name))
+ var buf bytes.Buffer
+ for i := 0; i < size.lines; i++ {
+ fmt.Fprintf(&buf, "2025-01-01 10:00:00 INFO [app] Line %d data\n", i)
+ }
+ if err := os.WriteFile(testFile, buf.Bytes(), 0644); err != nil {
+ b.Fatal(err)
+ }
+
+ b.Run("NonTurbo", func(b *testing.B) {
+ os.Unsetenv("DTAIL_TURBOBOOST_ENABLE")
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ cmd := exec.Command(dcatPath, testFile)
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ if err := cmd.Run(); err != nil {
+ b.Fatal(err)
+ }
+ }
+ })
+
+ b.Run("Turbo", func(b *testing.B) {
+ os.Setenv("DTAIL_TURBOBOOST_ENABLE", "yes")
+ defer os.Unsetenv("DTAIL_TURBOBOOST_ENABLE")
+ b.ResetTimer()
+
+ for i := 0; i < b.N; i++ {
+ cmd := exec.Command(dcatPath, testFile)
+ cmd.Stdout = os.NewFile(0, os.DevNull)
+ if err := cmd.Run(); err != nil {
+ b.Fatal(err)
+ }
+ }
+ })
+ })
+ }
+} \ No newline at end of file