• ECharts分析xdebug跟踪日志


    2015年12月23日 15:36:11 星期三

    之前用的是国外的图表工具, 有点麻烦, 文档是英文的, 看着不顺眼,

    发现了百度出品的ECharts, 文档比较全, 功能比较多, 做出的图也比较好看, 用起来也比较简单

    先解释一下:

    两个点之间上下距离相距比较大的说明这两个点之间耗费的内存比较大

    两个点之间左右距离相距比较大的说明两点之间耗时比较多

    单文件:

      1 <!DOCTYPE html>
      2 <head>
      3     <meta charset="utf-8">
      4     <title>ECharts</title>
      5 </head>
      6 <body>
      7 <?php
      8 function makeData($file)
      9 {
     10     $fp = fopen($file, 'r');
     11     $arrLineData = [];
     12     $arrDetailData = [];
     13     
     14     while(!feof($fp)){
     15         $row = fgets($fp);
     16         $row = trim($row);
     17         $arr_now = preg_split('#s+#', $row);
     18         
     19         
     20         if (count($arr_now) == 5) {
     21             // echo '<pre>';print_r($arr_now); exit();
     22             $x = $arr_now[0]*10000; //时间消耗, 变成整数, 单位ms*10
     23             $y = $arr_now[1]; //内存消耗, 缩小数量级, 单位KB
     24             $arrLineData[] = [$x, $y];
     25             
     26             $tmp = [];
     27             $tmp['time_used']     = $arr_now[0];
     28             $tmp['memory_used'] = $arr_now[1];
     29             $tmp['memory_add']     = 0;
     30             $tmp['function']     = $arr_now[3];
     31             $tmp['location']     = $arr_now[4];
     32             $key = $x.'_'.$arr_now[1];
     33             $arrDetailData[$key] = $tmp;
     34         }
     35     }
     36     
     37     return [$arrLineData, $arrDetailData];
     38 }
     39 
     40 //读取xdebug trace 数据文件
     41 $cpuData = makeData('./aaa.xt');
     42 
     43 ?>
     44     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
     45     <div id="main" style="height:800px;weight:80%"></div>
     46     <!-- ECharts单文件引入 -->
     47     <script src="./echarts.min.js"></script>
     48     <script type="text/javascript">
     49     var cpuData = <?= json_encode($cpuData)?>;
     50     var line1Name = '跟踪';
     51     
     52     // 基于准备好的dom,初始化echarts图表
     53     var myChart = echarts.init(document.getElementById('main')); 
     54     
     55     option = {
     56     title : {
     57         text: 'PHP效率分析',
     58         //subtext: '纯属虚构'
     59     },
     60     tooltip : {
     61         trigger: 'axis',
     62         axisPointer:{
     63             show: true,
     64             type : 'cross',
     65             lineStyle: {
     66                 type : 'dashed',
     67                 width : 1
     68             }
     69         },
     70         formatter : function (params) {
     71             var x = params[0].value[0];
     72             var y = params[0].value[1];
     73             
     74             var key = x+'_'+y;
     75             var obj = cpuData[1][key];
     76             
     77             str = '';
     78             str += '时间消耗: '+obj.time_used+"s<br>";
     79             str += '内存消耗: '+obj.memory_used/1024+"KB<br>";
     80             // str += '内存增量: '+obj.memory_add+"B<br>";
     81             str += '函数调用: '+obj.function+"<br>";
     82             str += '所在行: '+obj.location;
     83             return str;
     84             
     85         }
     86     },
     87     dataZoom: {
     88         show: true,
     89         start : 0
     90     },
     91     legend: {
     92         data:[line1Name]
     93     },
     94     toolbox: {
     95         show : true,
     96         feature : {
     97             dataView : {show: true, readOnly: true},
     98             restore : {show: true},
     99             saveAsImage : {show: true}
    100         }
    101     },
    102     calculable : true,
    103     xAxis : [
    104         {
    105             type: 'value',
    106             axisLine: {
    107                 lineStyle: {
    108                     color:'grey',
    109                     1
    110                 }
    111             }
    112         }
    113     ],
    114     yAxis : [
    115         {
    116             type: 'value',
    117             axisLine: {
    118                 lineStyle: {
    119                     color:'grey',
    120                     1
    121                 }
    122             }
    123         }
    124     ],
    125     series : [
    126         {
    127             name:line1Name,
    128             type:'line',
    129             data:cpuData[0],
    130         }
    131     ]
    132 };
    133 
    134         // 为echarts对象加载数据 
    135         myChart.setOption(option); 
    136     </script>
    137 </body>
    138 </html>
    View Code

    两个文件:

    图注: 

    I/O密集型: 一次mysql的联结查询的效率分析

    CPU密集型: 将联结查询分成两次简单查询, 并借助PHP计算得到最终结果的效率分析

    代码:

      1 <!DOCTYPE html>
      2 <head>
      3     <meta charset="utf-8">
      4     <title>ECharts</title>
      5 </head>
      6 <body>
      7 <?php
      8 function makeData($file)
      9 {
     10     $fp = fopen($file, 'r');
     11     $arrLineData = [];
     12     $arrDetailData = [];
     13     
     14     while(!feof($fp)){
     15         $row = fgets($fp);
     16         $row = trim($row);
     17         $arr_now = preg_split('#s+#', $row);
     18         
     19         if (count($arr_now) > 2 && is_numeric($arr_now[0])) {
     20             $x = $arr_now[0]*10000; //时间消耗, 变成整数, 单位ms*10
     21             $y = $arr_now[1]/1000; //内存消耗, 缩小数量级, 单位KB
     22             $arrLineData[] = [$x, $y];
     23             
     24             $tmp = [];
     25             $tmp['time_used']     = $arr_now[0];
     26             $tmp['memory_used'] = $arr_now[1];
     27             $tmp['memory_add']     = $arr_now[2];
     28             $tmp['function']     = $arr_now[4];
     29             $tmp['location']     = $arr_now[5];
     30             $key = $x.'_'.$arr_now[1];
     31             $arrDetailData[$key] = $tmp;
     32         }
     33     }
     34     
     35     return [$arrLineData, $arrDetailData];
     36 }
     37 
     38 $cpuData = makeData('./file/trace._test_index_ab_cpu_XDEBUG_TRACE=start_trace.xt');
     39 $ioData = makeData('./file/trace._test_index_ab_io_XDEBUG_TRACE=start_trace.xt');
     40 
     41 ?>
     42     <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
     43     <div id="main" style="height:400px"></div>
     44     <!-- ECharts单文件引入 -->
     45     <script src="./js/echarts-all.js"></script>
     46     <script type="text/javascript">
     47     var cpuData = <?= json_encode($cpuData)?>;
     48     var ioData = <?= json_encode($ioData)?>;
     49     var line1Name = 'CPU密集型';
     50     var line2Name = 'I/O密集型';
     51     
     52     // 基于准备好的dom,初始化echarts图表
     53     var myChart = echarts.init(document.getElementById('main')); 
     54     
     55     option = {
     56     title : {
     57         text: 'PHP效率分析',
     58         //subtext: '纯属虚构'
     59     },
     60     tooltip : {
     61         trigger: 'axis',
     62         axisPointer:{
     63             show: true,
     64             type : 'cross',
     65             lineStyle: {
     66                 type : 'dashed',
     67                 width : 1
     68             }
     69         },
     70         formatter : function (params) {
     71             var x = params.value[0];
     72             var y = params.value[1];
     73             
     74             var key = x+'_'+y*1000;
     75             if (params.seriesName == line1Name) {
     76                 var obj = cpuData[1][key];
     77             } else {
     78                 var obj = ioData[1][key];
     79             }
     80             str = params.seriesName+': <br>';
     81             str += '时间消耗: '+obj.time_used+"s<br>";
     82             str += '内存消耗: '+obj.memory_used/1024+"KB<br>";
     83             str += '内存增量: '+obj.memory_add+"B<br>";
     84             str += '函数调用: '+obj.function+"<br>";
     85             str += '所在行: '+obj.location;
     86             return str;
     87         }
     88     },
     89     dataZoom: {
     90         show: true,
     91         start : 0
     92     },
     93     legend: {
     94         data:[line1Name, line2Name]
     95     },
     96     toolbox: {
     97         show : true,
     98         feature : {
     99             dataView : {show: true, readOnly: true},
    100             restore : {show: true},
    101             saveAsImage : {show: true}
    102         }
    103     },
    104     calculable : true,
    105     xAxis : [
    106         {
    107             type: 'value',
    108             axisLine: {
    109                 lineStyle: {
    110                     color:'grey',
    111                     1
    112                 }
    113             }
    114         }
    115     ],
    116     yAxis : [
    117         {
    118             type: 'value',
    119             axisLine: {
    120                 lineStyle: {
    121                     color:'grey',
    122                     1
    123                 }
    124             }
    125         }
    126     ],
    127     series : [
    128         {
    129             name:line1Name,
    130             type:'line',
    131             data:cpuData[0],
    132         },
    133         {
    134             name:line2Name,
    135             type:'line',
    136             data:ioData[0]
    137         }
    138     ]
    139 };
    140 
    141         // 为echarts对象加载数据 
    142         myChart.setOption(option); 
    143     </script>
    144 </body>
    145 </html>
    View Code

    Summer PHP 框架

  • 相关阅读:
    Vue 中的无状态组件
    如何在 Vue 中使用 JSX 以及使用它的原因
    webpack打包优化的四种方法(多进程打包,多进程压缩,资源 CDN,动态 polyfill)
    watch监听对象
    微信小程序动态设置图片大小
    Flutter的生命周期和路由
    两个字符串的编辑距离学习[转载]
    系统进化树怎么看[转载]
    感知机PLA算法实现[转载]
    余弦相似度计算[转载]
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/5070134.html
Copyright © 2020-2023  润新知