string XmlResultParser::ParseResults(Profile& profile, const SystemInformation& system, vector<Results> vResults) { _sResult.clear(); _Print("<Results>\n"); _sResult += system.GetXml(); _sResult += profile.GetXml(); for (size_t iResults = 0; iResults < vResults.size(); iResults++) { const Results& results = vResults[iResults]; const TimeSpan& timeSpan = profile.GetTimeSpans()[iResults]; _Print("<TimeSpan>\n"); double fTime = PerfTimer::PerfTimeToSeconds(results.ullTimeCount); //test duration if (fTime >= 0.0000001) { // There either is a fixed number of threads for all files to share (GetThreadCount() > 0) or a number of threads per file. // In the latter case vThreadResults.size() == number of threads per file * file count size_t ulThreadCnt = (timeSpan.GetThreadCount() > 0) ? timeSpan.GetThreadCount() : results.vThreadResults.size(); unsigned int ulProcCount = system.processorTopology._ulActiveProcCount; _Print("<TestTimeSeconds>%.2f</TestTimeSeconds>\n", fTime); _Print("<ThreadCount>%u</ThreadCount>\n", ulThreadCnt); _Print("<RequestCount>%u</RequestCount>\n", timeSpan.GetRequestCount()); _Print("<ProcCount>%u</ProcCount>\n", ulProcCount); _PrintCpuUtilization(results, system); if (timeSpan.GetMeasureLatency()) { _PrintLatencyPercentiles(results); } if (timeSpan.GetCalculateIopsStdDev()) { _PrintOverallIops(results, timeSpan.GetIoBucketDurationInMilliseconds()); } if (results.fUseETW) { _PrintETW(results.EtwMask, results.EtwEventCounters); _PrintETWSessionInfo(results.EtwSessionInfo); } for (size_t iThread = 0; iThread < results.vThreadResults.size(); iThread++) { const ThreadResults& threadResults = results.vThreadResults[iThread]; _Print("<Thread>\n"); _Print("<Id>%u</Id>\n", iThread); for (const auto& targetResults : threadResults.vTargetResults) { _Print("<Target>\n"); _PrintTargetResults(targetResults); if (timeSpan.GetMeasureLatency()) { _PrintTargetLatency(targetResults); } if (timeSpan.GetCalculateIopsStdDev()) { _PrintTargetIops(targetResults.readBucketizer, targetResults.writeBucketizer, timeSpan.GetIoBucketDurationInMilliseconds()); } _Print("</Target>\n"); } _Print("</Thread>\n"); } } else { _Print("<Error>The test was interrupted before the measurements began. No results are displayed.</Error>\n"); } _Print("</TimeSpan>\n"); } _Print("</Results>"); return _sResult; }