source: trunk/w/profileinfo.php @ 1881

Revision 1881, 8.6 KB checked in by Xiping.Wang, 15 months ago (diff)

[trunk]upgrade Mediawiki 1.16.2

Line 
1<?php
2ini_set( 'zlib.output_compression', 'off' );
3
4$wgEnableProfileInfo = $wgProfileToDatabase = false;
5
6require_once( './includes/WebStart.php' );
7
8?>
9<!--
10     Show profiling data.
11
12     Copyright 2005 Kate Turner.
13
14     Permission is hereby granted, free of charge, to any person obtaining a copy
15     of this software and associated documentation files (the "Software"), to deal
16     in the Software without restriction, including without limitation the rights
17     to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18     copies of the Software, and to permit persons to whom the Software is
19     furnished to do so, subject to the following conditions:
20
21     The above copyright notice and this permission notice shall be included in
22     all copies or substantial portions of the Software.
23
24     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27     AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29     OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30     SOFTWARE.
31
32-->
33<html>
34<head>
35<title>Profiling data</title>
36<style type="text/css">
37        th {
38                text-align: left;
39                border-bottom: solid 1px black;
40        }
41
42        th, td {
43                padding-left: 0.5em;
44                padding-right: 0.5em;
45        }
46
47        td.timep, td.memoryp, td.count, td.cpr, td.tpc, td.mpc, td.tpr, td.mpr {
48                text-align: right;
49        }
50        td.timep, td.tpc, td.tpr {
51                background-color: #fffff0;
52        }
53        td.memoryp, td.mpc, td.mpr {
54                background-color: #f0f8ff;
55        }
56        td.count, td,cpr {
57                background-color: #f0fff0;
58        }
59        td.name {
60                background-color: #f9f9f9;
61        }
62</style>
63</head>
64<body>
65<?php
66
67if ( !$wgEnableProfileInfo ) {
68        echo "<p>Disabled</p>\n";
69        echo "</body></html>";
70        exit( 1 );
71}
72
73$expand = array();
74if ( isset( $_REQUEST['expand'] ) )
75        foreach( explode( ',', $_REQUEST['expand'] ) as $f )
76                $expand[$f] = true;
77
78class profile_point {
79        var $name;
80        var $count;
81        var $time;
82        var $children;
83
84        function profile_point( $name, $count, $time, $memory ) {
85                $this->name = $name;
86                $this->count = $count;
87                $this->time = $time;
88                $this->memory = $memory;
89                $this->children = array();
90        }
91
92        function add_child( $child ) {
93                $this->children[] = $child;
94        }
95
96        function display($indent = 0.0) {
97                global $expand, $totaltime, $totalmemory, $totalcount;
98                usort( $this->children, 'compare_point' );
99
100                $extet = '';
101                if ( isset( $expand[$this->name()] ) )
102                        $ex = true;
103                else    $ex = false;
104                if ( !$ex ) {
105                        if ( count( $this->children ) ) {
106                                $url = getEscapedProfileUrl( false, false, $expand + array( $this->name() => true ) );
107                                $extet = " <a href=\"$url\">[+]</a>";
108                        } else $extet = '';
109                } else {
110                        $e = array();
111                        foreach ( $expand as $name => $ep )
112                                if ( $name != $this->name() )
113                                        $e += array( $name => $ep );
114
115                        $extet = " <a href=\"" . getEscapedProfileUrl( false, false, $e ) . "\">[&ndash;]</a>";
116                }
117                ?>
118                <tr>
119                <td class="name" style="padding-left: <?php echo $indent ?>em;">
120                        <?php echo htmlspecialchars( $this->name() ) . $extet ?>
121                </td>
122                <td class="timep"><?php echo @wfPercent( $this->time() / $totaltime * 100 ) ?></td>
123                <td class="memoryp"><?php echo @wfPercent( $this->memory() / $totalmemory * 100 ) ?></td>
124                <td class="count"><?php echo $this->count() ?></td>
125                <td class="cpr"><?php echo round( sprintf( '%.2f', $this->callsPerRequest() ), 2 ) ?></td>
126                <td class="tpc"><?php echo round( sprintf( '%.2f', $this->timePerCall() ), 2 ) ?></td>
127                <td class="mpc"><?php echo round( sprintf( '%.2f' ,$this->memoryPerCall() / 1024 ), 2 ) ?></td>
128                <td class="tpr"><?php echo @round( sprintf( '%.2f', $this->time() / $totalcount ), 2 ) ?></td>
129                <td class="mpr"><?php echo @round( sprintf( '%.2f' ,$this->memory() / $totalcount / 1024 ), 2 ) ?></td>
130                </tr>
131                <?php
132                if ( $ex ) {
133                        foreach ( $this->children as $child ) {
134                                $child->display( $indent + 2 );
135                        }
136                }
137        }
138
139        function name() {
140                return $this->name;
141        }
142
143        function count() {
144                return $this->count;
145        }
146
147        function time() {
148                return $this->time;
149        }
150       
151        function memory() {
152                return $this->memory;
153        }
154       
155        function timePerCall() {
156                return @( $this->time / $this->count );
157        }
158       
159        function memoryPerCall() {
160                return @( $this->memory / $this->count );
161        }
162       
163        function callsPerRequest() {
164                global $totalcount;
165                return @( $this->count / $totalcount );
166        }
167       
168        function timePerRequest() {
169                global $totalcount;
170                return @( $this->time / $totalcount );
171        }
172       
173        function memoryPerRequest() {
174                global $totalcount;
175                return @( $this->memory / $totalcount );
176        }
177
178        function fmttime() {
179                return sprintf( "%5.02f", $this->time );
180        }
181};
182
183function compare_point( $a, $b ) {
184        global $sort;
185        switch ( $sort ) {
186        case "name":
187                return strcmp( $a->name(), $b->name() );
188        case "time":
189                return $a->time() > $b->time() ? -1 : 1;
190        case "memory":
191                return $a->memory() > $b->memory() ? -1 : 1;
192        case "count":
193                return $a->count() > $b->count() ? -1 : 1;
194        case "time_per_call":
195                return $a->timePerCall() > $b->timePerCall() ? -1 : 1;
196        case "memory_per_call":
197                return $a->memoryPerCall() > $b->memoryPerCall() ? -1 : 1;
198        case "calls_per_req":
199                return $a->callsPerRequest() > $b->callsPerRequest() ? -1 : 1;
200        case "time_per_req":
201                return $a->timePerRequest() > $b->timePerRequest() ? -1 : 1;
202        case "memory_per_req":
203                return $a->memoryPerRequest() > $b->memoryPerRequest() ? -1 : 1;
204        }
205}
206
207$sorts = array( 'time', 'memory', 'count', 'calls_per_req', 'name',
208        'time_per_call', 'memory_per_call', 'time_per_req', 'memory_per_req' );
209$sort = 'time';
210if ( isset( $_REQUEST['sort'] ) && in_array( $_REQUEST['sort'], $sorts ) )
211        $sort = $_REQUEST['sort'];
212
213
214$dbr = wfGetDB( DB_SLAVE );
215$res = $dbr->select( 'profiling', '*', array(), 'profileinfo.php', array( 'ORDER BY' => 'pf_name ASC' ) );
216
217if (isset( $_REQUEST['filter'] ) )
218        $filter = $_REQUEST['filter'];
219else
220        $filter = '';
221
222?>
223<form method="get" action="profileinfo.php">
224<p>
225<input type="text" name="filter" value="<?php echo htmlspecialchars($filter)?>"/>
226<input type="hidden" name="sort" value="<?php echo htmlspecialchars($sort)?>"/>
227<input type="hidden" name="expand" value="<?php echo htmlspecialchars(implode(",", array_keys($expand)))?>"/>
228<input type="submit" value="Filter" />
229</p>
230</form>
231
232<table cellspacing="0" border="1">
233<tr id="top">
234<th><a href="<?php echo getEscapedProfileUrl( false, 'name' ) ?>">Name</a></th>
235<th><a href="<?php echo getEscapedProfileUrl( false, 'time' ) ?>">Time (%)</a></th>
236<th><a href="<?php echo getEscapedProfileUrl( false, 'memory' ) ?>">Memory (%)</a></th>
237<th><a href="<?php echo getEscapedProfileUrl( false, 'count' ) ?>">Count</a></th>
238<th><a href="<?php echo getEscapedProfileUrl( false, 'calls_per_req' ) ?>">Calls/req</a></th>
239<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_call' ) ?>">ms/call</a></th>
240<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_call' ) ?>">kb/call</a></th>
241<th><a href="<?php echo getEscapedProfileUrl( false, 'time_per_req' ) ?>">ms/req</a></th>
242<th><a href="<?php echo getEscapedProfileUrl( false, 'memory_per_req' ) ?>">kb/req</a></th>
243</tr>
244<?php
245$totaltime = 0.0;
246$totalcount = 0;
247$totalmemory = 0.0;
248
249function getEscapedProfileUrl( $_filter = false, $_sort = false, $_expand = false ) {
250        global $filter, $sort, $expand;
251
252        if ( $_expand === false )
253                $_expand = $expand;
254
255        return htmlspecialchars(
256                '?' .
257                wfArrayToCGI( array(
258                        'filter' => $_filter ? $_filter : $filter,
259                        'sort' => $_sort ? $_sort : $sort,
260                        'expand' => implode( ',', array_keys( $_expand ) )
261                ) )
262        );
263}
264
265$points = array();
266$queries = array();
267$sqltotal = 0.0;
268
269$last = false;
270foreach( $res as $o ) {
271        $next = new profile_point( $o->pf_name, $o->pf_count, $o->pf_time, $o->pf_memory );
272        if( $next->name() == '-total' ) {
273                $totaltime = $next->time();
274                $totalcount = $next->count();
275                $totalmemory = $next->memory();
276        }
277        if ( $last !== false ) {
278                if ( preg_match( "/^".preg_quote( $last->name(), "/" )."/", $next->name() ) ) {
279                        $last->add_child($next);
280                        continue;
281                }
282        }
283        $last = $next;
284        if ( preg_match( "/^query: /", $next->name() ) || preg_match( "/^query-m: /", $next->name() ) ) {
285                $sqltotal += $next->time();
286                $queries[] = $next;
287        } else {
288                $points[] = $next;
289        }
290}
291
292$s = new profile_point( "SQL Queries", 0, $sqltotal, 0, 0 );
293foreach ( $queries as $q )
294        $s->add_child($q);
295$points[] = $s;
296
297usort( $points, "compare_point" );
298
299foreach ( $points as $point ) {
300        if ( strlen( $filter ) && !strstr( $point->name(), $filter ) )
301                continue;
302
303        $point->display();
304}
305?>
306</table>
307
308<p>Total time: <tt><?php printf("%5.02f", $totaltime) ?></tt></p>
309<p>Total memory: <tt><?php printf("%5.02f", $totalmemory / 1024 ) ?></tt></p>
310</body>
311</html>
Note: See TracBrowser for help on using the repository browser.