OnixS C++ ICE Binary Order Entry Handler 1.1.1
API Documentation
Loading...
Searching...
No Matches
BenchmarkSessionListener Class Reference

Public Member Functions

 BenchmarkSessionListener (size_t numberOfMessages)
 ~BenchmarkSessionListener () override=default
bool active () const noexcept
bool packetGroupingDetected () const noexcept
const BenchmarkData::SendMarkssendMarks () const noexcept
const BenchmarkData::ReceiveMarksreceiveMarks () const noexcept
const BenchmarkData::Overheadoverhead () const noexcept
void measureOverhead ()
virtual void resetBenchmark () noexcept
ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void beforeSending () noexcept
ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void afterSending () noexcept
void onStateChange (SessionStateId::Enum newState, SessionStateId::Enum, Session *) override
ONIXS_ICEBOE_HOTPATH void onExecutionReport_New (const Messaging::ExecutionReport_New, Session *) override
ONIXS_ICEBOE_HOTPATH void onExecutionReport_Modify (const Messaging::ExecutionReport_Modify, Session *) override
ONIXS_ICEBOE_HOTPATH void onExecutionReport_Cancel (const Messaging::ExecutionReport_Cancel, Session *) override
ONIXS_ICEBOE_HOTPATH void onExecutionReport_Reject (const Messaging::ExecutionReport_Reject, Session *) override
ONIXS_ICEBOE_HOTPATH void onReceivedBytes (const char *, size_t, const ReceivedDataTimestamp &, Session *) noexcept override
ONIXS_ICEBOE_HOTPATH void onMessageSending (char *, size_t, Session *) noexcept override
void onError (SessionErrorReason::Enum, const std::string &description, Session *, Messaging::SbeMessage) override
void onWarning (SessionWarningReason::Enum, const std::string &description, Session *, Messaging::SbeMessage) override

Protected Member Functions

virtual void onReceivedAllMessages ()

Detailed Description

Definition at line 182 of file BenchmarkSessionListener.h.

Constructor & Destructor Documentation

◆ BenchmarkSessionListener()

BenchmarkSessionListener ( size_t numberOfMessages)
inlineexplicit

Definition at line 185 of file BenchmarkSessionListener.h.

186 : allocator_()
187 , active_(false)
188 , packetGroupingDetected_()
189 , numberOfMessages_(numberOfMessages)
190 , receiveMarks_(allocator_.allocate<BenchmarkData::ReceiveMarks>(numberOfMessages))
191 , receiveCounter_(0)
192 , sendMarks_(allocator_.allocate<BenchmarkData::SendMarks>(numberOfMessages))
193 , sendCounter_(0)
194 {
195 for(size_t i = 0; i < numberOfMessages; ++i)
196 new (sendMarks_ + i) BenchmarkData::SendMarks();
197
198 for(size_t i = 0; i < numberOfMessages; ++i)
199 new (receiveMarks_ + i) BenchmarkData::ReceiveMarks();
200 }

◆ ~BenchmarkSessionListener()

~BenchmarkSessionListener ( )
overridedefault

Member Function Documentation

◆ active()

bool active ( ) const
inlinenoexcept

Definition at line 204 of file BenchmarkSessionListener.h.

205 {
206 return active_;
207 }

◆ afterSending()

ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void afterSending ( )
inlinenoexcept

Definition at line 308 of file BenchmarkSessionListener.h.

309 {
310 assert(sendCounter_ < numberOfMessages_);
311 PerformanceCounter::current(&sendMarks_[sendCounter_++].overallSendFinish);
312
313 ONIXS_ICEBOE_PREFETCH(&sendMarks_[sendCounter_]);
314 }
#define ONIXS_ICEBOE_PREFETCH(ptr)
static Count current()
Retrieves the current value of the high-resolution performance counter.

◆ beforeSending()

ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void beforeSending ( )
inlinenoexcept

Definition at line 301 of file BenchmarkSessionListener.h.

