PHP Optimization
by Dave Jesch - SpectrOMTech.com
OC WordCamp - June 7, 2014
How to make your code run faster
There will be code.
Warning:
© 2014 SpectrOMTech.com. All Rights Reserved.
Optimization
Dave Jesch, Lifetime Geek
➔1.0 Web Applications
➔Sales Conversion Plugins
➔eCommerce Solutions
Principal, SpectrOMTech.com
© 2014 SpectrOMTech.com. All Rights Reserved.
Mastering Security & Optimization...
© 2014 SpectrOMTech.com. All Rights Reserved.
1. How to Measure Improvement
2. Basic Optimization Techniques
3. Code Examples
Today’s Goals:
© 2014 SpectrOMTech.com. All Rights Reserved.
Secret Behind Optimization
© 2014 SpectrOMTech.com. All Rights Reserved.
1. Ways to Measure Outcome
© 2014 SpectrOMTech.com. All Rights Reserved.
What are we Measuring?
● Speed
● Memory
● Code simplification / maintenance
© 2014 SpectrOMTech.com. All Rights Reserved.
Number of Operations
O(n) notation is used to express the worst case
order of growth of an algorithm.
How an algorithm’s worst-case performance changes as
the size of the data set it operates on increases.
http://www.perlmonks.org/?node_id=227909
© 2014 SpectrOMTech.com. All Rights Reserved.
microtime()
http://us1.php.net/manual/en/function.microtime.php
memory_get_usage()
http://us1.php.net/manual/en/function.memory-get-usage.php
XDebug Profiler
http://www.xdebug.org/docs/profiler
Measuring Tools
© 2014 SpectrOMTech.com. All Rights Reserved.
2. Let’s make your code Awesome!
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (1 of 7)
● Upgrade!
● 'string' is not the same as "string".
[2.62 : 3.78 @10,000,000]
● Use built-in functions, especially for arrays and strings.
array_column()/array_replace()/implode()/
explode(), etc.
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (2 of 7)
● Identity 1===1 vs. Equality '1' == 1
[1.63 : 3.72 @10,000,000]
● Shift (n >> 1), not divide (n / 2)
[2.34 : 2.75 @10,000,000]
● Don’t make needless copies.
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (3 of 7)
● Use reference operator $x = &$array['key']
[1.95 : 2.01 @10,000,000]
● unset large arrays when no longer needed.
● echo $a,$b; faster than echo $a.$b;
[1.11 : 2.48 @1,000,000]
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (4 of 7)
● Avoid @ error control operator.
● Pre increment ++$i faster than post increment $i++
[0.95 : 1.05 @10,000,000]
● "foreach" for arrays is better than "for"
[1.38 : 4.35 @100,000]
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (5 of 7)
● Initialize! using undefined variables is slower than pre-
initialized variables.
[0.82 : 4.41 @10,000,000]
● Don’t global unless you use it.
[1.82 : 2.01 @10,000,000]
● switch is faster than if (…) elseif (…) ...
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (6 of 7)
● !isset($foo{5}) faster than strlen($foo) < 5
[0.26 : 0.84 @10,000,000]
● str_replace() faster than preg_replace()
strtr() faster than str_replace()
[0.47 : 0.49 : 1.05 @100,000]
© 2014 SpectrOMTech.com. All Rights Reserved.
General Optimizations (7 of 7)
● "{$var}" is faster than sprintf()
[2.19 : 6.87 @10,000,000]
● incrementing global var slightly slower than a local var
[8.98 : 9.09 @100,000,000]
● use ctype_alnum(), ctype_alpha() and
ctype_digit() over regex
© 2014 SpectrOMTech.com. All Rights Reserved.
3. Examples:
© 2014 SpectrOMTech.com. All Rights Reserved.
Bubble Sort
Optimized: O(n^2) Best case: O(n)
$len = count($arr);
for ($i = 0; $i < $len; ++$i) {
$swapped = false;
for ($j = 0; $j < $len - 1; ++$j) {
if ($arr[$i] < $arr[$j]) {
$x = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $x;
$swapped = true;
}
}
if (!$swapped)
break;
}
Non-Optimized: O(n^2)
for ($i = 0; $i < count($arr); $i++) {
for ($j = 0; $j < count($arr) - 1; $j++) {
if ($arr[$i] < $arr[$j]) {
$x = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $x;
}
}
}
© 2014 SpectrOMTech.com. All Rights Reserved.
Reuse Function Results
Non-Optimized:
if (get_option('some_setting') > 0)
$var = get_option('some_setting');
else
$var = 0;
Optimized:
// use option or set to 0 if option not set
if (($var = get_option('some_setting')) < 0)
$var = 0;
© 2014 SpectrOMTech.com. All Rights Reserved.
Iterating Arrays
Non-Optimized:
// iterate through an array
foreach ($aHash as $key => $val) {
call_func($aHash[$key]);
}
12.01 seconds @10,000,000
Optimized:
// iterate through an array
while (list($key) = each($aHash)) {
call_func($aHash[$key]);
}
0.73 seconds @10,000,000
© 2014 SpectrOMTech.com. All Rights Reserved.
For Loops
Non-Optimized:
// loop through all elements of array
for ($i = 0; $i < count($a); ++$i) {
// do something
}
Optimized:
// loop through all elements of array
for ($i = 0, $c = count($a); $i < $c; ++$i) {
// do something
}
© 2014 SpectrOMTech.com. All Rights Reserved.
Latency Solutions: Transients
// get data from transient
if (($value = get_transient('my_transient_name')) === false) {
// nothing in transient, get from remote API
$value = wp_remote_get('http://some-domain.com', $args);
// save data from API in transient
set_transient('my_transient_name', $value, $expiration);
}
© 2014 SpectrOMTech.com. All Rights Reserved.
Ordering of Conditions
if (fastest() || fast() || slowest()) {
// some code here
}
________________________________________________________________
if (op1() && op2() && op3()) {
// more code
}
© 2014 SpectrOMTech.com. All Rights Reserved.
Code Optimized!
1. Practice, practice, practice
2. Always more to learn
3. Balancing act
4. Art form meets science
© 2014 SpectrOMTech.com. All Rights Reserved.
WP Geek Lab- Give back to WordPress.org
Alone we can do so little; together we can do so much. - Helen Keller
Connect with us at Hello@SpectrOMTech.com for more info.
write code...fix bugs...hangout...talk geek...
More References
http://phplens.com/lens/php-book/optimizing-debugging-php.php
http://alexatnet.com/articles/php-micro-optimization-tips
http://www.mdproductions.ca/guides/50-best-practices-to-optimize-php-code-
performance
http://php100.wordpress.com/2009/06/26/php-performance-google/
© 2014 SpectrOMTech.com. All Rights Reserved.

