-
Notifications
You must be signed in to change notification settings - Fork 0
Add order-safe TryEncode API with zero-allocation callback support for messages with groups and variable-length data #77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
|
@copilot e qual seria o resultado se eu invertesse a chamada de WithBids e WithAsks? Acredito que deveria receber os groups obrigatoriamente no TryEncode, assim como VarData também. E o metodo de encode tem que saber a sequencia de writes que devera realizar. |
|
@copilot e qual seria o resultado se eu invertesse a chamada de WithBids e WithAsks? Acredito que deveria receber os groups obrigatoriamente no TryEncode, assim como VarData também. E o metodo de encode tem que saber a sequencia de writes que devera realizar. |
…code Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
Você está absolutamente certo! Identifiquei um problema crítico com a API fluente original: permitia chamar Implementei sua sugestão: removi o encoder fluente e criei um método bool success = OrderBookData.TryEncode(
orderBook,
buffer,
bids, // Primeiro no schema
asks, // Segundo no schema
out int bytesWritten
);Esta solução: Commit: 1e4cf6a |
Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
|
@copilot uma ultima melhoria que talvez faça sentido ou não. |
Ótima sugestão! Uma API baseada em callbacks eliminaria alocações de arrays. Proponho adicionar uma sobrecarga para cenários zero-allocation: // Atual (simples, mas requer array)
TryEncode(message, buffer, bids, asks, out bytes);
// Nova sobrecarga (zero-allocation)
TryEncode(message, buffer,
bidCount, (int index, ref BidsData data) => GetBid(index, ref data),
askCount, (int index, ref AsksData data) => GetAsk(index, ref data),
out bytes);O callback retorna Implemento esta sobrecarga mantendo a API atual para simplicidade nos casos comuns? |
|
@copilot sim, dessa forma está perfeito, mas considerando que temos count, não precisamos retornar o bool para stop. |
Co-authored-by: pedrosakuma <39205549+pedrosakuma@users.noreply.github.com>
Perfeito! Implementado com assinatura simplificada: public delegate void BidsEncoder(int index, ref BidsData item);
OrderBookData.TryEncode(orderBook, buffer,
bidCount: 3,
bidsEncoder: (int index, ref BidsData item) => {
item.Price = GetBidPrice(index);
item.Quantity = GetBidQuantity(index);
},
askCount: 2,
asksEncoder: (int index, ref AsksData item) => { ... },
out bytesWritten);Sem bool de retorno já que o count define quantos itens processar. API zero-allocation mantendo simplicidade da API baseada em spans. Commit: cecb454 |
The current encoding API for messages with groups/varData requires manual
SpanWritermanagement across multiple static method calls, making it error-prone and difficult to discover the correct encoding sequence.Changes
Generated order-safe TryEncode API with two encoding modes:
Span-based API (simple, common use cases):
TryEncode(message, buffer, groups..., varData..., out bytesWritten)static method on message structsCallback-based API (zero-allocation, high-performance):
TryEncode(message, buffer, groupCount, groupEncoder, ..., out bytesWritten)overloadBidsEncoder)void(int index, ref GroupData item)- no bool return needed since count is knownImplementation:
AppendComprehensiveTryEncode()to generate comprehensive static encoding methodsDocumentation:
docs/ENCODING_ORDER_FIX.mddocumenting the design rationaleExamples
Before:
After (Span-Based - Simple & Recommended):
After (Callback-Based - Zero-Allocation):
Traditional API remains available for advanced scenarios requiring manual writer control. All APIs produce identical binary output.
Key Benefits
✅ Compile-time safety: Cannot pass groups/varData in wrong order
✅ Schema-aligned: Method signature matches schema definition exactly
✅ Error prevention: Impossible to encode in incorrect sequence
✅ Backward compatible: Traditional BeginEncoding still works
✅ Clear intent: Single method call shows all required data in correct order
✅ Zero-allocation option: Callback-based API eliminates array allocations
✅ Flexible: Choose simplicity (span-based) or performance (callback-based)
Original prompt
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.