12009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org/*
22009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
32009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *
42009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  Use of this source code is governed by a BSD-style license
52009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
62009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
72009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
82009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
92009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org */
102009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
112009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org// A stripped-down version of Chromium's chrome/test/perf/perf_test.cc.
122009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org// ResultsToString(), PrintResult(size_t value) and AppendResult(size_t value)
132009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org// have been modified. The remainder are identical to the Chromium version.
142009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
152009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org#include "webrtc/test/testsupport/perf_test.h"
162009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
172009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org#include <sstream>
1834741c8b0e284a2a1b265b1c681e2539ae93f97dpbos@webrtc.org#include <stdio.h>
192009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
202009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgnamespace {
212009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
222009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgstd::string ResultsToString(const std::string& measurement,
232009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& modifier,
242009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& trace,
252009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& values,
262009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& prefix,
272009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& suffix,
282009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            const std::string& units,
292009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            bool important) {
302009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // <*>RESULT <graph_name>: <trace_name>= <value> <units>
312009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units>
322009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units>
332009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
342009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // TODO(ajm): Use of a stream here may violate the style guide (depending on
352009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // one's definition of "logging"). Consider adding StringPrintf-like
362009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  // functionality as in the original Chromium implementation.
372009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  std::ostringstream stream;
382009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  if (important) {
392009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org    stream << "*";
402009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  }
412009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  stream << "RESULT " << measurement << modifier << ": " << trace << "= "
422009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org         << prefix << values << suffix << " " << units << std::endl;
432009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  return stream.str();
442009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
452009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
462009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintResultsImpl(const std::string& measurement,
472009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& modifier,
482009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& trace,
492009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& values,
502009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& prefix,
512009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& suffix,
522009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& units,
532009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      bool important) {
542009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  printf("%s", ResultsToString(measurement, modifier, trace, values,
552009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                               prefix, suffix, units, important).c_str());
562009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
572009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
582009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}  // namespace
592009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
602009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgnamespace webrtc {
612009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgnamespace test {
622009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
632009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintResult(const std::string& measurement,
642009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& modifier,
652009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& trace,
662009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 size_t value,
672009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& units,
682009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 bool important) {
692009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  std::ostringstream value_stream;
702009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  value_stream << value;
712009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  PrintResultsImpl(measurement, modifier, trace, value_stream.str(), "", "",
722009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                   units, important);
732009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
742009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
752009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid AppendResult(std::string& output,
762009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& measurement,
772009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& modifier,
782009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& trace,
792009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  size_t value,
802009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& units,
812009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  bool important) {
822009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  std::ostringstream value_stream;
832009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  value_stream << value;
842009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  output += ResultsToString(measurement, modifier, trace,
852009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            value_stream.str(),
862009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            "", "", units, important);
872009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
882009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
892009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintResult(const std::string& measurement,
902009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& modifier,
912009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& trace,
922009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& value,
932009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 const std::string& units,
942009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                 bool important) {
952009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  PrintResultsImpl(measurement, modifier, trace, value, "", "", units,
962009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                   important);
972009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
982009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
992009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid AppendResult(std::string& output,
1002009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& measurement,
1012009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& modifier,
1022009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& trace,
1032009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& value,
1042009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  const std::string& units,
1052009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                  bool important) {
1062009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  output += ResultsToString(measurement, modifier, trace, value, "", "", units,
1072009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            important);
1082009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1092009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1102009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintResultMeanAndError(const std::string& measurement,
1112009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             const std::string& modifier,
1122009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             const std::string& trace,
1132009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             const std::string& mean_and_error,
1142009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             const std::string& units,
1152009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             bool important) {
1162009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  PrintResultsImpl(measurement, modifier, trace, mean_and_error,
1172009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                   "{", "}", units, important);
1182009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1192009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1202009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid AppendResultMeanAndError(std::string& output,
1212009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              const std::string& measurement,
1222009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              const std::string& modifier,
1232009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              const std::string& trace,
1242009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              const std::string& mean_and_error,
1252009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              const std::string& units,
1262009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                              bool important) {
1272009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  output += ResultsToString(measurement, modifier, trace, mean_and_error,
1282009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            "{", "}", units, important);
1292009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1302009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1312009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintResultList(const std::string& measurement,
1322009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                     const std::string& modifier,
1332009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                     const std::string& trace,
1342009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                     const std::string& values,
1352009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                     const std::string& units,
1362009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                     bool important) {
1372009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  PrintResultsImpl(measurement, modifier, trace, values,
1382009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                   "[", "]", units, important);
1392009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1402009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1412009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid AppendResultList(std::string& output,
1422009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& measurement,
1432009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& modifier,
1442009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& trace,
1452009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& values,
1462009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      const std::string& units,
1472009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                      bool important) {
1482009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  output += ResultsToString(measurement, modifier, trace, values,
1492009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                            "[", "]", units, important);
1502009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1512009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1522009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintSystemCommitCharge(const std::string& test_name,
1532009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             size_t charge,
1542009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             bool important) {
1552009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  PrintSystemCommitCharge(stdout, test_name, charge, important);
1562009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1572009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1582009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgvoid PrintSystemCommitCharge(FILE* target,
1592009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             const std::string& test_name,
1602009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             size_t charge,
1612009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                             bool important) {
1622009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  fprintf(target, "%s", SystemCommitChargeToString(test_name, charge,
1632009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                                                   important).c_str());
1642009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1652009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1662009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.orgstd::string SystemCommitChargeToString(const std::string& test_name,
1672009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                                       size_t charge,
1682009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org                                       bool important) {
1692009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  std::string trace_name(test_name);
1702009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  std::string output;
1712009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  AppendResult(output, "commit_charge", "", "cc" + trace_name, charge, "kb",
1722009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org               important);
1732009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org  return output;
1742009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}
1752009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org
1762009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}  // namespace test
1772009f6b236a94b144c25d3e8bb2b7b95a536973eandrew@webrtc.org}  // namespace webrtc
178