| <?php | |
| /* | |
| * | |
| * Copyright 2017 gRPC authors. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| * | |
| */ | |
| // Histogram class for use in performance testing and measurement | |
| class Histogram { | |
| private $resolution; | |
| private $max_possible; | |
| private $sum; | |
| private $sum_of_squares; | |
| private $multiplier; | |
| private $count; | |
| private $min_seen; | |
| private $max_seen; | |
| private $buckets; | |
| private function bucket_for($value) { | |
| return (int)(log($value) / log($this->multiplier)); | |
| } | |
| public function __construct($resolution, $max_possible) { | |
| $this->resolution = $resolution; | |
| $this->max_possible = $max_possible; | |
| $this->sum = 0; | |
| $this->sum_of_squares = 0; | |
| $this->multiplier = 1+$resolution; | |
| $this->count = 0; | |
| $this->min_seen = $max_possible; | |
| $this->max_seen = 0; | |
| $this->buckets = array_fill(0, $this->bucket_for($max_possible)+1, 0); | |
| } | |
| public function add($value) { | |
| $this->sum += $value; | |
| $this->sum_of_squares += $value * $value; | |
| $this->count += 1; | |
| if ($value < $this->min_seen) { | |
| $this->min_seen = $value; | |
| } | |
| if ($value > $this->max_seen) { | |
| $this->max_seen = $value; | |
| } | |
| $this->buckets[$this->bucket_for($value)] += 1; | |
| } | |
| public function minimum() { | |
| return $this->min_seen; | |
| } | |
| public function maximum() { | |
| return $this->max_seen; | |
| } | |
| public function sum() { | |
| return $this->sum; | |
| } | |
| public function sum_of_squares() { | |
| return $this->sum_of_squares; | |
| } | |
| public function count() { | |
| return $this->count; | |
| } | |
| public function contents() { | |
| return $this->buckets; | |
| } | |
| public function clean() { | |
| $this->sum = 0; | |
| $this->sum_of_squares = 0; | |
| $this->count = 0; | |
| $this->min_seen = $this->max_possible; | |
| $this->max_seen = 0; | |
| $this->buckets = array_fill(0, $this->bucket_for($this->max_possible)+1, 0); | |
| } | |
| } |