302 {
303 assert(sendCounter_ < numberOfMessages_);
304 PerformanceCounter::current(&sendMarks_[sendCounter_].sendStart);
305 }

◆ measureOverhead()

void measureOverhead ( )
inline

Definition at line 229 of file BenchmarkSessionListener.h.

230 {
232 Threading::ThisThread::spinWait(100000);
233
234 ReceivedDataTimestamp dummy;
236
237 const size_t iterations = numberOfMessages_ - 1;
238
239 for(size_t i = 0; i < iterations; i++)
240 {
242 onMessageSending(nullptr, 0, nullptr);
243 afterSending();
244 onReceivedBytes(nullptr, 0, dummy, nullptr);
245 onReceivedApplicationMessage();
246 }
247
248 const size_t median = iterations / 2;
249
250 std::vector<PerformanceCounter::Span> data;
251 data.reserve(iterations);
252
253 for(size_t i = 0; i < iterations; i++)
254 data.push_back(receiveMarks_[i].recvSpanNano());
255
256 std::sort(data.begin(), data.end());
257 overhead_.receive = data[median];
258
259 data.clear();
260 for(size_t i = 0; i < iterations; i++)
261 data.push_back(sendMarks_[i].sendSpanNano());
262
263 std::sort(data.begin(), data.end());
264 overhead_.send = data[median];
265
266 data.clear();
267 for(size_t i = 0; i < iterations; i++)
268 data.push_back(sendMarks_[i].overallSendSpanNano());
269
270 std::sort(data.begin(), data.end());
271 overhead_.overallSend = data[median];
272
273 data.clear();
274 for(size_t i = 0; i < iterations; i++)
275 data.push_back(BenchmarkData::oneWaySpanNano(sendMarks_[i], receiveMarks_[i]));
276
277 std::sort(data.begin(), data.end());
278 overhead_.oneWay = data[median];
279
281 active_ = false;
282 }
ONIXS_ICEBOE_HOTPATH void onMessageSending(char *, size_t, Session *) noexcept override
ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void afterSending() noexcept
ONIXS_ICEBOE_HOTPATH void onReceivedBytes(const char *, size_t, const ReceivedDataTimestamp &, Session *) noexcept override
virtual void resetBenchmark() noexcept
ONIXS_ICEBOE_HOTPATH ONIXS_ICEBOE_FORCEINLINE void beforeSending() noexcept
static PerformanceCounter::Span oneWaySpanNano(const SendMarks &sm, const ReceiveMarks &rm)

◆ onError()

void onError ( SessionErrorReason::Enum ,
const std::string & description,
Session * ,
Messaging::SbeMessage  )
inlineoverride

Definition at line 381 of file BenchmarkSessionListener.h.

383 {
384 std::cerr << "\nSession-level error: " << description << std::endl;
385 active_ = false;
386 }

◆ onExecutionReport_Cancel()

ONIXS_ICEBOE_HOTPATH void onExecutionReport_Cancel ( const Messaging::ExecutionReport_Cancel ,
Session *  )
inlineoverride

Definition at line 347 of file BenchmarkSessionListener.h.

348 {
349 onReceivedApplicationMessage();
350 }

◆ onExecutionReport_Modify()

ONIXS_ICEBOE_HOTPATH void onExecutionReport_Modify ( const Messaging::ExecutionReport_Modify ,
Session *  )
inlineoverride

Definition at line 341 of file BenchmarkSessionListener.h.

342 {
343 onReceivedApplicationMessage();
344 }

◆ onExecutionReport_New()

ONIXS_ICEBOE_HOTPATH void onExecutionReport_New ( const Messaging::ExecutionReport_New ,
Session *  )
inlineoverride

Definition at line 335 of file BenchmarkSessionListener.h.

336 {
337 onReceivedApplicationMessage();
338 }

◆ onExecutionReport_Reject()

ONIXS_ICEBOE_HOTPATH void onExecutionReport_Reject ( const Messaging::ExecutionReport_Reject ,
Session *  )
inlineoverride

