mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-22 19:31:02 +08:00
fixed profiling panel sorting.
This commit is contained in:
@ -53,9 +53,9 @@ class Profile extends Base
|
||||
'pageSize' => 10,
|
||||
],
|
||||
'sort' => [
|
||||
'attributes' => ['category', 'info', 'duration'],
|
||||
'attributes' => ['category', 'seq', 'duration', 'info'],
|
||||
'defaultOrder' => [
|
||||
'duration' => SORT_DESC,
|
||||
'seq' => SORT_ASC,
|
||||
],
|
||||
],
|
||||
]);
|
||||
|
@ -61,7 +61,7 @@ class ProfilingPanel extends Panel
|
||||
|
||||
/**
|
||||
* Calculates given request profile messages timings.
|
||||
* @return array timings
|
||||
* @return array timings [token, category, timestamp, traces, nesting level, elapsed time]
|
||||
*/
|
||||
protected function calculateTimings()
|
||||
{
|
||||
@ -75,21 +75,19 @@ class ProfilingPanel extends Panel
|
||||
|
||||
foreach ($messages as $i => $log) {
|
||||
list($token, $level, $category, $timestamp, $traces) = $log;
|
||||
$log[5] = $i;
|
||||
if ($level == Logger::LEVEL_PROFILE_BEGIN) {
|
||||
$stack[] = $log;
|
||||
} elseif ($level == Logger::LEVEL_PROFILE_END) {
|
||||
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);
|
||||
while (($last = array_pop($stack)) !== null) {
|
||||
$timings[] = [count($stack), $last[0], $last[2], $now - $last[3], $last[4]];
|
||||
}
|
||||
ksort($timings);
|
||||
|
||||
return $this->_timings = $timings;
|
||||
return $this->_timings = array_values($timings);
|
||||
}
|
||||
|
||||
public function save()
|
||||
@ -113,12 +111,14 @@ class ProfilingPanel extends Panel
|
||||
$this->_models = [];
|
||||
$timings = $this->calculateTimings();
|
||||
|
||||
foreach($timings as $profileTiming) {
|
||||
foreach($timings as $seq => $profileTiming) {
|
||||
$this->_models[] = [
|
||||
'duration' => $profileTiming[3] * 1000, #in milliseconds
|
||||
'category' => $profileTiming[2],
|
||||
'info' => $profileTiming[1],
|
||||
'level' => $profileTiming[0],
|
||||
'duration' => $profileTiming[5] * 1000, // in milliseconds
|
||||
'category' => $profileTiming[1],
|
||||
'info' => $profileTiming[0],
|
||||
'level' => $profileTiming[4],
|
||||
'timestamp' => $profileTiming[2],
|
||||
'seq' => $seq,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -12,11 +12,23 @@ echo GridView::widget([
|
||||
'filterUrl' => $panel->getUrl(),
|
||||
'columns' => [
|
||||
['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',
|
||||
'value' => function ($data) {
|
||||
return sprintf('%.1f ms',$data['duration']);
|
||||
},
|
||||
'options' => [
|
||||
'width' => '10%',
|
||||
],
|
||||
],
|
||||
'category',
|
||||
[
|
||||
|
Reference in New Issue
Block a user