| Index: bench/TimerData.cpp
|
| diff --git a/bench/TimerData.cpp b/bench/TimerData.cpp
|
| index 3b4baacfcde4aac38fa842c770c892214b8451b5..f3084b047a42d7466e03a122bbada994a6bfad10 100644
|
| --- a/bench/TimerData.cpp
|
| +++ b/bench/TimerData.cpp
|
| @@ -13,96 +13,130 @@
|
|
|
| using namespace std;
|
|
|
| -TimerData::TimerData(const SkString& perIterTimeFormat, const SkString& normalTimeFormat)
|
| -: fWallStr(" msecs = ")
|
| -, fTruncatedWallStr(" Wmsecs = ")
|
| -, fCpuStr(" cmsecs = ")
|
| -, fTruncatedCpuStr(" Cmsecs = ")
|
| -, fGpuStr(" gmsecs = ")
|
| -, fWallSum(0.0)
|
| -, fWallMin(numeric_limits<double>::max())
|
| -, fTruncatedWallSum(0.0)
|
| -, fTruncatedWallMin(numeric_limits<double>::max())
|
| -, fCpuSum(0.0)
|
| -, fCpuMin(numeric_limits<double>::max())
|
| -, fTruncatedCpuSum(0.0)
|
| -, fTruncatedCpuMin(numeric_limits<double>::max())
|
| -, fGpuSum(0.0)
|
| -, fGpuMin(numeric_limits<double>::max())
|
| -, fPerIterTimeFormat(perIterTimeFormat)
|
| -, fNormalTimeFormat(normalTimeFormat)
|
| -{}
|
| -
|
| -static double Min(double a, double b) {
|
| - return (a < b) ? a : b;
|
| +TimerData::TimerData(int maxNumTimings)
|
| +: fMaxNumTimings(maxNumTimings)
|
| +, fCurrTiming(0)
|
| +, fWallTimes(maxNumTimings)
|
| +, fTruncatedWallTimes(maxNumTimings)
|
| +, fCpuTimes(maxNumTimings)
|
| +, fTruncatedCpuTimes(maxNumTimings)
|
| +, fGpuTimes(maxNumTimings){
|
| }
|
|
|
| -void TimerData::appendTimes(BenchTimer* timer, bool last) {
|
| +bool TimerData::appendTimes(BenchTimer* timer) {
|
| SkASSERT(timer != NULL);
|
| - SkString formatString(fPerIterTimeFormat);
|
| - if (!last) {
|
| - formatString.append(",");
|
| + if (fCurrTiming >= fMaxNumTimings) {
|
| + return false;
|
| }
|
| - const char* format = formatString.c_str();
|
| - fWallStr.appendf(format, timer->fWall);
|
| - fCpuStr.appendf(format, timer->fCpu);
|
| - fTruncatedWallStr.appendf(format, timer->fTruncatedWall);
|
| - fTruncatedCpuStr.appendf(format, timer->fTruncatedCpu);
|
| - fGpuStr.appendf(format, timer->fGpu);
|
| -
|
| - // Store the minimum values. We do not need to special case the first time since we initialized
|
| - // to max double.
|
| - fWallMin = Min(fWallMin, timer->fWall);
|
| - fCpuMin = Min(fCpuMin, timer->fCpu);
|
| - fTruncatedWallMin = Min(fTruncatedWallMin, timer->fTruncatedWall);
|
| - fTruncatedCpuMin = Min(fTruncatedCpuMin, timer->fTruncatedCpu);
|
| - fGpuMin = Min(fGpuMin, timer->fGpu);
|
| -
|
| - // Tally the sum of each timer type.
|
| - fWallSum += timer->fWall;
|
| - fCpuSum += timer->fCpu;
|
| - fTruncatedWallSum += timer->fTruncatedWall;
|
| - fTruncatedCpuSum += timer->fTruncatedCpu;
|
| - fGpuSum += timer->fGpu;
|
|
|
| + fWallTimes[fCurrTiming] = timer->fWall;
|
| + fTruncatedWallTimes[fCurrTiming] = timer->fTruncatedWall;
|
| + fCpuTimes[fCurrTiming] = timer->fCpu;
|
| + fTruncatedCpuTimes[fCurrTiming] = timer->fTruncatedCpu;
|
| + fGpuTimes[fCurrTiming] = timer->fGpu;
|
| +
|
| + ++fCurrTiming;
|
| +
|
| + return true;
|
| }
|
|
|
| -SkString TimerData::getResult(bool logPerIter, bool printMin, int repeatDraw,
|
| - const char *configName, bool showWallTime, bool showTruncatedWallTime,
|
| - bool showCpuTime, bool showTruncatedCpuTime, bool showGpuTime) {
|
| - // output each repeat (no average) if logPerIter is set,
|
| - // otherwise output only the average
|
| - if (!logPerIter) {
|
| - const char* format = fNormalTimeFormat.c_str();
|
| - fWallStr.set(" msecs = ");
|
| - fWallStr.appendf(format, printMin ? fWallMin : fWallSum / repeatDraw);
|
| - fCpuStr.set(" cmsecs = ");
|
| - fCpuStr.appendf(format, printMin ? fCpuMin : fCpuSum / repeatDraw);
|
| - fTruncatedWallStr.set(" Wmsecs = ");
|
| - fTruncatedWallStr.appendf(format,
|
| - printMin ? fTruncatedWallMin : fTruncatedWallSum / repeatDraw);
|
| - fTruncatedCpuStr.set(" Cmsecs = ");
|
| - fTruncatedCpuStr.appendf(format,
|
| - printMin ? fTruncatedCpuMin : fTruncatedCpuSum / repeatDraw);
|
| - fGpuStr.set(" gmsecs = ");
|
| - fGpuStr.appendf(format, printMin ? fGpuMin : fGpuSum / repeatDraw);
|
| +SkString TimerData::getResult(const char* doubleFormat,
|
| + Result result,
|
| + const char *configName,
|
| + uint32_t timerFlags,
|
| + int itersPerTiming) {
|
| + SkASSERT(itersPerTiming >= 1);
|
| +
|
| + if (!fCurrTiming) {
|
| + return SkString("");
|
| + }
|
| +
|
| + int numTimings = fCurrTiming;
|
| +
|
| + SkString wallStr(" msecs = ");
|
| + SkString truncWallStr(" Wmsecs = ");
|
| + SkString cpuStr(" cmsecs = ");
|
| + SkString truncCpuStr(" Cmsecs = ");
|
| + SkString gpuStr(" gmsecs = ");
|
| +
|
| + double wallMin = std::numeric_limits<double>::max();
|
| + double truncWallMin = std::numeric_limits<double>::max();
|
| + double cpuMin = std::numeric_limits<double>::max();
|
| + double truncCpuMin = std::numeric_limits<double>::max();
|
| + double gpuMin = std::numeric_limits<double>::max();
|
| +
|
| + double wallSum = 0;
|
| + double truncWallSum = 0;
|
| + double cpuSum = 0;
|
| + double truncCpuSum = 0;
|
| + double gpuSum = 0;
|
| +
|
| + for (int i = 0; i < numTimings; ++i) {
|
| + if (kPerIter_Result == result) {
|
| + wallStr.appendf(doubleFormat, fWallTimes[i]);
|
| + truncWallStr.appendf(doubleFormat, fTruncatedWallTimes[i]);
|
| + cpuStr.appendf(doubleFormat, fCpuTimes[i]);
|
| + truncCpuStr.appendf(doubleFormat, fTruncatedCpuTimes[i]);
|
| + gpuStr.appendf(doubleFormat, fGpuTimes[i]);
|
| +
|
| + if (i != numTimings - 1) {
|
| + static const char kSep[] = ", ";
|
| + wallStr.append(kSep);
|
| + truncWallStr.append(kSep);
|
| + cpuStr.append(kSep);
|
| + truncCpuStr.append(kSep);
|
| + gpuStr.append(kSep);
|
| + }
|
| + } else if (kMin_Result == result) {
|
| + wallMin = SkTMin(wallMin, fWallTimes[i]);
|
| + truncWallMin = SkTMin(truncWallMin, fTruncatedWallTimes[i]);
|
| + cpuMin = SkTMin(cpuMin, fCpuTimes[i]);
|
| + truncCpuMin = SkTMin(truncCpuMin, fTruncatedCpuTimes[i]);
|
| + gpuMin = SkTMin(gpuMin, fGpuTimes[i]);
|
| + } else {
|
| + SkASSERT(kAvg_Result == result);
|
| + wallSum += fWallTimes[i];
|
| + truncWallSum += fTruncatedWallTimes[i];
|
| + cpuSum += fCpuTimes[i];
|
| + truncCpuSum += fTruncatedCpuTimes[i];
|
| + }
|
| +
|
| + // We always track the GPU sum because whether it is non-zero indicates if valid gpu times
|
| + // were recorded at all.
|
| + gpuSum += fGpuTimes[i];
|
| }
|
| +
|
| + if (kMin_Result == result) {
|
| + wallStr.appendf(doubleFormat, wallMin / itersPerTiming);
|
| + truncWallStr.appendf(doubleFormat, truncWallMin / itersPerTiming);
|
| + cpuStr.appendf(doubleFormat, cpuMin / itersPerTiming);
|
| + truncCpuStr.appendf(doubleFormat, truncCpuMin / itersPerTiming);
|
| + gpuStr.appendf(doubleFormat, gpuMin / itersPerTiming);
|
| + } else if (kAvg_Result == result) {
|
| + int divisor = numTimings * itersPerTiming;
|
| + wallStr.appendf(doubleFormat, wallSum / divisor);
|
| + truncWallStr.appendf(doubleFormat, truncWallSum / divisor);
|
| + cpuStr.appendf(doubleFormat, cpuSum / divisor);
|
| + truncCpuStr.appendf(doubleFormat, truncCpuSum / divisor);
|
| + gpuStr.appendf(doubleFormat, gpuSum / divisor);
|
| + }
|
| +
|
| SkString str;
|
| str.printf(" %4s:", configName);
|
| - if (showWallTime) {
|
| - str += fWallStr;
|
| + if (timerFlags & kWall_Flag) {
|
| + str += wallStr;
|
| }
|
| - if (showTruncatedWallTime) {
|
| - str += fTruncatedWallStr;
|
| + if (timerFlags & kTruncatedWall_Flag) {
|
| + str += truncWallStr;
|
| }
|
| - if (showCpuTime) {
|
| - str += fCpuStr;
|
| + if (timerFlags & kCpu_Flag) {
|
| + str += cpuStr;
|
| }
|
| - if (showTruncatedCpuTime) {
|
| - str += fTruncatedCpuStr;
|
| + if (timerFlags & kTruncatedCpu_Flag) {
|
| + str += truncCpuStr;
|
| }
|
| - if (showGpuTime && fGpuSum > 0) {
|
| - str += fGpuStr;
|
| + if ((timerFlags & kGpu_Flag) && gpuSum > 0) {
|
| + str += gpuStr;
|
| }
|
| return str;
|
| }
|
|
|