XHProfAggregator.php in XHProf 6
File
XHProfLib/XHProfAggregator.php
View source
<?php
class XHProfAggregator {
public $runs = array();
public function addRun($run_data) {
$this->runs[] = $run_data;
}
public function average() {
$keys = array();
foreach ($this->runs as $data) {
$keys = $keys + array_keys($data);
}
$agg_run = array();
$run_count = count($runs);
foreach ($keys as $key) {
$agg_key = array();
foreach ($runs as $data) {
if (isset($data[$key])) {
foreach ($data[$key] as $metric => $val) {
$agg_key[$metric][] = $val;
}
}
}
$agg_run[$key] = array();
foreach ($agg_key as $metric => $vals) {
$sd = self::sd($vals);
$mean = array_sum($vals) / count($vals);
$good_vals = array();
if ($sd == 0) {
$agg_run[$key][$metric] = array_sum($vals) / count($vals);
}
else {
foreach ($vals as $v) {
$diff = abs($mean - $v);
if (abs($mean - $v) < $sd * 2) {
$good_vals[] = $v;
}
}
$agg_run[$key][$metric] = array_sum($good_vals) / count($good_vals);
}
}
}
return $agg_run;
}
public function sum() {
$keys = array();
foreach ($this->runs as $data) {
$keys = $keys + array_keys($data);
}
$agg_run = array();
foreach ($keys as $key) {
$agg_key = array();
foreach ($this->runs as $data) {
if (isset($data[$key])) {
foreach ($data[$key] as $metric => $val) {
$agg_key[$metric][] = $val;
}
}
}
$agg_run[$key] = array();
foreach ($agg_key as $metric => $vals) {
$agg_run[$key][$metric] = array_sum($vals);
}
}
return $agg_run;
}
public static function sd_square($x, $mean) {
return pow($x - $mean, 2);
}
public static function sd($array) {
return sqrt(array_sum(array_map(array(
'XHProfTools',
'sd_square',
), $array, array_fill(0, count($array), array_sum($array) / count($array)))) / (count($array) - 1));
}
}