Commit c25db185 authored by jar@chromium.org's avatar jar@chromium.org

Switch to using an intergral type for durations inside profiler

Transition from internal used of "class Duration" (which is
kindred of base::TimeDelta) to using an integral type.
This is in preparation for handling durations that are
not time based, such as memmory allocation units.

r=rtenneti
BUG=103321
Review URL: http://codereview.chromium.org/8502001

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@109720 0039d316-1c4b-4281-b951-d872f2087c98
parent 673728d9
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
namespace tracked_objects { namespace tracked_objects {
typedef int DurationInt;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#define USE_FAST_TIME_CLASS_FOR_DURATION_CALCULATIONS #define USE_FAST_TIME_CLASS_FOR_DURATION_CALCULATIONS
......
...@@ -33,18 +33,18 @@ static const ThreadData::Status kInitialStartupState = ThreadData::ACTIVE; ...@@ -33,18 +33,18 @@ static const ThreadData::Status kInitialStartupState = ThreadData::ACTIVE;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// DeathData tallies durations when a death takes place. // DeathData tallies durations when a death takes place.
void DeathData::RecordDeath(const Duration& queue_duration, void DeathData::RecordDeath(DurationInt queue_duration,
const Duration& run_duration) { DurationInt run_duration) {
++count_; ++count_;
queue_time_.AddDuration(queue_duration); queue_time_.AddDuration(queue_duration);
run_time_.AddDuration(run_duration); run_time_.AddDuration(run_duration);
} }
int DeathData::AverageMsRunDuration() const { DurationInt DeathData::AverageMsRunDuration() const {
return run_time_.AverageMsDuration(count_); return run_time_.AverageMsDuration(count_);
} }
int DeathData::AverageMsQueueDuration() const { DurationInt DeathData::AverageMsQueueDuration() const {
return queue_time_.AverageMsDuration(count_); return queue_time_.AverageMsDuration(count_);
} }
...@@ -70,13 +70,13 @@ base::DictionaryValue* DeathData::ToValue() const { ...@@ -70,13 +70,13 @@ base::DictionaryValue* DeathData::ToValue() const {
base::DictionaryValue* dictionary = new base::DictionaryValue; base::DictionaryValue* dictionary = new base::DictionaryValue;
dictionary->Set("count", base::Value::CreateIntegerValue(count_)); dictionary->Set("count", base::Value::CreateIntegerValue(count_));
dictionary->Set("run_ms", dictionary->Set("run_ms",
base::Value::CreateIntegerValue(run_time_.duration().InMilliseconds())); base::Value::CreateIntegerValue(run_time_.duration()));
dictionary->Set("queue_ms", dictionary->Set("queue_ms",
base::Value::CreateIntegerValue(queue_time_.duration().InMilliseconds())); base::Value::CreateIntegerValue(queue_time_.duration()));
dictionary->Set("run_ms_max", dictionary->Set("run_ms_max",
base::Value::CreateIntegerValue(run_time_.max().InMilliseconds())); base::Value::CreateIntegerValue(run_time_.max()));
dictionary->Set("queue_ms_max", dictionary->Set("queue_ms_max",
base::Value::CreateIntegerValue(queue_time_.max().InMilliseconds())); base::Value::CreateIntegerValue(queue_time_.max()));
return dictionary; return dictionary;
} }
...@@ -93,14 +93,14 @@ void DeathData::Data::WriteHTML(int count, std::string* output) const { ...@@ -93,14 +93,14 @@ void DeathData::Data::WriteHTML(int count, std::string* output) const {
// InMilliseconds() may not always be an int, even if it can generally fit // InMilliseconds() may not always be an int, even if it can generally fit
// into an int. // into an int.
base::StringAppendF(output, "%dms", base::StringAppendF(output, "%dms",
static_cast<int>(duration_.InMilliseconds())); static_cast<int>(duration_));
if (count == 1) { if (count == 1) {
output->append(" "); output->append(" ");
return; return;
} }
base::StringAppendF(output, "(%dms/life,max:%dms) ", base::StringAppendF(output, "(%dms/life,max:%dms) ",
AverageMsDuration(count), static_cast<int>(AverageMsDuration(count)),
static_cast<int>(max_.InMilliseconds())); static_cast<int>(max_));
} }
void DeathData::Data::AddData(const Data& other) { void DeathData::Data::AddData(const Data& other) {
...@@ -110,22 +110,22 @@ void DeathData::Data::AddData(const Data& other) { ...@@ -110,22 +110,22 @@ void DeathData::Data::AddData(const Data& other) {
max_ = other.max_; max_ = other.max_;
} }
void DeathData::Data::AddDuration(const Duration& duration) { void DeathData::Data::AddDuration(DurationInt duration) {
duration_ += duration; duration_ += duration;
if (max_ > duration) if (max_ > duration)
return; return;
max_ = duration; max_ = duration;
} }
int DeathData::Data::AverageMsDuration(int count) const { DurationInt DeathData::Data::AverageMsDuration(int count) const {
if (duration_ == Duration() || !count) if (duration_ == 0 || !count)
return 0; return 0;
return static_cast<int>(duration_.InMilliseconds() + count / 2) / count; return (duration_ + count / 2) / count;
} }
void DeathData::Data::Clear() { void DeathData::Data::Clear() {
duration_ = Duration(); duration_ = 0;
max_ = Duration(); max_ = 0;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BirthOnThread::BirthOnThread(const Location& location, BirthOnThread::BirthOnThread(const Location& location,
...@@ -401,8 +401,8 @@ Births* ThreadData::TallyABirth(const Location& location) { ...@@ -401,8 +401,8 @@ Births* ThreadData::TallyABirth(const Location& location) {
} }
void ThreadData::TallyADeath(const Births& birth, void ThreadData::TallyADeath(const Births& birth,
const Duration& queue_duration, DurationInt queue_duration,
const Duration& run_duration) { DurationInt run_duration) {
DeathMap::iterator it = death_map_.find(&birth); DeathMap::iterator it = death_map_.find(&birth);
DeathData* death_data; DeathData* death_data;
if (it != death_map_.end()) { if (it != death_map_.end()) {
...@@ -460,12 +460,12 @@ void ThreadData::TallyRunOnNamedThreadIfTracking( ...@@ -460,12 +460,12 @@ void ThreadData::TallyRunOnNamedThreadIfTracking(
// get a time value since we "weren't tracking" and we were trying to be // get a time value since we "weren't tracking" and we were trying to be
// efficient by not calling for a genuine time value. For simplicity, we'll // efficient by not calling for a genuine time value. For simplicity, we'll
// use a default zero duration when we can't calculate a true value. // use a default zero duration when we can't calculate a true value.
Duration queue_duration; DurationInt queue_duration = 0;
Duration run_duration; DurationInt run_duration = 0;
if (!start_of_run.is_null()) { if (!start_of_run.is_null()) {
queue_duration = start_of_run - effective_post_time; queue_duration = (start_of_run - effective_post_time).InMilliseconds();
if (!end_of_run.is_null()) if (!end_of_run.is_null())
run_duration = end_of_run - start_of_run; run_duration = (end_of_run - start_of_run).InMilliseconds();
} }
current_thread_data->TallyADeath(*birth, queue_duration, run_duration); current_thread_data->TallyADeath(*birth, queue_duration, run_duration);
} }
...@@ -498,12 +498,12 @@ void ThreadData::TallyRunOnWorkerThreadIfTracking( ...@@ -498,12 +498,12 @@ void ThreadData::TallyRunOnWorkerThreadIfTracking(
if (!current_thread_data) if (!current_thread_data)
return; return;
Duration queue_duration; DurationInt queue_duration = 0;
Duration run_duration; DurationInt run_duration = 0;
if (!start_of_run.is_null()) { if (!start_of_run.is_null()) {
queue_duration = start_of_run - time_posted; queue_duration = (start_of_run - time_posted).InMilliseconds();
if (!end_of_run.is_null()) if (!end_of_run.is_null())
run_duration = end_of_run - start_of_run; run_duration = (end_of_run - start_of_run).InMilliseconds();
} }
current_thread_data->TallyADeath(*birth, queue_duration, run_duration); current_thread_data->TallyADeath(*birth, queue_duration, run_duration);
} }
...@@ -526,8 +526,8 @@ void ThreadData::TallyRunInAScopedRegionIfTracking( ...@@ -526,8 +526,8 @@ void ThreadData::TallyRunInAScopedRegionIfTracking(
if (!current_thread_data) if (!current_thread_data)
return; return;
Duration queue_duration = Duration(); DurationInt queue_duration = 0;
Duration run_duration = end_of_run - start_of_run; DurationInt run_duration = (end_of_run - start_of_run).InMilliseconds();
current_thread_data->TallyADeath(*birth, queue_duration, run_duration); current_thread_data->TallyADeath(*birth, queue_duration, run_duration);
} }
......
...@@ -232,21 +232,22 @@ class BASE_EXPORT DeathData { ...@@ -232,21 +232,22 @@ class BASE_EXPORT DeathData {
// When deaths have not yet taken place, and we gather data from all the // When deaths have not yet taken place, and we gather data from all the
// threads, we create DeathData stats that tally the number of births without // threads, we create DeathData stats that tally the number of births without
// a corrosponding death. // a corrosponding death.
explicit DeathData(int count) : count_(count) {} explicit DeathData(int count)
: count_(count) {}
// Update stats for a task destruction (death) that had a Run() time of // Update stats for a task destruction (death) that had a Run() time of
// |duration|, and has had a queueing delay of |queue_duration|. // |duration|, and has had a queueing delay of |queue_duration|.
void RecordDeath(const Duration& queue_duration, void RecordDeath(DurationInt queue_duration,
const Duration& run_duration); DurationInt run_duration);
// Metrics accessors. // Metrics accessors.
int count() const { return count_; } int count() const { return count_; }
Duration run_duration() const { return run_time_.duration(); } DurationInt run_duration() const { return run_time_.duration(); }
int AverageMsRunDuration() const; DurationInt AverageMsRunDuration() const;
Duration run_duration_max() const { return run_time_.max(); } DurationInt run_duration_max() const { return run_time_.max(); }
Duration queue_duration() const { return queue_time_.duration(); } DurationInt queue_duration() const { return queue_time_.duration(); }
int AverageMsQueueDuration() const; DurationInt AverageMsQueueDuration() const;
Duration queue_duration_max() const { return queue_time_.max(); } DurationInt queue_duration_max() const { return queue_time_.max(); }
// Accumulate metrics from other into this. This method is never used on // Accumulate metrics from other into this. This method is never used on
// realtime statistics, and only used in snapshots and aggregatinos. // realtime statistics, and only used in snapshots and aggregatinos.
...@@ -267,11 +268,11 @@ class BASE_EXPORT DeathData { ...@@ -267,11 +268,11 @@ class BASE_EXPORT DeathData {
// aggregated, such as queueing times, or run times. // aggregated, such as queueing times, or run times.
class Data { class Data {
public: public:
Data() {} Data() : duration_(0), max_(0) {}
~Data() {} ~Data() {}
Duration duration() const { return duration_; } DurationInt duration() const { return duration_; }
Duration max() const { return max_; } DurationInt max() const { return max_; }
// Emits HTML formated description of members, assuming |count| instances // Emits HTML formated description of members, assuming |count| instances
// when calculating averages. // when calculating averages.
...@@ -279,18 +280,18 @@ class BASE_EXPORT DeathData { ...@@ -279,18 +280,18 @@ class BASE_EXPORT DeathData {
// Agggegate data into our state. // Agggegate data into our state.
void AddData(const Data& other); void AddData(const Data& other);
void AddDuration(const Duration& duration); void AddDuration(DurationInt duration);
// Central helper function for calculating averages (correctly, in only one // Central helper function for calculating averages (correctly, in only one
// place). // place).
int AverageMsDuration(int count) const; DurationInt AverageMsDuration(int count) const;
// Resets all members to zero. // Resets all members to zero.
void Clear(); void Clear();
private: private:
Duration duration_; // Sum of all durations seen. DurationInt duration_; // Sum of all durations seen.
Duration max_; // Largest singular duration seen. DurationInt max_; // Largest singular duration seen.
}; };
...@@ -323,18 +324,18 @@ class BASE_EXPORT Snapshot { ...@@ -323,18 +324,18 @@ class BASE_EXPORT Snapshot {
const std::string DeathThreadName() const; const std::string DeathThreadName() const;
int count() const { return death_data_.count(); } int count() const { return death_data_.count(); }
Duration run_duration() const { return death_data_.run_duration(); } DurationInt run_duration() const { return death_data_.run_duration(); }
int AverageMsRunDuration() const { DurationInt AverageMsRunDuration() const {
return death_data_.AverageMsRunDuration(); return death_data_.AverageMsRunDuration();
} }
Duration run_duration_max() const { DurationInt run_duration_max() const {
return death_data_.run_duration_max(); return death_data_.run_duration_max();
} }
Duration queue_duration() const { return death_data_.queue_duration(); } DurationInt queue_duration() const { return death_data_.queue_duration(); }
int AverageMsQueueDuration() const { DurationInt AverageMsQueueDuration() const {
return death_data_.AverageMsQueueDuration(); return death_data_.AverageMsQueueDuration();
} }
Duration queue_duration_max() const { DurationInt queue_duration_max() const {
return death_data_.queue_duration_max(); return death_data_.queue_duration_max();
} }
...@@ -692,8 +693,8 @@ class BASE_EXPORT ThreadData { ...@@ -692,8 +693,8 @@ class BASE_EXPORT ThreadData {
// Find a place to record a death on this thread. // Find a place to record a death on this thread.
void TallyADeath(const Births& birth, void TallyADeath(const Births& birth,
const Duration& queue_duration, DurationInt queue_duration,
const Duration& duration); DurationInt duration);
// Using our lock to protect the iteration, Clear all birth and death data. // Using our lock to protect the iteration, Clear all birth and death data.
void Reset(); void Reset();
......
...@@ -118,27 +118,25 @@ TEST_F(TrackedObjectsTest, DeathDataTest) { ...@@ -118,27 +118,25 @@ TEST_F(TrackedObjectsTest, DeathDataTest) {
scoped_ptr<DeathData> data(new DeathData()); scoped_ptr<DeathData> data(new DeathData());
ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL)); ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL));
EXPECT_EQ(data->run_duration(), Duration()); EXPECT_EQ(data->run_duration(), 0);
EXPECT_EQ(data->queue_duration(), Duration()); EXPECT_EQ(data->queue_duration(), 0);
EXPECT_EQ(data->AverageMsRunDuration(), 0); EXPECT_EQ(data->AverageMsRunDuration(), 0);
EXPECT_EQ(data->AverageMsQueueDuration(), 0); EXPECT_EQ(data->AverageMsQueueDuration(), 0);
EXPECT_EQ(data->count(), 0); EXPECT_EQ(data->count(), 0);
int run_ms = 42; DurationInt run_ms = 42;
int queue_ms = 8; DurationInt queue_ms = 8;
Duration run_duration = Duration().FromMilliseconds(run_ms); data->RecordDeath(queue_ms, run_ms);
Duration queue_duration = Duration().FromMilliseconds(queue_ms); EXPECT_EQ(data->run_duration(), run_ms);
data->RecordDeath(queue_duration, run_duration); EXPECT_EQ(data->queue_duration(), queue_ms);
EXPECT_EQ(data->run_duration(), run_duration);
EXPECT_EQ(data->queue_duration(), queue_duration);
EXPECT_EQ(data->AverageMsRunDuration(), run_ms); EXPECT_EQ(data->AverageMsRunDuration(), run_ms);
EXPECT_EQ(data->AverageMsQueueDuration(), queue_ms); EXPECT_EQ(data->AverageMsQueueDuration(), queue_ms);
EXPECT_EQ(data->count(), 1); EXPECT_EQ(data->count(), 1);
data->RecordDeath(queue_duration, run_duration); data->RecordDeath(queue_ms, run_ms);
EXPECT_EQ(data->run_duration(), run_duration + run_duration); EXPECT_EQ(data->run_duration(), run_ms + run_ms);
EXPECT_EQ(data->queue_duration(), queue_duration + queue_duration); EXPECT_EQ(data->queue_duration(), queue_ms + queue_ms);
EXPECT_EQ(data->AverageMsRunDuration(), run_ms); EXPECT_EQ(data->AverageMsRunDuration(), run_ms);
EXPECT_EQ(data->AverageMsQueueDuration(), queue_ms); EXPECT_EQ(data->AverageMsQueueDuration(), queue_ms);
EXPECT_EQ(data->count(), 2); EXPECT_EQ(data->count(), 2);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment