void XmlResultParser::_PrintTargetLatency(const TargetResults& results) { if (results.readLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageReadLatencyMilliseconds>%.3f</AverageReadLatencyMilliseconds>\n", results.readLatencyHistogram.GetAvg() / 1000); _Print("<ReadLatencyStdev>%.3f</ReadLatencyStdev>\n", results.readLatencyHistogram.GetStandardDeviation() / 1000); } if (results.writeLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageWriteLatencyMilliseconds>%.3f</AverageWriteLatencyMilliseconds>\n", results.writeLatencyHistogram.GetAvg() / 1000); _Print("<WriteLatencyStdev>%.3f</WriteLatencyStdev>\n", results.writeLatencyHistogram.GetStandardDeviation() / 1000); } Histogram<float> totalLatencyHistogram; totalLatencyHistogram.Merge(results.readLatencyHistogram); totalLatencyHistogram.Merge(results.writeLatencyHistogram); if (totalLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageLatencyMilliseconds>%.3f</AverageLatencyMilliseconds>\n", totalLatencyHistogram.GetAvg() / 1000); _Print("<LatencyStdev>%.3f</LatencyStdev>\n", totalLatencyHistogram.GetStandardDeviation() / 1000); } }
void XmlResultParser::_PrintLatencyPercentiles(const Results& results) { Histogram<float> readLatencyHistogram; Histogram<float> writeLatencyHistogram; Histogram<float> totalLatencyHistogram; for (const auto& thread : results.vThreadResults) { for (const auto& target : thread.vTargetResults) { readLatencyHistogram.Merge(target.readLatencyHistogram); writeLatencyHistogram.Merge(target.writeLatencyHistogram); totalLatencyHistogram.Merge(target.writeLatencyHistogram); totalLatencyHistogram.Merge(target.readLatencyHistogram); } } _Print("<Latency>\n"); if (readLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageReadMilliseconds>%.3f</AverageReadMilliseconds>\n", readLatencyHistogram.GetAvg() / 1000); _Print("<ReadLatencyStdev>%.3f</ReadLatencyStdev>\n", readLatencyHistogram.GetStandardDeviation() / 1000); } if (writeLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageWriteMilliseconds>%.3f</AverageWriteMilliseconds>\n", writeLatencyHistogram.GetAvg() / 1000); _Print("<WriteLatencyStdev>%.3f</WriteLatencyStdev>\n", writeLatencyHistogram.GetStandardDeviation() / 1000); } if (totalLatencyHistogram.GetSampleSize() > 0) { _Print("<AverageTotalMilliseconds>%.3f</AverageTotalMilliseconds>\n", totalLatencyHistogram.GetAvg() / 1000); _Print("<LatencyStdev>%.3f</LatencyStdev>\n", totalLatencyHistogram.GetStandardDeviation() / 1000); } _Print("<Bucket>\n"); _Print("<Percentile>0</Percentile>\n"); if (readLatencyHistogram.GetSampleSize() > 0) { _Print("<ReadMilliseconds>%.3f</ReadMilliseconds>\n", readLatencyHistogram.GetMin() / 1000); } if (writeLatencyHistogram.GetSampleSize() > 0) { _Print("<WriteMilliseconds>%.3f</WriteMilliseconds>\n", writeLatencyHistogram.GetMin() / 1000); } if (totalLatencyHistogram.GetSampleSize() > 0) { _Print("<TotalMilliseconds>%.3f</TotalMilliseconds>\n", totalLatencyHistogram.GetMin() / 1000); } _Print("</Bucket>\n"); // Construct vector of percentiles and decimal precision to squelch trailing zeroes. This is more // detailed than summary text output, and does not contain the decorated names (15th, etc.) vector<pair<int, double>> vPercentiles; for (int p = 1; p <= 99; p++) { vPercentiles.push_back(make_pair(0, p)); } vPercentiles.push_back(make_pair(1, 99.9)); vPercentiles.push_back(make_pair(2, 99.99)); vPercentiles.push_back(make_pair(3, 99.999)); vPercentiles.push_back(make_pair(4, 99.9999)); vPercentiles.push_back(make_pair(5, 99.99999)); vPercentiles.push_back(make_pair(6, 99.999999)); vPercentiles.push_back(make_pair(7, 99.9999999)); for (auto p : vPercentiles) { _Print("<Bucket>\n"); _Print("<Percentile>%.*f</Percentile>\n", p.first, p.second); if (readLatencyHistogram.GetSampleSize() > 0) { _Print("<ReadMilliseconds>%.3f</ReadMilliseconds>\n", readLatencyHistogram.GetPercentile(p.second / 100) / 1000); } if (writeLatencyHistogram.GetSampleSize() > 0) { _Print("<WriteMilliseconds>%.3f</WriteMilliseconds>\n", writeLatencyHistogram.GetPercentile(p.second / 100) / 1000); } if (totalLatencyHistogram.GetSampleSize() > 0) { _Print("<TotalMilliseconds>%.3f</TotalMilliseconds>\n", totalLatencyHistogram.GetPercentile(p.second / 100) / 1000); } _Print("</Bucket>\n"); } _Print("<Bucket>\n"); _Print("<Percentile>100</Percentile>\n"); if (readLatencyHistogram.GetSampleSize() > 0) { _Print("<ReadMilliseconds>%.3f</ReadMilliseconds>\n", readLatencyHistogram.GetMax() / 1000); } if (writeLatencyHistogram.GetSampleSize() > 0) { _Print("<WriteMilliseconds>%.3f</WriteMilliseconds>\n", writeLatencyHistogram.GetMax() / 1000); } if (totalLatencyHistogram.GetSampleSize() > 0) { _Print("<TotalMilliseconds>%.3f</TotalMilliseconds>\n", totalLatencyHistogram.GetMax() / 1000); } _Print("</Bucket>\n"); _Print("</Latency>\n"); }