blob: 26a2c43b3837737e4c6de63390dc07d6537c20d6 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#import "ios/chrome/browser/web/chrome_web_client.h"
#import "ios/chrome/test/base/perf_test_ios.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
PerfTest::PerfTest(std::string testGroup)
: BlockCleanupTest(),
testGroup_(testGroup),
firstLabel_("1st"),
averageLabel_("2nd+"),
isWaterfall_(false),
verbose_(true),
repeatCount_(10),
web_client_(base::MakeUnique<ChromeWebClient>()) {}
PerfTest::PerfTest(std::string testGroup,
std::string firstLabel,
std::string averageLabel,
bool isWaterfall,
bool verbose,
int repeat)
: BlockCleanupTest(),
testGroup_(testGroup),
firstLabel_(firstLabel),
averageLabel_(averageLabel),
isWaterfall_(isWaterfall),
verbose_(verbose),
repeatCount_(repeat),
web_client_(base::MakeUnique<ChromeWebClient>()) {}
PerfTest::~PerfTest() {}
void PerfTest::LogPerfTiming(std::string testName, base::TimeDelta elapsed) {
LogPerfValue(testName, elapsed.InMillisecondsF(), "ms");
}
void PerfTest::LogPerfValue(std::string testName,
double value,
std::string unit) {
NSLog(@"%sRESULT %s: %s= %.3f %s\n", isWaterfall_ ? "*" : "",
testGroup_.c_str(), testName.c_str(), value, unit.c_str());
}
void PerfTest::RepeatTimedRuns(std::string testName,
TimedActionBlock timedAction,
ProceduralBlock postAction) {
RepeatTimedRuns(testName, timedAction, postAction, repeatCount_);
}
void PerfTest::RepeatTimedRuns(std::string testName,
TimedActionBlock timedAction,
ProceduralBlock postAction,
int repeat) {
base::TimeDelta firstElapsed;
base::TimeDelta totalElapsed;
base::TimeDelta maxElapsed;
base::TimeDelta minElapsed = base::TimeDelta::FromSeconds(1000);
for (int i = 0; i < repeat + 1; ++i) {
base::TimeDelta elapsed = timedAction(i);
if (i == 0) {
std::string label =
firstLabel_.length() ? testName + " " + firstLabel_ : testName;
LogPerfTiming(label, elapsed);
firstElapsed = elapsed;
} else {
if (verbose_)
NSLog(@"%2d: %.3f ms", i, elapsed.InMillisecondsF());
totalElapsed += elapsed;
if (elapsed > maxElapsed)
maxElapsed = elapsed;
if (elapsed < minElapsed)
minElapsed = elapsed;
}
if (postAction)
postAction();
}
if (repeat > 2) {
base::TimeDelta average =
(totalElapsed - maxElapsed - minElapsed) / (repeat - 2);
std::string label =
averageLabel_.length() ? testName + " " + averageLabel_ : testName;
LogPerfTiming(label, average);
}
}
// TODO(leng): Replace this with RepeatTimedRuns when we have figured out
// the best way to combine various logging requirements in repeated runs.
base::TimeDelta PerfTest::CalculateAverage(base::TimeDelta* times,
int count,
base::TimeDelta* min_time,
base::TimeDelta* max_time) {
DCHECK(times);
base::TimeDelta min = times[0];
base::TimeDelta max = times[0];
base::TimeDelta sum = times[0];
for (int i = 1; i < count; i++) {
sum += times[i];
if (times[i] > max)
max = times[i];
if (times[i] < min)
min = times[i];
}
if (max_time)
*max_time = max;
if (min_time)
*min_time = min;
return sum / count;
}