Definition at line 353 of file BenchmarkSessionListener.h.

354 {
355 onReceivedApplicationMessage();
356 }

◆ onMessageSending()

ONIXS_ICEBOE_HOTPATH void onMessageSending ( char * ,
size_t ,
Session *  )
inlineoverridenoexcept

Definition at line 370 of file BenchmarkSessionListener.h.

371 {
372 if ONIXS_ICEBOE_UNLIKELY(!active_)
373 return;
374
375 assert(sendCounter_ < numberOfMessages_);
376 PerformanceCounter::current(&sendMarks_[sendCounter_].sendFinish);
377 }

◆ onReceivedAllMessages()

virtual void onReceivedAllMessages ( )
inlineprotectedvirtual

Reimplemented in ReactorBenchmarkListener.

Definition at line 395 of file BenchmarkSessionListener.h.

396 {
397 active_ = false;
398 }

◆ onReceivedBytes()

ONIXS_ICEBOE_HOTPATH void onReceivedBytes ( const char * ,
size_t ,
const ReceivedDataTimestamp & ,
Session *  )
inlineoverridenoexcept

Definition at line 359 of file BenchmarkSessionListener.h.

360 {
361 if ONIXS_ICEBOE_UNLIKELY(!active_)
362 return;
363
364 // More than one SBE message could be received in one IP packet.
365 assert(receiveCounter_ < numberOfMessages_);
366 PerformanceCounter::current(&receiveMarks_[receiveCounter_].recvStart);
367 }

◆ onStateChange()

void onStateChange ( SessionStateId::Enum newState,
SessionStateId::Enum ,
Session *  )
inlineoverride

Definition at line 316 of file BenchmarkSessionListener.h.

317 {
318 switch(newState)
319 {
320 case SessionStateId::Established:
321 active_ = true;
322 ONIXS_ICEBOE_PREFETCH(&receiveMarks_[receiveCounter_]);
323 break;
324
325 case SessionStateId::Disconnected:
326 active_ = false;
327 break;
328
329 default:
330 break;
331 }
332 }

◆ onWarning()

void onWarning ( SessionWarningReason::Enum ,
const std::string & description,
Session * ,
Messaging::SbeMessage  )
inlineoverride

Definition at line 388 of file BenchmarkSessionListener.h.

390 {
391 std::cerr << "\nSession-level warning: " << description << std::endl;
392 }

◆ overhead()

const BenchmarkData::Overhead & overhead ( ) const
inlinenoexcept

Definition at line 224 of file BenchmarkSessionListener.h.

225 {
226 return overhead_;
227 }

◆ packetGroupingDetected()

bool packetGroupingDetected ( ) const
inlinenoexcept

Definition at line 209 of file BenchmarkSessionListener.h.

210 {
211 return packetGroupingDetected_;
212 }

◆ receiveMarks()

const BenchmarkData::ReceiveMarks * receiveMarks ( ) const
inlinenoexcept

Definition at line 219 of file BenchmarkSessionListener.h.

220 {
221 return receiveMarks_;
222 }

◆ resetBenchmark()

virtual void resetBenchmark ( )
inlinevirtualnoexcept

Reimplemented in ReactorBenchmarkListener.

Definition at line 284 of file BenchmarkSessionListener.h.

285 {
286 for(size_t i = 0; i < numberOfMessages_; ++i)
287 {
288 sendMarks_[i] = BenchmarkData::SendMarks();
289 receiveMarks_[i] = BenchmarkData::ReceiveMarks();
290 }
291
292 sendCounter_ = 0;
293 receiveCounter_ = 0;
294 packetGroupingDetected_ = false;
295 active_ = true;
296
297 ONIXS_ICEBOE_PREFETCH(&sendMarks_[sendCounter_]);
298 }

◆ sendMarks()

const BenchmarkData::SendMarks * sendMarks ( ) const
inlinenoexcept

Definition at line 214 of file BenchmarkSessionListener.h.

215 {
216 return sendMarks_;
217 }