| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index cc9896ea1bb6e01ea68537e9e4d019971395f572..be8cc4a45f911df1fab12fc5db0ae6c7f65029aa 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -27,6 +27,12 @@
|
|
|
| __SK_FORCE_IMAGE_DECODER_LINKING;
|
|
|
| +#if SK_DEBUG
|
| + DEFINE_bool(runOnce, true, "Run each benchmark just once?");
|
| +#else
|
| + DEFINE_bool(runOnce, false, "Run each benchmark just once?");
|
| +#endif
|
| +
|
| DEFINE_int32(samples, 10, "Number of samples to measure for each bench.");
|
| DEFINE_int32(overheadLoops, 100000, "Loops to estimate timer overhead.");
|
| DEFINE_double(overheadGoal, 0.0001,
|
| @@ -104,7 +110,7 @@ static int cpu_bench(const double overhead, Benchmark* bench, SkCanvas* canvas,
|
| // Luckily, this also works well in practice. :)
|
| const double numer = overhead / FLAGS_overheadGoal - overhead;
|
| const double denom = bench_plus_overhead - overhead;
|
| - const int loops = (int)ceil(numer / denom);
|
| + const int loops = FLAGS_runOnce ? 1 : (int)ceil(numer / denom);
|
|
|
| for (int i = 0; i < FLAGS_samples; i++) {
|
| samples[i] = time(loops, bench, canvas, NULL) / loops;
|
| @@ -122,22 +128,24 @@ static int gpu_bench(SkGLContextHelper* gl,
|
|
|
| // First, figure out how many loops it'll take to get a frame up to FLAGS_gpuMs.
|
| int loops = 1;
|
| - double elapsed = 0;
|
| - do {
|
| - loops *= 2;
|
| - // If the GPU lets frames lag at all, we need to make sure we're timing
|
| - // _this_ round, not still timing last round. We force this by looping
|
| - // more times than any reasonable GPU will allow frames to lag.
|
| - for (int i = 0; i < FLAGS_gpuFrameLag; i++) {
|
| - elapsed = time(loops, bench, canvas, gl);
|
| - }
|
| - } while (elapsed < FLAGS_gpuMs);
|
| + if (!FLAGS_runOnce) {
|
| + double elapsed = 0;
|
| + do {
|
| + loops *= 2;
|
| + // If the GPU lets frames lag at all, we need to make sure we're timing
|
| + // _this_ round, not still timing last round. We force this by looping
|
| + // more times than any reasonable GPU will allow frames to lag.
|
| + for (int i = 0; i < FLAGS_gpuFrameLag; i++) {
|
| + elapsed = time(loops, bench, canvas, gl);
|
| + }
|
| + } while (elapsed < FLAGS_gpuMs);
|
|
|
| - // We've overshot at least a little. Scale back linearly.
|
| - loops = (int)ceil(loops * FLAGS_gpuMs / elapsed);
|
| + // We've overshot at least a little. Scale back linearly.
|
| + loops = (int)ceil(loops * FLAGS_gpuMs / elapsed);
|
|
|
| - // Might as well make sure we're not still timing our calibration.
|
| - SK_GL(*gl, Finish());
|
| + // Might as well make sure we're not still timing our calibration.
|
| + SK_GL(*gl, Finish());
|
| + }
|
|
|
| // Pretty much the same deal as the calibration: do some warmup to make
|
| // sure we're timing steady-state pipelined frames.
|
| @@ -252,6 +260,11 @@ int tool_main(int argc, char** argv) {
|
| SkAutoGraphics ag;
|
| SkCommandLineFlags::Parse(argc, argv);
|
|
|
| + if (FLAGS_runOnce) {
|
| + FLAGS_samples = 1;
|
| + FLAGS_gpuFrameLag = 0;
|
| + }
|
| +
|
| MultiResultsWriter log;
|
| SkAutoTDelete<JSONResultsWriter> json;
|
| if (!FLAGS_outResultsFile.isEmpty()) {
|
| @@ -264,7 +277,9 @@ int tool_main(int argc, char** argv) {
|
| const double overhead = estimate_timer_overhead();
|
| SkAutoTMalloc<double> samples(FLAGS_samples);
|
|
|
| - if (FLAGS_verbose) {
|
| + if (FLAGS_runOnce) {
|
| + SkDebugf("--runOnce is true; times would only be misleading so we won't print them.\n");
|
| + } else if (FLAGS_verbose) {
|
| // No header.
|
| } else if (FLAGS_quiet) {
|
| SkDebugf("median\tbench\tconfig\n");
|
| @@ -305,7 +320,12 @@ int tool_main(int argc, char** argv) {
|
| log.timer("max_ms", stats.max);
|
| log.timer("stddev_ms", sqrt(stats.var));
|
|
|
| - if (FLAGS_verbose) {
|
| + if (FLAGS_runOnce) {
|
| + if (targets.count() == 1) {
|
| + config = ""; // Only print the config if we run the same bench on more than one.
|
| + }
|
| + SkDebugf("%s\t%s\n", bench->getName(), config);
|
| + } else if (FLAGS_verbose) {
|
| for (int i = 0; i < FLAGS_samples; i++) {
|
| SkDebugf("%s ", humanize(samples[i]).c_str());
|
| }
|
|
|