Your application needs to be fast nowadays in order to stand out from the crowd. Study has shown that application performance has a psychological effect on customer satisfaction. Profiling can give you more insight in how your application really works internally. It gives you an overview of where the resource bottlenecks in your application reside. In this talk, I am going to give an overview of some profiling methods that exist today, and where I think we should be heading. After this talk, you will be able to use some basic profiling tricks to analyse the performance constraints in your application.
http://www.meetup.com/AmsterdamPHP/events/168161882/
3. DEFINITION
profiling is a form of dynamic program analysis that measures, for
example, the space (memory) or time complexity of a program,
the usage of particular instructions, or the frequency and
duration of function calls. Most commonly, profiling information
serves to aid program optimization.
7. DEFINITION
Static program analysis is the analysis of computer software that
is performed without actually executing programs
The term is usually applied to the analysis performed by an
automated tool, with human analysis being called program
understanding, program comprehension or code review.
8. STATIC ANALYSIS TOOLS
There are a set of tools which perform static code analysis.
These tools can be integrated within an automated build.
PHP Mess Detector
PHP Copy/Paste Detector
PHP CodeSniffer
PHP Dead Code Detector
There is a nice page containing a predefined set of tools for a
build to be found at Jenkins PHP
12. DEFINITION
The analysis of computer software that is performed by
executing programs on a real or virtual processor.
For dynamic program analysis to be effective,
the target program must be executed with sufficient test inputs
to produce interesting behavior.
Use of software testing measures such as code coverage helps
ensure that an adequate slice of the program's set of possible
behaviors has been observed.
13. CALLSTACK
A callstack is the order in which statements are exectuted.
A common callstack, is an Exception trace. This trace shows all
the statements executed before an exception is thrown.
14. CALLGRAPH
A callgraph is a visual representation of a callstack.
In large applications this graph can give you better insight on how
an application is wired.
15. PROFILING DATA
Usually, the data gathered with a profiler can be represented in
stacks or graphs.
They can include information regarding memory- and cpu-usage.
17. REASONS
Debugging CPU performance
Debugging memory performance
Debugging IO performance
See what function is called how much
Gain insight of the black box that is the application
18. REASONS
We live in a digital age where we want everything instantly.
According to a case study from Radware
, 51 percent of online
shoppers in the U.S claimed if a site is too slow they will not
complete a purchase.
Nowadays, search engine indexing also accounts for page load.
The psychology of web performance
SEO 101: How important is site speed in 2014?
Case study from Radware
23. ACTIVE PROFILER
Used during development
Gather more information than passive profilers
Performance impact is bigger
Should _NOT_ be used in production
Example: Xdebug
24. PASSIVE PROFILER
Minimal impact on performance
Gathers less but sufficient information to diagnose issue
Examples: XHProf, New Relic, Blackfire.io
26. XDEBUG
Generates cachegrind
files (like Valgrind for C)
Can be analysed by KCacheGrind among others
Cachegrind files are relatively big in size
Also a developer tool for breakpoints and remote debugging
Active profiler
34. XHPROF
Developed by Facebook and released as open-source in 2009
PECL extension
Lightweight on profiling data
Lightweight on profiling performance hit
Passive profiler
Includes webgui for reviewing and comparing profiling data
35. INSTALLATION
# Linux (using apt or yum)
apt-get install -y php5-xhprof
# OSX (using homebrew)
brew install php56-xhprof
# For Windows, use PECL or download a .dll somewhere, or compile for your own
/! NOTE: Don't forget to restart if running through a webserver /!
36. WORDPRESS EXAMPLE
// index.php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
/** Loads the WordPress Environment and Template */
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
$xhprof_data = xhprof_disable();
include_once 'xhprof_lib/utils/xhprof_lib.php';
include_once 'xhprof_lib/utils/xhprof_runs.php';
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
50. LINK0/PROFILER
Focused on XHProf
Has multiple persistence layers for storing profiles
Memory
Flysystem
ZendDbAdapter
MongoDB (work in progress)
Available on composer/packagist
Fully Object-orientated
100% code coverage
http://github.com/link0/profiler
51. GETTING STARTED
Bootstrapping the profiler
$profiler = new Link0ProfilerProfiler();
$profiler->start();
print_r($profiler->stop());
Adding a PersistenceHandler
$persistenceHandler = new Link0ProfilerPersistenceHandlerMemoryHandler();
$ profiler = new Link0ProfilerProfiler(
$persistenceHandler);
Flysystem example
$filesystemAdapter = new LeagueFlysystemAdapterLocal('/tmp/profiler');
$ $filesystemAdapter);
filesystem = new Link0ProfilerFilesystem(
persistenceHandler = new Link0ProfilerPersistenceHandlerFilesystemHandler(
profiler = new Link0ProfilerProfiler(
$$
$persistenceHandler);
53. SOME IDEAS
Enable on production with sampling
Aggregate all profiles to centralized machine/cluster
Integrate into continuous deployment
Run profiling on acceptance environment
Alert when compared differences surpass threshold
Codeception integration
Find business use-cases that are slow
Make a case for refactoring to the business
Focus on the customers emulated experience
55. USEFUL LINKS
Profiling PHP with PhpStorm and Xdebug
Profiling PHP with PhpStorm and Zend Debugger
XDebug Profiler documentation
XHProf PHP documentation
Profiling with XHProf and XHGui
http://github.com/link0/profiler
56. I <3 FEEDBACK
Joind.in:
GitHub:
Twitter:
IRC: link0 on Freenode
https://joind.in/12802
http://github.com/dennisdegreef
@dennisdegreef
#amsterdamphp
SLIDES ARE ALSO ON JOIND.IN