138 {
139 const std::string baseName = name + '_';
140
141 std::ofstream receiveStream(std::string(baseName + "recv.csv").c_str(), std::ios_base::ate);
142 std::ofstream sendStream(std::string(baseName + "send.csv").c_str(), std::ios_base::ate);
143 std::ofstream overallSendStream(std::string(baseName + "overallsend.csv").c_str(), std::ios_base::ate);
144 std::ofstream sendAndReceiveStream(std::string(baseName + "sendrecv.csv").c_str(), std::ios_base::ate);
145
146#define MEASURE_NETWORK_LATENCY 1
147
148#if MEASURE_NETWORK_LATENCY
149 std::ofstream oneWayStream(std::string(baseName + "oneway.csv").c_str(), std::ios_base::ate);
151#endif
152
153 Latencies sendLatencies, overallSendLatencies, receiveLatencies, sendAndReceiveLatencies;
154
155 for(std::size_t i = 0; i < count; ++i)
156 {
157 const SendMarks & sendMarks = sendMarksArray[i];
158 const ReceiveMarks & receiveMarks = receiveMarksArray[i];
159
161
162 receiveLatencies.push_back(receiveMarks.recvSpanNano() - overhead.receive);
163 receiveStream << *receiveLatencies.rbegin() << std::endl;
164
165 sendLatencies.push_back(sendMarks.sendSpanNano() - overhead.send);
166 sendStream << *sendLatencies.rbegin() << std::endl;
167
168 overallSendLatencies.push_back(sendMarks.overallSendSpanNano() - overhead.overallSend);
169 overallSendStream << *overallSendLatencies.rbegin() << std::endl;
170
172 sendAndReceiveLatencies.push_back(sendAndReceiveLatency);
173 sendAndReceiveStream << *sendAndReceiveLatencies.rbegin() << std::endl;
174
175#if MEASURE_NETWORK_LATENCY
176 oneWayLatencies.push_back((
oneWaySpanNano(sendMarks, receiveMarks) - overhead.oneWay) / 2);
177 oneWayStream << *oneWayLatencies.rbegin() << std::endl;
178#endif
179 }
180
181 std::clog << std::endl << name << " (nanoseconds): \n" << std::endl;
182
187 "OS + Handler Send (depends on the network card, kernel bypass software, OS load)",
188 overallSendLatencies
189 );
190
191#if MEASURE_NETWORK_LATENCY
193#endif
194
195#define REPORT_OVERHEAD 1
196
197#if REPORT_OVERHEAD
198 std::clog
199 << std::endl << "Measurement overhead:" << std::endl
200 << "Send: " << overhead.send << std::endl
201 << "Receive: " << overhead.receive << std::endl
202 << "Send+Receive: " << overhead.send + overhead.receive << std::endl
203 << "OS + Handler Send: " << overhead.overallSend << std::endl;
204#endif
205
206#if MEASURE_NETWORK_LATENCY
207 std::clog << "One way:" << overhead.oneWay << std::endl;
208#endif
209 }
std::vector< PerformanceCounter::Span > Latencies
static void processAndReportLatencies(const std::string &name, Latencies &latencies)
static PerformanceCounter::Span oneWaySpanNano(const SendMarks &sm, const ReceiveMarks &rm)