PHP Optimization

  • 1.
    PHP Optimization by DaveJesch - SpectrOMTech.com OC WordCamp - June 7, 2014 How to make your code run faster
  • 2.
    There will becode. Warning: © 2014 SpectrOMTech.com. All Rights Reserved.
  • 3.
    Optimization Dave Jesch, LifetimeGeek ➔1.0 Web Applications ➔Sales Conversion Plugins ➔eCommerce Solutions Principal, SpectrOMTech.com © 2014 SpectrOMTech.com. All Rights Reserved.
  • 4.
    Mastering Security &Optimization... © 2014 SpectrOMTech.com. All Rights Reserved.
  • 5.
    1. How toMeasure Improvement 2. Basic Optimization Techniques 3. Code Examples Today’s Goals: © 2014 SpectrOMTech.com. All Rights Reserved.
  • 6.
    Secret Behind Optimization ©2014 SpectrOMTech.com. All Rights Reserved.
  • 7.
    1. Ways toMeasure Outcome © 2014 SpectrOMTech.com. All Rights Reserved.
  • 8.
    What are weMeasuring? ● Speed ● Memory ● Code simplification / maintenance © 2014 SpectrOMTech.com. All Rights Reserved.
  • 9.
    Number of Operations O(n)notation is used to express the worst case order of growth of an algorithm. How an algorithm’s worst-case performance changes as the size of the data set it operates on increases. http://www.perlmonks.org/?node_id=227909 © 2014 SpectrOMTech.com. All Rights Reserved.
  • 10.
  • 11.
    2. Let’s makeyour code Awesome! © 2014 SpectrOMTech.com. All Rights Reserved.
  • 12.
    General Optimizations (1of 7) ● Upgrade! ● 'string' is not the same as "string". [2.62 : 3.78 @10,000,000] ● Use built-in functions, especially for arrays and strings. array_column()/array_replace()/implode()/ explode(), etc. © 2014 SpectrOMTech.com. All Rights Reserved.
  • 13.
    General Optimizations (2of 7) ● Identity 1===1 vs. Equality '1' == 1 [1.63 : 3.72 @10,000,000] ● Shift (n >> 1), not divide (n / 2) [2.34 : 2.75 @10,000,000] ● Don’t make needless copies. © 2014 SpectrOMTech.com. All Rights Reserved.
  • 14.
    General Optimizations (3of 7) ● Use reference operator $x = &$array['key'] [1.95 : 2.01 @10,000,000] ● unset large arrays when no longer needed. ● echo $a,$b; faster than echo $a.$b; [1.11 : 2.48 @1,000,000] © 2014 SpectrOMTech.com. All Rights Reserved.
  • 15.
    General Optimizations (4of 7) ● Avoid @ error control operator. ● Pre increment ++$i faster than post increment $i++ [0.95 : 1.05 @10,000,000] ● "foreach" for arrays is better than "for" [1.38 : 4.35 @100,000] © 2014 SpectrOMTech.com. All Rights Reserved.
  • 16.
    General Optimizations (5of 7) ● Initialize! using undefined variables is slower than pre- initialized variables. [0.82 : 4.41 @10,000,000] ● Don’t global unless you use it. [1.82 : 2.01 @10,000,000] ● switch is faster than if (…) elseif (…) ... © 2014 SpectrOMTech.com. All Rights Reserved.
  • 17.
    General Optimizations (6of 7) ● !isset($foo{5}) faster than strlen($foo) < 5 [0.26 : 0.84 @10,000,000] ● str_replace() faster than preg_replace() strtr() faster than str_replace() [0.47 : 0.49 : 1.05 @100,000] © 2014 SpectrOMTech.com. All Rights Reserved.
  • 18.
    General Optimizations (7of 7) ● "{$var}" is faster than sprintf() [2.19 : 6.87 @10,000,000] ● incrementing global var slightly slower than a local var [8.98 : 9.09 @100,000,000] ● use ctype_alnum(), ctype_alpha() and ctype_digit() over regex © 2014 SpectrOMTech.com. All Rights Reserved.
  • 19.
    3. Examples: © 2014SpectrOMTech.com. All Rights Reserved.
  • 20.
    Bubble Sort Optimized: O(n^2)Best case: O(n) $len = count($arr); for ($i = 0; $i < $len; ++$i) { $swapped = false; for ($j = 0; $j < $len - 1; ++$j) { if ($arr[$i] < $arr[$j]) { $x = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $x; $swapped = true; } } if (!$swapped) break; } Non-Optimized: O(n^2) for ($i = 0; $i < count($arr); $i++) { for ($j = 0; $j < count($arr) - 1; $j++) { if ($arr[$i] < $arr[$j]) { $x = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $x; } } } © 2014 SpectrOMTech.com. All Rights Reserved.
  • 21.
    Reuse Function Results Non-Optimized: if(get_option('some_setting') > 0) $var = get_option('some_setting'); else $var = 0; Optimized: // use option or set to 0 if option not set if (($var = get_option('some_setting')) < 0) $var = 0; © 2014 SpectrOMTech.com. All Rights Reserved.
  • 22.
    Iterating Arrays Non-Optimized: // iteratethrough an array foreach ($aHash as $key => $val) { call_func($aHash[$key]); } 12.01 seconds @10,000,000 Optimized: // iterate through an array while (list($key) = each($aHash)) { call_func($aHash[$key]); } 0.73 seconds @10,000,000 © 2014 SpectrOMTech.com. All Rights Reserved.
  • 23.
    For Loops Non-Optimized: // loopthrough all elements of array for ($i = 0; $i < count($a); ++$i) { // do something } Optimized: // loop through all elements of array for ($i = 0, $c = count($a); $i < $c; ++$i) { // do something } © 2014 SpectrOMTech.com. All Rights Reserved.
  • 24.
    Latency Solutions: Transients //get data from transient if (($value = get_transient('my_transient_name')) === false) { // nothing in transient, get from remote API $value = wp_remote_get('http://some-domain.com', $args); // save data from API in transient set_transient('my_transient_name', $value, $expiration); } © 2014 SpectrOMTech.com. All Rights Reserved.
  • 25.
    Ordering of Conditions if(fastest() || fast() || slowest()) { // some code here } ________________________________________________________________ if (op1() && op2() && op3()) { // more code } © 2014 SpectrOMTech.com. All Rights Reserved.
  • 26.
    Code Optimized! 1. Practice,practice, practice 2. Always more to learn 3. Balancing act 4. Art form meets science © 2014 SpectrOMTech.com. All Rights Reserved.
  • 27.
    WP Geek Lab-Give back to WordPress.org Alone we can do so little; together we can do so much. - Helen Keller Connect with us at Hello@SpectrOMTech.com for more info. write code...fix bugs...hangout...talk geek...
  • 28.