diff options
author | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-08-28 12:18:40 +0000 |
---|---|---|
committer | robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2012-08-28 12:18:40 +0000 |
commit | 91ee3a11ed476f4f08e1e4ae183002c56349ec19 (patch) | |
tree | 399941959a101053debe53ac361d60ecfc1786a8 | |
parent | 2af1b188aa186936a78696e00170167204d9a666 (diff) |
Added second "truncated" cpu/wall timer to bench
http://codereview.appspot.com/6476064/
This CL will increase the bench baselines across the board
git-svn-id: http://skia.googlecode.com/svn/trunk@5305 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r-- | bench/BenchTimer.cpp | 11 | ||||
-rw-r--r-- | bench/BenchTimer.h | 12 | ||||
-rw-r--r-- | bench/benchmain.cpp | 58 | ||||
-rw-r--r-- | tools/PictureBenchmark.cpp | 15 |
4 files changed, 81 insertions, 15 deletions
diff --git a/bench/BenchTimer.cpp b/bench/BenchTimer.cpp index 8ac08a70bc..4e0484459d 100644 --- a/bench/BenchTimer.cpp +++ b/bench/BenchTimer.cpp @@ -23,9 +23,12 @@ BenchTimer::BenchTimer(SkGLContext* gl) : fCpu(-1.0) , fWall(-1.0) + , fTruncatedCpu(-1.0) + , fTruncatedWall(-1.0) , fGpu(-1.0) { fSysTimer = new BenchSysTimer(); + fTruncatedSysTimer = new BenchSysTimer(); #if SK_SUPPORT_GPU if (gl) { fGpuTimer = new BenchGpuTimer(gl); @@ -37,6 +40,7 @@ BenchTimer::BenchTimer(SkGLContext* gl) BenchTimer::~BenchTimer() { delete fSysTimer; + delete fTruncatedSysTimer; #if SK_SUPPORT_GPU delete fGpuTimer; #endif @@ -44,12 +48,14 @@ BenchTimer::~BenchTimer() { void BenchTimer::start() { fSysTimer->startWall(); + fTruncatedSysTimer->startWall(); #if SK_SUPPORT_GPU if (fGpuTimer) { fGpuTimer->startGpu(); } #endif fSysTimer->startCpu(); + fTruncatedSysTimer->startCpu(); } void BenchTimer::end() { @@ -63,3 +69,8 @@ void BenchTimer::end() { #endif fWall = fSysTimer->endWall(); } + +void BenchTimer::truncatedEnd() { + fTruncatedCpu = fTruncatedSysTimer->endCpu(); + fTruncatedWall = fTruncatedSysTimer->endWall(); +} diff --git a/bench/BenchTimer.h b/bench/BenchTimer.h index 70675ad17f..58773d403c 100644 --- a/bench/BenchTimer.h +++ b/bench/BenchTimer.h @@ -18,8 +18,12 @@ class SkGLContext; /** * SysTimers and GpuTimers are implemented orthogonally. - * This class combines a SysTimer and a GpuTimer into one single, - * platform specific, Timer with a simple interface. + * This class combines 2 SysTimers and a GpuTimer into one single, + * platform specific Timer with a simple interface. The truncated + * timer doesn't include the time required for the GPU to finish + * its rendering. It should always be <= the un-truncated system + * times and (for GPU configurations) can be used to roughly (very + * roughly) gauge the GPU load/backlog. */ class BenchTimer { public: @@ -27,12 +31,16 @@ public: ~BenchTimer(); void start(); void end(); + void truncatedEnd(); double fCpu; double fWall; + double fTruncatedCpu; + double fTruncatedWall; double fGpu; private: BenchSysTimer *fSysTimer; + BenchSysTimer *fTruncatedSysTimer; #if SK_SUPPORT_GPU BenchGpuTimer *fGpuTimer; #endif diff --git a/bench/benchmain.cpp b/bench/benchmain.cpp index dfd39fd5bd..dfde94a396 100644 --- a/bench/benchmain.cpp +++ b/bench/benchmain.cpp @@ -396,7 +396,7 @@ static bool skip_name(const SkTDArray<const char*> array, const char name[]) { static void help() { SkDebugf("Usage: bench [-o outDir] [-repeat nr] [-logPerIter 1|0] " - "[-timers [wcg]*] [-rotate]\n" + "[-timers [wcgWC]*] [-rotate]\n" " [-scale] [-clip] [-min] [-forceAA 1|0] [-forceFilter 1|0]\n" " [-forceDither 1|0] [-forceBlend 1|0] [-strokeWidth width]\n" " [-match name] [-mode normal|deferred|record|picturerecord]\n" @@ -407,8 +407,8 @@ static void help() { SkDebugf(" -repeat nr : Each bench repeats for nr times.\n"); SkDebugf(" -logPerIter 1|0 : " "Log each repeat timer instead of mean, default is disabled.\n"); - SkDebugf(" -timers [wcg]* : " - "Display wall time, cpu time or gpu time for each bench.\n"); + SkDebugf(" -timers [wcgWC]* : " + "Display wall, cpu, gpu, truncated wall or truncated cpu time for each bench.\n"); SkDebugf(" -rotate : Rotate before each bench runs.\n"); SkDebugf(" -scale : Scale before each bench runs.\n"); SkDebugf(" -clip : Clip before each bench runs.\n"); @@ -455,7 +455,9 @@ int main (int argc, char * const argv[]) { bool forceFilter = false; SkTriState::State forceDither = SkTriState::kDefault; bool timerWall = false; + bool truncatedTimerWall = false; bool timerCpu = true; + bool truncatedTimerCpu = false; bool timerGpu = true; bool doScale = false; bool doRotate = false; @@ -508,12 +510,16 @@ int main (int argc, char * const argv[]) { argv++; if (argv < stop) { timerWall = false; + truncatedTimerWall = false; timerCpu = false; + truncatedTimerCpu = false; timerGpu = false; for (char* t = *argv; *t; ++t) { switch (*t) { case 'w': timerWall = true; break; case 'c': timerCpu = true; break; + case 'W': truncatedTimerWall = true; break; + case 'C': truncatedTimerCpu = true; break; case 'g': timerGpu = true; break; } } @@ -836,6 +842,12 @@ int main (int argc, char * const argv[]) { // warm up caches if needed if (repeatDraw > 1) { +#if SK_SUPPORT_GPU + if (glHelper) { + // purge the GPU resources to reduce variance + glHelper->grContext()->freeGpuResources(); + } +#endif SkAutoCanvasRestore acr(canvas, true); if (benchMode == kPictureRecord_benchModes) { pictureRecordFrom.draw(canvas); @@ -853,10 +865,14 @@ int main (int argc, char * const argv[]) { // record timer values for each repeat, and their sum SkString fWallStr(" msecs = "); + SkString fTruncatedWallStr(" Wmsecs = "); SkString fCpuStr(" cmsecs = "); + SkString fTruncatedCpuStr(" Cmsecs = "); SkString fGpuStr(" gmsecs = "); double fWallSum = 0.0, fWallMin; + double fTruncatedWallSum = 0.0, fTruncatedWallMin; double fCpuSum = 0.0, fCpuMin; + double fTruncatedCpuSum = 0.0, fTruncatedCpuMin; double fGpuSum = 0.0, fGpuMin; for (int i = 0; i < repeatDraw; i++) { if ((benchMode == kRecord_benchModes @@ -874,23 +890,36 @@ int main (int argc, char * const argv[]) { bench->draw(canvas); } canvas->flush(); + + // stop the truncated timer after the last canvas call but + // don't wait for all the GL calls to complete + timer.truncatedEnd(); #if SK_SUPPORT_GPU if (glHelper) { glHelper->grContext()->flush(); + SK_GL(*glHelper->glContext(), Finish()); } #endif + // stop the inclusive and gpu timers once all the GL calls + // have completed timer.end(); if (i == repeatDraw - 1) { // no comma after the last value fWallStr.appendf(perIterTimeformat.c_str(), timer.fWall); fCpuStr.appendf(perIterTimeformat.c_str(), timer.fCpu); + fTruncatedWallStr.appendf(perIterTimeformat.c_str(), timer.fTruncatedWall); + fTruncatedCpuStr.appendf(perIterTimeformat.c_str(), timer.fTruncatedCpu); fGpuStr.appendf(perIterTimeformat.c_str(), timer.fGpu); } else { fWallStr.appendf(perIterTimeformat.c_str(), timer.fWall); fWallStr.appendf(","); fCpuStr.appendf(perIterTimeformat.c_str(), timer.fCpu); fCpuStr.appendf(","); + fTruncatedWallStr.appendf(perIterTimeformat.c_str(), timer.fTruncatedWall); + fTruncatedWallStr.appendf(","); + fTruncatedCpuStr.appendf(perIterTimeformat.c_str(), timer.fTruncatedCpu); + fTruncatedCpuStr.appendf(","); fGpuStr.appendf(perIterTimeformat.c_str(), timer.fGpu); fGpuStr.appendf(","); } @@ -898,22 +927,23 @@ int main (int argc, char * const argv[]) { if (0 == i) { fWallMin = timer.fWall; fCpuMin = timer.fCpu; + fTruncatedWallMin = timer.fTruncatedWall; + fTruncatedCpuMin = timer.fTruncatedCpu; fGpuMin = timer.fGpu; } else { 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); } fWallSum += timer.fWall; fCpuSum += timer.fCpu; + fTruncatedWallSum += timer.fTruncatedWall; + fTruncatedCpuSum += timer.fTruncatedCpu; fGpuSum += timer.fGpu; } -#if SK_SUPPORT_GPU - if (glHelper) { - SK_GL(*glHelper->glContext(), Finish()); - } -#endif if (repeatDraw > 1) { // output each repeat (no average) if logPerIter is set, // otherwise output only the average @@ -924,6 +954,12 @@ int main (int argc, char * const argv[]) { fCpuStr.set(" cmsecs = "); fCpuStr.appendf(normalTimeFormat.c_str(), printMin ? fCpuMin : fCpuSum / repeatDraw); + fTruncatedWallStr.set(" Wmsecs = "); + fTruncatedWallStr.appendf(normalTimeFormat.c_str(), + printMin ? fTruncatedWallMin : fTruncatedWallSum / repeatDraw); + fTruncatedCpuStr.set(" Cmsecs = "); + fTruncatedCpuStr.appendf(normalTimeFormat.c_str(), + printMin ? fTruncatedCpuMin : fTruncatedCpuSum / repeatDraw); fGpuStr.set(" gmsecs = "); fGpuStr.appendf(normalTimeFormat.c_str(), printMin ? fGpuMin : fGpuSum / repeatDraw); @@ -933,9 +969,15 @@ int main (int argc, char * const argv[]) { if (timerWall) { str += fWallStr; } + if (truncatedTimerWall) { + str += fTruncatedWallStr; + } if (timerCpu) { str += fCpuStr; } + if (truncatedTimerCpu) { + str += fTruncatedCpuStr; + } if (timerGpu && glHelper && fGpuSum > 0) { str += fGpuStr; } diff --git a/tools/PictureBenchmark.cpp b/tools/PictureBenchmark.cpp index df30d5a561..164d3c356c 100644 --- a/tools/PictureBenchmark.cpp +++ b/tools/PictureBenchmark.cpp @@ -43,7 +43,7 @@ void PipePictureBenchmark::run(SkPicture* pict) { fRenderer.resetState(); BenchTimer* timer = this->setupTimer(); - double wall_time = 0; + double wall_time = 0, truncated_wall_time = 0; #if SK_SUPPORT_GPU double gpu_time = 0; #endif @@ -55,6 +55,7 @@ void PipePictureBenchmark::run(SkPicture* pict) { fRenderer.resetState(); wall_time += timer->fWall; + truncated_wall_time += timer->fTruncatedWall; #if SK_SUPPORT_GPU if (fRenderer.isUsingGpuDevice()) { gpu_time += timer->fGpu; @@ -83,7 +84,7 @@ void RecordPictureBenchmark::run(SkPicture* pict) { } BenchTimer* timer = setupTimer(); - double wall_time = 0; + double wall_time = 0, truncated_wall_time = 0; for (int i = 0; i < fRepeats + 1; ++i) { SkPicture replayer; @@ -96,6 +97,7 @@ void RecordPictureBenchmark::run(SkPicture* pict) { // We want to ignore first time effects if (i > 0) { wall_time += timer->fWall; + truncated_wall_time += timer->fTruncatedWall; } } @@ -121,7 +123,7 @@ void SimplePictureBenchmark::run(SkPicture* pict) { BenchTimer* timer = this->setupTimer(); - double wall_time = 0; + double wall_time = 0, truncated_wall_time = 0; #if SK_SUPPORT_GPU double gpu_time = 0; #endif @@ -133,6 +135,7 @@ void SimplePictureBenchmark::run(SkPicture* pict) { fRenderer.resetState(); wall_time += timer->fWall; + truncated_wall_time += timer->fTruncatedWall; #if SK_SUPPORT_GPU if (fRenderer.isUsingGpuDevice()) { gpu_time += timer->fGpu; @@ -169,7 +172,7 @@ void TiledPictureBenchmark::run(SkPicture* pict) { fRenderer.resetState(); BenchTimer* timer = setupTimer(); - double wall_time = 0; + double wall_time = 0, truncated_wall_time = 0; #if SK_SUPPORT_GPU double gpu_time = 0; #endif @@ -181,6 +184,7 @@ void TiledPictureBenchmark::run(SkPicture* pict) { fRenderer.resetState(); wall_time += timer->fWall; + truncated_wall_time += timer->fTruncatedWall; #if SK_SUPPORT_GPU if (fRenderer.isUsingGpuDevice()) { gpu_time += timer->fGpu; @@ -216,7 +220,7 @@ void UnflattenPictureBenchmark::run(SkPicture* pict) { } BenchTimer* timer = setupTimer(); - double wall_time = 0; + double wall_time = 0, truncated_wall_time = 0; for (int i = 0; i < fRepeats + 1; ++i) { SkPicture replayer; @@ -231,6 +235,7 @@ void UnflattenPictureBenchmark::run(SkPicture* pict) { // We want to ignore first time effects if (i > 0) { wall_time += timer->fWall; + truncated_wall_time += timer->fTruncatedWall; } } |