<?php
/**
* Class Tracker
* {"file":"tick.php","line":66,"type":"memory","diff":"32MB"}
* {"file":"tick.php","line":70,"type":"time","diff":"1s"}
* {"file":"tick.php","line":76,"type":"execution","times":10000}
*/
class Tracker{
protected $executionLimit;
protected $memoryLimit;
protected $timeLimit;
protected $timeStart;
protected $memoryStart;
protected $executionMap;
protected $badSmells = [];
public function __construct($executionLimit=100, $memoryLimit=1024*1024, $timeLimit=100){
$this->executionLimit = intval($executionLimit);
$this->memoryLimit = intval($memoryLimit);
$this->timeLimit = intval($timeLimit);
$this->memoryStart = memory_get_usage();
}
public function startTrack(){
declare (ticks = 1);
return ($this->timeLimit > 0 || $this->memoryLimit > 0 || $this->executionLimit > 0)
&& register_tick_function([$this, 'tickHook']);
}
public function terminalTrack(){
if(!empty($this->badSmells)){
foreach ($this->badSmells as $bs) {
echo json_encode($bs).PHP_EOL;
}
}
}
public function tickHook(){
$trace = debug_backtrace(1);
$key = $trace[0]['file'].'_'.$trace[0]['line'];
if($this->timeLimit > 0){
$nowTime = microtime(1) * 1000;
if($this->timeStart < 1){
$this->timeStart = $nowTime;
}else{
$timeDiff = $nowTime - $this->timeStart;
if($timeDiff >= $this->timeLimit){
$this->badSmells[$key.'_time'] = ['file'=>$trace[0]['file'], 'line'=>$trace[0]['line'], 'type'=>'time', 'diff'=>round($timeDiff/1000, 1).'s'];
$this->timeStart = 0;
}
}
}
if($this->memoryLimit > 0){
$nowMemory = memory_get_usage();
$memoryDiff = $nowMemory - $this->memoryStart;
if($memoryDiff >= $this->memoryLimit){
$this->badSmells[$key.'_memory'] = ['file'=>$trace[0]['file'], 'line'=>$trace[0]['line'], 'type'=>'memory', 'diff'=>round($memoryDiff/1024/1024, 1).'MB'];
}
$this->memoryStart = $nowMemory;
}
if($this->executionLimit > 0){
$this->executionMap[$key]++;
if($this->executionMap[$key] >= $this->executionLimit){
$this->badSmells[$key.'_execution'] = ['file'=>$trace[0]['file'], 'line'=>$trace[0]['line'], 'type'=>'execution', 'times'=>$this->executionMap[$key]];
}
}
}
}
function f1_memory($n){
$data = array_fill(0, $n, 0);
}
function f2_time(){
sleep(1);
}
function f3_execute(){
$sum = 0;
for($i=0; $i<10000; $i++){
$sum += $i;
}
return $sum;
}
$tracker = new Tracker();
$tracker->startTrack();
f1_memory(1000000);
f2_time();
f3_execute();
$tracker->terminalTrack();
php 無侵入的性能分析:耗時颠放、內(nèi)存消耗饼酿、執(zhí)行次數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門上岗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕴坪,你說我怎么就攤上這事肴掷。” “怎么了背传?”我有些...
- 文/不壞的土叔 我叫張陵呆瞻,是天一觀的道長。 經(jīng)常有香客問我径玖,道長痴脾,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任梳星,我火速辦了婚禮赞赖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘冤灾。我一直安慰自己前域,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布瞳购。 她就那樣靜靜地躺著话侄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪学赛。 梳的紋絲不亂的頭發(fā)上年堆,一...
- 文/蒼蘭香墨 我猛地睜開眼滴劲,長吁一口氣:“原來是場噩夢啊……” “哼攻晒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起班挖,我...
- 正文 年R本政府宣布几莽,位于F島的核電站,受9級特大地震影響宅静,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站欺,卻給世界環(huán)境...
- 文/蒙蒙 一姨夹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矾策,春花似錦磷账、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蓬豁,卻和暖如春绰咽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背地粪。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 先上結(jié)果 數(shù)組元素個數(shù)1000時:image.png 數(shù)組元素個數(shù)10000時:image.png 兩次測試結(jié)果總...
- 做一些php性能測試的時候妻坝,要獲取代碼執(zhí)行時間和消耗的內(nèi)存伸眶,查了一下資料惊窖,發(fā)現(xiàn)php有自帶的函數(shù)可以實現(xiàn)這個功能,...
- 但實際上 SQL 執(zhí)行起來可能還是很慢,那么到底從哪里定位 SQL 查詢慢的問題呢嘴秸?是索引設(shè)計的問題毁欣?服務(wù)器參數(shù)配...
- 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險岳掐,但是人生放棄了冒險凭疮,也就放棄了無數(shù)的可能。 ...
- 公元:2019年11月28日19時42分農(nóng)歷:二零一九年 十一月 初三日 戌時干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...