Merge branch 'opt/js-async-file-publish'
JetStream async file publish optimization (~10% improvement): - Cached state properties eliminate GetStateAsync on publish path - Single stream lookup eliminates double FindBySubject - Removed _messageIndexes dictionary from write path - Hand-rolled UTF-8 pub-ack formatter for success path - Exponential flush backoff matching Go server - Lazy StoredMessage materialization (MessageMeta struct) # Conflicts: # benchmarks_comparison.md
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
# Go vs .NET NATS Server — Benchmark Comparison
|
||||
|
||||
Benchmark run: 2026-03-13 04:30 PM America/Indiana/Indianapolis. Both servers ran on the same machine using the benchmark project README command (`dotnet test tests/NATS.Server.Benchmark.Tests --filter "Category=Benchmark" -v normal --logger "console;verbosity=detailed"`). Test parallelization remained disabled inside the benchmark assembly.
|
||||
Benchmark run: 2026-03-13 America/Indiana/Indianapolis. Both servers ran on the same machine using the benchmark project README command (`dotnet test tests/NATS.Server.Benchmark.Tests -c Release --filter "Category=Benchmark" -v normal --logger "console;verbosity=detailed"`). Test parallelization remained disabled inside the benchmark assembly.
|
||||
|
||||
**Environment:** Apple M4, .NET SDK 10.0.101, .NET server built and run in `Release` configuration (server GC, tiered PGO enabled), Go toolchain installed, Go reference server built from `golang/nats-server/`.
|
||||
**Environment:** Apple M4, .NET SDK 10.0.101, Release build, Go toolchain installed, Go reference server built from `golang/nats-server/`.
|
||||
**Environment:** Apple M4, .NET SDK 10.0.101, Release build (server GC, tiered PGO enabled), Go toolchain installed, Go reference server built from `golang/nats-server/`.
|
||||
|
||||
---
|
||||
---
|
||||
@@ -59,10 +60,10 @@ Benchmark run: 2026-03-13 04:30 PM America/Indiana/Indianapolis. Both servers ra
|
||||
|
||||
| Mode | Payload | Storage | Go msg/s | .NET msg/s | Ratio (.NET/Go) |
|
||||
|------|---------|---------|----------|------------|-----------------|
|
||||
| Synchronous | 16 B | Memory | 14,812 | 11,002 | 0.74x |
|
||||
| Async (batch) | 128 B | File | 148,156 | 60,348 | 0.41x |
|
||||
| Synchronous | 16 B | Memory | 14,812 | 12,134 | 0.82x |
|
||||
| Async (batch) | 128 B | File | 174,705 | 52,350 | 0.30x |
|
||||
|
||||
> **Note:** Async file-store publish improved to 0.41x with Release build. Still storage-bound.
|
||||
> **Note:** Async file-store publish improved ~10% (47K→52K) after hot-path optimizations: cached state properties, single stream lookup, _messageIndexes removal, hand-rolled pub-ack formatter, exponential flush backoff, lazy StoredMessage materialization. Still storage-bound at 0.30x Go.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user