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 框架

原文地址:https://www.cnblogs.com/iLoveMyD/p/5070134.html