All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- MessagePool completely removed - Removed MessagePool class and all related code for API simplification
- Deleted
MessagePool.cs - Deleted
MessagePoolTests.cs - Deleted
ReinitializeZmqMsgTests.cs - Removed pool-related fields/methods from
Message.cs(_poolDataPtr,_isFromPool,PrepareForReuse(), etc.) - Removed
Recv(Message, int expectSize)overload fromSocket.cs - Removed MessagePooled benchmarks
- Deleted
- Simplified Message class - Cleaner structure after removing pooling-related code
- Removed pool-related branches from
Size,Data,DataPtrproperties - Simplified
Send(),Dispose()methods
- Removed pool-related branches from
- Consolidated to 4 message buffer strategies
- ByteArray (Baseline)
- ArrayPool (recommended for ≤1KB)
- Message
- MessageZeroCopy (special cases only)
- Complete benchmark documentation update (
docs/benchmarks.md,docs/benchmarks.ko.md)- Removed all MessagePool content
- Removed MessageZeroCopy recommendation (slower than Message in most cases)
- Added GC optimization settings section (Server GC + Batch Latency Mode)
- README update - Recommendations based on 4 strategies
- Benchmark README update - Reflects latest results
- ≤1KB messages: Use ArrayPool (best performance, minimal GC)
- ≥64KB messages: Use ArrayPool or Message
- ≥128KB messages: Use ArrayPool or Message (3.5x+ faster than ByteArray)
- MessageZeroCopy: Only for special cases when native memory already exists
- SetActualDataSize() public API - Allows setting actual data size after writing directly to Data Span in pooled messages
- MessagePool - Native memory buffer reuse with thread-local cache for high-performance scenarios
- MessagePool benchmarks - Performance comparison with other memory strategies
- Application-level error codes -
EBUFFERSMALLandESIZEMISMATCHconstants in ZmqConstants - Descriptive exception messages - ZmqException now includes meaningful error descriptions for buffer validation errors
- ZmqException improvements - Buffer validation errors now throw with specific error codes and descriptive messages instead of relying on errno
- Benchmark fairness - Removed shared receive buffer to ensure accurate performance measurements
- Send() now returns bool - indicates success/failure for non-blocking sends
- Poller refactored to instance-based design - zero-allocation polling
- MessageBufferStrategyBenchmarks changed to pure blocking mode for accurate measurement
- TryRecv() methods - non-blocking receive with explicit success indicator
- PureBlocking mode in ReceiveModeBenchmarks for accurate comparison
- 128KB and 256KB message size tests in benchmarks
- Korean translations for all documentation, samples, and templates
- DocFX documentation with GitHub Pages deployment
- LOH (Large Object Heap) impact analysis in benchmark documentation
- One-Size-Fits-All recommendation section - Message recommended for consistent performance
- RecvBytes() and TryRecvBytes() - caused double-copy and GC pressure; use
Recv(Span<byte>)orRecv(Message)instead - MessagePool - simplified memory strategies based on benchmark findings
- Updated benchmark results with new receive modes and memory strategies
- Added memory strategy selection guide based on message size
- Key findings documented:
- Single socket: PureBlocking recommended
- Multiple sockets: Poller recommended
- Memory: Message recommended (GC-free, consistent performance)
- MessageZeroCopy beneficial at 256KB+
- Initial release
- Context management with option support
- All socket types (REQ, REP, PUB, SUB, PUSH, PULL, DEALER, ROUTER, PAIR, XPUB, XSUB, STREAM)
- Message API with Span support
- Polling support
- Z85 encoding/decoding utilities
- CURVE key generation utilities
- Proxy support
- SafeHandle-based resource management
- Bind/Connect/Unbind/Disconnect
- Send/Recv with multiple overloads
- TrySend/TryRecv for non-blocking operations
- Full socket options support
- Subscribe/Unsubscribe for PUB/SUB pattern
- Windows x64, x86, ARM64
- Linux x64, ARM64
- macOS x64, ARM64 (Apple Silicon)
- NetZeroMQ: High-level API with cppzmq-style interface
- NetZeroMQ.Core: Low-level P/Invoke bindings
- NetZeroMQ.Native: Native library package with multi-platform support
- Zero-copy operations with Span
- Efficient memory management with SafeHandle
- Native performance through direct P/Invoke
- Comprehensive null reference type annotations
- SafeHandle-based resource cleanup
- Thread-safe socket operations