OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/metrics/field_trial.h" | 5 #include "base/metrics/field_trial.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/rand_util.h" | 8 #include "base/rand_util.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "base/utf_string_conversions.h" | |
11 | |
12 using base::Time; | |
13 using base::TimeDelta; | |
10 | 14 |
11 namespace base { | 15 namespace base { |
12 | 16 |
13 // static | 17 // static |
14 const int FieldTrial::kNotParticipating = -1; | 18 const int FieldTrial::kNotParticipating = -1; |
15 | 19 |
16 // static | 20 // static |
17 const int FieldTrial::kAllRemainingProbability = -2; | 21 const int FieldTrial::kAllRemainingProbability = -2; |
18 | 22 |
19 // static | 23 // static |
20 bool FieldTrial::enable_benchmarking_ = false; | 24 bool FieldTrial::enable_benchmarking_ = false; |
21 | 25 |
22 // static | 26 // static |
23 const char FieldTrialList::kPersistentStringSeparator('/'); | 27 const char FieldTrialList::kPersistentStringSeparator('/'); |
24 | 28 |
25 static const char kHistogramFieldTrialSeparator('_'); | 29 static const char kHistogramFieldTrialSeparator('_'); |
26 | 30 |
27 //------------------------------------------------------------------------------ | 31 //------------------------------------------------------------------------------ |
28 // FieldTrial methods and members. | 32 // FieldTrial methods and members. |
29 | 33 |
30 FieldTrial::FieldTrial(const std::string& name, | 34 FieldTrial::FieldTrial(const std::string& name, |
31 const Probability total_probability) | 35 const Probability total_probability) |
32 : name_(name), | 36 : name_(name), |
33 divisor_(total_probability), | 37 divisor_(total_probability), |
34 random_(static_cast<Probability>(divisor_ * base::RandDouble())), | 38 random_(static_cast<Probability>(divisor_ * base::RandDouble())), |
35 accumulated_group_probability_(0), | 39 accumulated_group_probability_(0), |
36 next_group_number_(0), | 40 next_group_number_(0), |
37 group_(kNotParticipating) { | 41 group_(kNotParticipating), |
42 duration_after_which_disable_field_trials_(base::TimeDelta::FromDays(30)), | |
43 disable_field_trails_(false) { | |
38 FieldTrialList::Register(this); | 44 FieldTrialList::Register(this); |
39 } | 45 } |
40 | 46 |
41 int FieldTrial::AppendGroup(const std::string& name, | 47 int FieldTrial::AppendGroup(const std::string& name, |
42 Probability group_probability) { | 48 Probability group_probability) { |
43 DCHECK(group_probability <= divisor_); | 49 DCHECK(group_probability <= divisor_); |
44 DCHECK(group_probability >=0 || | 50 DCHECK(group_probability >=0 || |
45 group_probability == kAllRemainingProbability); | 51 group_probability == kAllRemainingProbability); |
46 if (group_probability == kAllRemainingProbability) { | 52 if (group_probability == kAllRemainingProbability) { |
47 accumulated_group_probability_ = divisor_; | 53 accumulated_group_probability_ = divisor_; |
48 } else { | 54 } else { |
49 if (enable_benchmarking_) | 55 if (enable_benchmarking_ || |
56 (base::Time::NowFromSystemTime() - GetBuildTime() >= | |
57 duration_after_which_disable_field_trials_)) | |
50 group_probability = 0; | 58 group_probability = 0; |
59 | |
51 accumulated_group_probability_ += group_probability; | 60 accumulated_group_probability_ += group_probability; |
52 } | 61 } |
53 DCHECK(accumulated_group_probability_ <= divisor_); | 62 DCHECK(accumulated_group_probability_ <= divisor_); |
54 if (group_ == kNotParticipating && accumulated_group_probability_ > random_) { | 63 if (group_ == kNotParticipating && accumulated_group_probability_ > random_) { |
55 // This is the group that crossed the random line, so we do the assignment. | 64 // This is the group that crossed the random line, so we do the assignment. |
56 group_ = next_group_number_; | 65 group_ = next_group_number_; |
57 if (name.empty()) | 66 if (name.empty()) |
58 base::StringAppendF(&group_name_, "%d", group_); | 67 base::StringAppendF(&group_name_, "%d", group_); |
59 else | 68 else |
60 group_name_ = name; | 69 group_name_ = name; |
61 } | 70 } |
62 return next_group_number_++; | 71 return next_group_number_++; |
63 } | 72 } |
64 | 73 |
65 // static | 74 // static |
66 std::string FieldTrial::MakeName(const std::string& name_prefix, | 75 std::string FieldTrial::MakeName(const std::string& name_prefix, |
67 const std::string& trial_name) { | 76 const std::string& trial_name) { |
68 std::string big_string(name_prefix); | 77 std::string big_string(name_prefix); |
69 big_string.append(1, kHistogramFieldTrialSeparator); | 78 big_string.append(1, kHistogramFieldTrialSeparator); |
70 return big_string.append(FieldTrialList::FindFullName(trial_name)); | 79 return big_string.append(FieldTrialList::FindFullName(trial_name)); |
71 } | 80 } |
72 | 81 |
73 // static | 82 // static |
74 void FieldTrial::EnableBenchmarking() { | 83 void FieldTrial::EnableBenchmarking() { |
75 DCHECK_EQ(0u, FieldTrialList::GetFieldTrialCount()); | 84 DCHECK_EQ(0u, FieldTrialList::GetFieldTrialCount()); |
76 enable_benchmarking_ = true; | 85 enable_benchmarking_ = true; |
77 } | 86 } |
78 | 87 |
88 // static | |
89 Time FieldTrial::GetBuildTime() { | |
90 static Time integral_build_time; | |
91 if (integral_build_time.is_null()) { | |
92 const char* kDateTime = __DATE__ " " __TIME__ " GMT"; | |
jar (doing other things)
2011/01/09 07:00:04
caveat: This is OK.... but we should be sure our t
rtenneti
2011/01/09 23:16:42
Done.
| |
93 bool result = Time::FromString(ASCIIToWide(kDateTime).c_str(), | |
94 &integral_build_time); | |
95 DCHECK(result); | |
96 } | |
97 return integral_build_time; | |
98 } | |
99 | |
79 FieldTrial::~FieldTrial() {} | 100 FieldTrial::~FieldTrial() {} |
80 | 101 |
81 //------------------------------------------------------------------------------ | 102 //------------------------------------------------------------------------------ |
82 // FieldTrialList methods and members. | 103 // FieldTrialList methods and members. |
83 | 104 |
84 // static | 105 // static |
85 FieldTrialList* FieldTrialList::global_ = NULL; | 106 FieldTrialList* FieldTrialList::global_ = NULL; |
86 | 107 |
87 // static | 108 // static |
88 bool FieldTrialList::register_without_global_ = false; | 109 bool FieldTrialList::register_without_global_ = false; |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
204 | 225 |
205 // static | 226 // static |
206 size_t FieldTrialList::GetFieldTrialCount() { | 227 size_t FieldTrialList::GetFieldTrialCount() { |
207 if (!global_) | 228 if (!global_) |
208 return 0; | 229 return 0; |
209 AutoLock auto_lock(global_->lock_); | 230 AutoLock auto_lock(global_->lock_); |
210 return global_->registered_.size(); | 231 return global_->registered_.size(); |
211 } | 232 } |
212 | 233 |
213 } // namespace base | 234 } // namespace base |
OLD | NEW |