Browse Source

fixed profiling panel sorting.

tags/2.0.0-beta
Qiang Xue 11 years ago
parent
commit
35b5b2ef5d
  1. 4
      extensions/yii/debug/models/search/Profile.php
  2. 24
      extensions/yii/debug/panels/ProfilingPanel.php
  3. 12
      extensions/yii/debug/views/default/panels/profile/detail.php

4
extensions/yii/debug/models/search/Profile.php

@ -53,9 +53,9 @@ class Profile extends Base
'pageSize' => 10, 'pageSize' => 10,
], ],
'sort' => [ 'sort' => [
'attributes' => ['category', 'info', 'duration'], 'attributes' => ['category', 'seq', 'duration', 'info'],
'defaultOrder' => [ 'defaultOrder' => [
'duration' => SORT_DESC, 'seq' => SORT_ASC,
], ],
], ],
]); ]);

24
extensions/yii/debug/panels/ProfilingPanel.php

@ -61,7 +61,7 @@ class ProfilingPanel extends Panel
/** /**
* Calculates given request profile messages timings. * Calculates given request profile messages timings.
* @return array timings * @return array timings [token, category, timestamp, traces, nesting level, elapsed time]
*/ */
protected function calculateTimings() protected function calculateTimings()
{ {
@ -75,21 +75,19 @@ class ProfilingPanel extends Panel
foreach ($messages as $i => $log) { foreach ($messages as $i => $log) {
list($token, $level, $category, $timestamp, $traces) = $log; list($token, $level, $category, $timestamp, $traces) = $log;
$log[5] = $i;
if ($level == Logger::LEVEL_PROFILE_BEGIN) { if ($level == Logger::LEVEL_PROFILE_BEGIN) {
$stack[] = $log; $stack[] = $log;
} elseif ($level == Logger::LEVEL_PROFILE_END) { } elseif ($level == Logger::LEVEL_PROFILE_END) {
if (($last = array_pop($stack)) !== null && $last[0] === $token) { if (($last = array_pop($stack)) !== null && $last[0] === $token) {
$timings[] = [count($stack), $token, $category, $timestamp - $last[3], $traces]; $timings[$last[5]] = [$last[0], $last[2], $last[3], $last[4], count($stack), $timestamp - $last[3]];
} }
} }
} }
$now = microtime(true); ksort($timings);
while (($last = array_pop($stack)) !== null) {
$timings[] = [count($stack), $last[0], $last[2], $now - $last[3], $last[4]];
}
return $this->_timings = $timings; return $this->_timings = array_values($timings);
} }
public function save() public function save()
@ -113,12 +111,14 @@ class ProfilingPanel extends Panel
$this->_models = []; $this->_models = [];
$timings = $this->calculateTimings(); $timings = $this->calculateTimings();
foreach($timings as $profileTiming) { foreach($timings as $seq => $profileTiming) {
$this->_models[] = [ $this->_models[] = [
'duration' => $profileTiming[3] * 1000, #in milliseconds 'duration' => $profileTiming[5] * 1000, // in milliseconds
'category' => $profileTiming[2], 'category' => $profileTiming[1],
'info' => $profileTiming[1], 'info' => $profileTiming[0],
'level' => $profileTiming[0], 'level' => $profileTiming[4],
'timestamp' => $profileTiming[2],
'seq' => $seq,
]; ];
} }
} }

12
extensions/yii/debug/views/default/panels/profile/detail.php

@ -13,10 +13,22 @@ echo GridView::widget([
'columns' => [ 'columns' => [
['class' => 'yii\grid\SerialColumn'], ['class' => 'yii\grid\SerialColumn'],
[ [
'attribute' => 'seq',
'label' => 'Time',
'value' => function ($data) {
$timeInSeconds = $data['timestamp'] / 1000;
$millisecondsDiff = (int)(($timeInSeconds - (int)$timeInSeconds) * 1000);
return date('H:i:s.',$timeInSeconds) . sprintf('%03d',$millisecondsDiff);
},
],
[
'attribute' => 'duration', 'attribute' => 'duration',
'value' => function ($data) { 'value' => function ($data) {
return sprintf('%.1f ms',$data['duration']); return sprintf('%.1f ms',$data['duration']);
}, },
'options' => [
'width' => '10%',
],
], ],
'category', 'category',
[ [

Loading…
Cancel
Save