in XmlResultParser/XmlResultParser.cpp [396:500]
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);
}
}
_PrintInc("<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);
}
_PrintInc("<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);
}
_PrintDec("</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)
{
_PrintInc("<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);
}
_PrintDec("</Bucket>\n");
}
_PrintInc("<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);
}
_PrintDec("</Bucket>\n");
_PrintDec("</Latency>\n");
}