| 168 | } |
| 169 | |
| 170 | std::string Histogram::ToString() const { |
| 171 | std::string r; |
| 172 | char buf[200]; |
| 173 | snprintf(buf, sizeof(buf), "Count: %.0f Average: %.4f StdDev: %.2f\n", num_, |
| 174 | Average(), StandardDeviation()); |
| 175 | r.append(buf); |
| 176 | snprintf(buf, sizeof(buf), "Min: %.4f Median: %.4f Max: %.4f\n", |
| 177 | (num_ == 0.0 ? 0.0 : min_), Median(), max_); |
| 178 | r.append(buf); |
| 179 | r.append("------------------------------------------------------\n"); |
| 180 | const double mult = num_ > 0 ? 100.0 / num_ : 0.0; |
| 181 | double sum = 0; |
| 182 | for (size_t b = 0; b < buckets_.size(); b++) { |
| 183 | if (buckets_[b] <= 0.0) continue; |
| 184 | sum += buckets_[b]; |
| 185 | snprintf(buf, sizeof(buf), "[ %10.2g, %10.2g ) %7.0f %7.3f%% %7.3f%% ", |
| 186 | ((b == 0) ? -DBL_MAX : bucket_limits_[b - 1]), // left |
| 187 | bucket_limits_[b], // right |
| 188 | buckets_[b], // count |
| 189 | mult * buckets_[b], // percentage |
| 190 | mult * sum); // cum percentage |
| 191 | r.append(buf); |
| 192 | |
| 193 | // Add hash marks based on percentage; 20 marks for 100%. |
| 194 | int marks = static_cast<int>(20 * (buckets_[b] / num_) + 0.5); |
| 195 | r.append(marks, '#'); |
| 196 | r.push_back('\n'); |
| 197 | } |
| 198 | return r; |
| 199 | } |
| 200 | |
| 201 | void Histogram::EncodeToProto(HistogramProto* proto, |
| 202 | bool preserve_zero_buckets) const { |