美文网首页
php 无侵入的性能分析:耗时、内存消耗、执行次数

php 无侵入的性能分析:耗时、内存消耗、执行次数

作者: 猿来是八阿哥 | 来源:发表于2021-08-08 22:30 被阅读0次
<?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 无侵入的性能分析:耗时、内存消耗、执行次数

  • Python性能优化Tips

    代码性能分析工具 pylint:不执行代码,静态分析。 profile:执行代码,统计各个函数的调用次数以及耗时。...

  • xhprof的配置及使用

    介绍 xhprof是一款facebook 开源的函数级别的非侵入式php性能分析工具。它报告函数级别的请求次数和各...

  • 如何分析一个排序算法?

    1.学习排序算法的思路?明确原理、掌握实现以及分析性能。2.如何分析排序算法性能?从执行效率、内存消耗以及稳定性3...

  • xhprof的使用

    简介 XHProf是一个分层PHP性能分析工具。XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数...

  • php 获取代码执行时间和消耗的内存

    做一些php性能测试的时候,要获取代码执行时间和消耗的内存,查了一下资料,发现php有自带的函数可以实现这个功能,...

  • android性能测试的要点分析

    Android的app性能测试包括的测试项比如: 1、资源消耗 2、内存泄露 3、电量功耗 4、耗时 5、网络流量...

  • 2021-04-24排序

    排序 分析排序算法的3大指标有哪些,对应适用场景? 执行效率时间复杂度比较和交换的次数内存消耗--空间复杂度原地排...

  • 从原理分析PHP性能

    从原理分析PHP的性能,主要从以下几个方面:内存管理、变量、函数、运行机制、网络模型来进行分析。 1.内存管理 类...

  • PHP 性能追踪及分析工具(XHPROF)

    什么是 XHPROF? XHPROF:Facebook 开源的轻量级PHP性能分析工具。 它报告函数级别的请求次数...

网友评论

      本文标题:php 无侵入的性能分析:耗时、内存消耗、执行次数

      本文链接:https://www.haomeiwen.com/subject/azkavltx.html