mirror of
https://github.com/moodle/moodle.git
synced 2025-03-25 10:00:31 +01:00
Here we are reducing the xhprof runs data by removing the __Mustache==>__Mustache calls and all the orphaned data. To save N iterations what we are doing is: 0. The information is "topologically" sorted, so we ensure that all the parents in the data are processed before the children. (this will help a lot when cleaning orphaned data, see below). 1. First pass, all the candidate (by regexp) calls are removed from the run data. 2. Second pass, all the orphaned information (calls that have ended losing his parent) are also removed, so data is consistent. Note that, normally we would need N passes to remove all the orphaned data (because each pass creates new orphan candidates), but, as far as we have ensured that the information is topologically sorted (see point 0 above), all this can be done in one unique pass. TODO: - Add unit tests. - Enable some system to be able to decide which utilities we want to get the data reduced and which ones will continue using the complete data. Right now the reduction is being applied to all the utilities (both table and graph views). - Document the change and, if implemented, the way to select between complete/reduced data. - Consider adding some caching to speed-up the reduction process (some TODOs have been left in the code pointing to the critical points).
xhprof for PHP7
XHProf is a function-level hierarchical profiler for PHP and has a simple HTML based navigational interface. The raw data collection component is implemented in C (as a PHP extension). The reporting/UI layer is all in PHP. It is capable of reporting function-level inclusive and exclusive wall times, memory usage, CPU times and number of calls for each function. Additionally, it supports ability to compare two runs (hierarchical DIFF reports), or aggregate results from multiple runs.
This version supports PHP7
PHP Version
- 7.0
- 7.1
- 7.2
- 7.3
- 7.4
- 8.0
Installation
git clone https://github.com/longxinH/xhprof.git ./xhprof
cd xhprof/extension/
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make && sudo make install
configuration add to your php.ini
[xhprof]
extension = xhprof.so
xhprof.output_dir = /tmp/xhprof
php.ini configuration
Options | Defaults | Version | Explain |
---|---|---|---|
xhprof.output_dir | "" | All | Output directory |
xhprof.sampling_interval | 100000 | >= v2.* | Sampling interval to be used by the sampling profiler, in microseconds |
xhprof.sampling_depth | INT_MAX | >= v2.* | Depth to trace call-chain by the sampling profiler |
xhprof.collect_additional_info | 0 | >= v2.1 | Collect mysql_query, curl_exec internal info. The default is 0. Open value is 1 |
Turn on extra collection
php.ini adds xhprof.collect_additional_info
xhprof.collect_additional_info = 1
Options
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
XHPROF_FLAGS_NO_BUILTINS
do not profile builtinsXHPROF_FLAGS_CPU
gather CPU times for funcsXHPROF_FLAGS_MEMORY
gather memory usage for funcs
Example
<?php
array(
"main()" => array(
"wt" => 237,
"ct" => 1,
"cpu" => 100,
)
)
wt
The execution time of the function method is time consumingct
The number of times the function was calledcpu
The CPU time consumed by the function method executionmu
Memory used by function methods. The call is zend_memory_usage to get the memory usagepmu
Peak memory used by the function method. The call is zend_memory_peak_usage to get the memory
PDO::exec
PDO::query
mysqli_query
$mysqli = new mysqli("localhost", "my_user", "my_password", "user");
$result = $mysqli->query("SELECT * FROM user LIMIT 10");
Output data
mysqli::query#SELECT * FROM user LIMIT 10
PDO::prepare
Convert preprocessing placeholders for actual parameters, more intuitive analytic performance (does not change the zend execution process)
$_sth = $db->prepare("SELECT * FROM user where userid = :id and username = :name");
$_sth->execute([':id' => '1', ':name' => 'admin']);
$data1 = $_sth->fetch();
$_sth = $db->prepare("SELECT * FROM user where userid = ?");
$_sth->execute([1]);
$data2 = $_sth->fetch();
Output data
PDOStatement::execute#SELECT * FROM user where userid = 1 and username = admin
PDOStatement::execute#SELECT * FROM user where userid = 1
Curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com");
$output = curl_exec($ch);
curl_close($ch);
Output data
curl_exec#http://www.baidu.com