int tool_main(int argc, char** argv) { SkAutoGraphics ag; SkString usage; usage.printf("Usage: filename [filename]*\n"); if (argc < 2) { SkDebugf("%s\n", usage.c_str()); return -1; } SkTArray<Histogram> histograms[kNumBenchmarks]; for (size_t i = 0; i < kNumBenchmarks; ++i) { histograms[i].reset(argc - 1); bool success = benchmark_loop( argc, argv, BenchmarkControl::Make(i), histograms[i]); if (!success) { SkDebugf("benchmark_loop failed at index %d", i); } } // Output gnuplot readable histogram data.. const char* pbTitle = "bbh_shootout_playback.dat"; const char* recTitle = "bbh_shootout_record.dat"; SkFILEWStream playbackOut(pbTitle); SkFILEWStream recordOut(recTitle); recordOut.writeText("# "); playbackOut.writeText("# "); for (size_t i = 0; i < kNumBenchmarks; ++i) { SkString out; out.printf("%s ", BenchmarkControl::getBenchmarkName(i).c_str()); if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_recording) { recordOut.writeText(out.c_str()); } if (BenchmarkControl::getBenchmarkFunc(i) == &benchmark_playback) { playbackOut.writeText(out.c_str()); } } recordOut.writeText("\n"); playbackOut.writeText("\n"); for (int i = 0; i < argc - 1; ++i) { SkString pbLine; SkString recLine; // ==== Write record info recLine.printf("%d ", i); recLine.appendf("%f ", histograms[0][i].fCpuTime); // Append normal_record time recLine.appendf("%f", histograms[1][i].fCpuTime); // Append rtree_record time // ==== Write playback info pbLine.printf("%d ", i); pbLine.appendf("%f ", histograms[2][i].fCpuTime); // Start with normal playback time. // Append all playback benchmark times. for (size_t j = kNumBbhPlaybackBenchmarks; j < kNumBenchmarks; ++j) { pbLine.appendf("%f ", histograms[j][i].fCpuTime); } pbLine.remove(pbLine.size() - 1, 1); // Remove trailing space from line. pbLine.appendf("\n"); recLine.appendf("\n"); playbackOut.writeText(pbLine.c_str()); recordOut.writeText(recLine.c_str()); } SkDebugf("\nWrote data to gnuplot-readable files: %s %s\n", pbTitle, recTitle); return 0; }
int tool_main(int argc, char** argv) { SkCommandLineFlags::Parse(argc, argv); SkAutoGraphics ag; bool includeBBoxType[kBBoxTypeCount]; for (int bBoxType = 0; bBoxType < kBBoxTypeCount; ++bBoxType) { includeBBoxType[bBoxType] = (FLAGS_bb_types.count() == 0) || FLAGS_bb_types.contains(kBBoxHierarchyTypeNames[bBoxType]); } // go through all the pictures SkTArray<Measurement> measurements; for (int index = 0; index < FLAGS_skps.count(); ++index) { const char* path = FLAGS_skps[index]; SkPicture* picture = pic_from_path(path); if (NULL == picture) { SkDebugf("Couldn't create picture. Ignoring path: %s\n", path); continue; } SkDebugf("Benchmarking path: %s\n", path); Measurement& measurement = measurements.push_back(); measurement.fName = path; for (int bBoxType = 0; bBoxType < kBBoxTypeCount; ++bBoxType) { if (!includeBBoxType[bBoxType]) { continue; } if (FLAGS_playback > 0) { sk_tools::TiledPictureRenderer playbackRenderer; BenchTimer playbackTimer; do_benchmark_work(&playbackRenderer, (BBoxType)bBoxType, picture, FLAGS_playback, &playbackTimer); measurement.fPlaybackAverage[bBoxType] = playbackTimer.fCpu; } if (FLAGS_record > 0) { sk_tools::RecordPictureRenderer recordRenderer; BenchTimer recordTimer; do_benchmark_work(&recordRenderer, (BBoxType)bBoxType, picture, FLAGS_record, &recordTimer); measurement.fRecordAverage[bBoxType] = recordTimer.fCpu; } } } Measurement globalMeasurement; for (int bBoxType = 0; bBoxType < kBBoxTypeCount; ++bBoxType) { if (!includeBBoxType[bBoxType]) { continue; } globalMeasurement.fPlaybackAverage[bBoxType] = 0; globalMeasurement.fRecordAverage[bBoxType] = 0; for (int index = 0; index < measurements.count(); ++index) { const Measurement& measurement = measurements[index]; globalMeasurement.fPlaybackAverage[bBoxType] += measurement.fPlaybackAverage[bBoxType]; globalMeasurement.fRecordAverage[bBoxType] += measurement.fRecordAverage[bBoxType]; } globalMeasurement.fPlaybackAverage[bBoxType] /= measurements.count(); globalMeasurement.fRecordAverage[bBoxType] /= measurements.count(); } // Output gnuplot readable histogram data.. const char* pbTitle = "bbh_shootout_playback.dat"; const char* recTitle = "bbh_shootout_record.dat"; SkFILEWStream playbackOut(pbTitle); SkFILEWStream recordOut(recTitle); recordOut.writeText("# "); playbackOut.writeText("# "); SkDebugf("---\n"); for (int bBoxType = 0; bBoxType < kBBoxTypeCount; ++bBoxType) { if (!includeBBoxType[bBoxType]) { continue; } SkString out; out.printf("%s ", kBBoxHierarchyTypeNames[bBoxType]); recordOut.writeText(out.c_str()); playbackOut.writeText(out.c_str()); if (FLAGS_record > 0) { SkDebugf("Average %s recording time: %.3fms\n", kBBoxHierarchyTypeNames[bBoxType], globalMeasurement.fRecordAverage[bBoxType]); } if (FLAGS_playback > 0) { SkDebugf("Average %s playback time: %.3fms\n", kBBoxHierarchyTypeNames[bBoxType], globalMeasurement.fPlaybackAverage[bBoxType]); } } recordOut.writeText("\n"); playbackOut.writeText("\n"); // Write to file, and save recording averages. for (int index = 0; index < measurements.count(); ++index) { const Measurement& measurement = measurements[index]; SkString pbLine; SkString recLine; pbLine.printf("%d", index); recLine.printf("%d", index); for (int bBoxType = 0; bBoxType < kBBoxTypeCount; ++bBoxType) { if (!includeBBoxType[bBoxType]) { continue; } pbLine.appendf(" %f", measurement.fPlaybackAverage[bBoxType]); recLine.appendf(" %f", measurement.fRecordAverage[bBoxType]); } pbLine.appendf("\n"); recLine.appendf("\n"); playbackOut.writeText(pbLine.c_str()); recordOut.writeText(recLine.c_str()); } SkDebugf("\nWrote data to gnuplot-readable files: %s %s\n", pbTitle, recTitle); return 0; }