com presentations: tweaks: expotec.html expotec.xml slides/intro/php7_speed.xml
[email protected] (Rasmus Lerdorf) Fri, 26 Aug 2016 18:38:41 +0000
| Newsgroups | php.pres |
|---|---|
| Message-ID | <[email protected]> |
Commit: cf62e4cb06036bc04ddbb55104fb6380fe31b943 Author: Rasmus Lerdorf <[email protected]> Fri, 26 Aug 2016 15:38:41 -0300 Parents: e48df921dc54489253891e2f24210c91e8a994a0 Branches: master Link: http://git.php.net/?p=presentations.git;a=commitdiff;h=cf62e4cb06036bc04ddbb55104fb6380fe31b943 Log: tweaks Changed paths: M expotec.html M expotec.xml A slides/intro/php7_speed.xml
diff_cf62e4cb06036bc04ddbb55104fb6380fe31b943.txt
(text/plain, 24.3 KB)
diff --git a/expotec.html b/expotec.html
index 79f39e3..7fe936c 100644
--- a/expotec.html
+++ b/expotec.html
@@ -127,6 +127,137 @@ Notice: Undefined variable: notes in /home/rasmus/src/web/pres2/reveal_template.
</aside>
</section>
<section>
+ <section id="php7_speed">
+ <img src="/presentations/slides/intro/php7trans-200.png" width="" height="">
+ <p class="p" style="font-size:1.1em;text-align:left;">✔ engine improvements</p>
+ <ul>
+ <li style="font-size: 1em;">100%+ performance gain on most real-world applications</li>
+ <li style="font-size: 1em;">Lower memory usage, sometimes drastically lower</li>
+ </ul>
+ </section> </section>
+ <section>
+ <section id="php7perfdetail">
+ <h1 style="text-align:center;">JIT?</h1>
+ </section>
+<section id="php7perfdetail1">
+ <p class="p" style="font-size:1.1em;">Improve CPU cache usage</p>
+ <ul>
+ <li style="font-size: 1em;list-style-type: none;">Step 1: Decrease overall data</li>
+ <li style="font-size: 1em;list-style-type: none;">Step 2: Better data locality and less indirections</li>
+ <li style="font-size: 1em;list-style-type: none;">Step 3: Save the world!</li>
+ </ul>
+ </section>
+<section id="php7perfdetail1">
+ <ul>
+ <li style="font-size: 1em;list-style-type: none;">zval size reduced from 24 to 16 bytes</li>
+ <li style="font-size: 1em;list-style-type: none;">Hashtable size reduced from 72 to 56 bytes</li>
+ <li style="font-size: 1em;list-style-type: none;">Hashtable bucket size reduced from 72 to 32 bytes</li>
+ <li style="font-size: 1em;list-style-type: none;">Immutable array optimization</li>
+ </ul>
+ <pre><code data-trim style="font-size:1.1em;">$a = [];
+for($i=0; $i < 100000;$i++) {
+ $a[] = ['abc','def','ghi','jkl','mno','pqr'];
+}
+echo memory_get_usage(true);
+
+// PHP 5.x 109M
+// PHP 7.0 42M no opcache
+// PHP 7.0 6M with opcache enabled</code></pre>
+ </section>
+<section id="php7perfdetail2">
+ <ul>
+ <li style="font-size: 1em;list-style-type: none;">New memory allocator similar to jemalloc</li>
+ <li style="font-size: 1em;list-style-type: none;">Faster hashtable iteration API</li>
+ <li style="font-size: 1em;list-style-type: none;">Array duplication optimization</li>
+ <li style="font-size: 1em;list-style-type: none;">PCRE JIT enabled by default</li>
+ <li style="font-size: 1em;list-style-type: none;">Precomputed string hashes</li>
+ <li style="font-size: 1em;list-style-type: none;">Fast ZPP (ZendParseParameters) implementation</li>
+ <li style="font-size: 1em;list-style-type: none;">Faster stack-allocated zvals (instead of heap)</li>
+ <li style="font-size: 1em;list-style-type: none;">Optimized VM calling</li>
+ <li style="font-size: 1em;list-style-type: none;">Global register variables with gcc 4.8+</li>
+ <li style="font-size: 1em;list-style-type: none;">plus hundreds of micro-optimizations</li>
+ </ul>
+ </section>
+<section id="php7perfdetail3">
+ <p class="p" style="font-size:1.1em;">HugePage support in Opcache</p>
+ <pre><code class="shell nohighlight" data-trim style="font-size:1.1em;">./configure --enable-huge-code-pages</code></pre>
+ <pre><code class="ini" data-trim style="font-size:1.1em;">opcache.memory_consumption=256
+opcache.huge_code_pages=1</code></pre>
+ <pre><code class="shell nohighlight" data-trim style="font-size:1.1em;">% sysctl -w vm.nr_hugepages=256
+% service php-fpm start
+% cat /proc/meminfo | grep Huge
+HugePages_Total: 256
+HugePages_Free: 231
+HugePages_Rsvd: 119
+HugePages_Surp: 0
+Hugepagesize: 2048 kB</code></pre>
+ </section>
+<section id="php7detail4">
+ <h1 style="text-align:center;">JIT?</h1>
+ </section> </section>
+ <section>
+ <section id="drupalbench">
+
+<div id="drupalbench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/drupalbench.js"></script>
+ </section> </section>
+ <section>
+ <section id="wpbench">
+
+<div id="wpbench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wpbench.js"></script>
+ </section>
+<section id="fdo">
+ <p class="p" style="font-size:1.1em;text-align:center;">GCC Feedback-Directed Optimization (FDO)</p>
+ <pre><code class="shell nohighlight" data-trim style="font-size:1em;">$ make clean
+$ make -j8 prof-gen
+...
+$ sapi/cgi/php-cgi -T 1000 /var/www/wordpress/index.php > /dev/null
+$ make prof-clean
+$ make -j8 prof-use</code></pre>
+ </section>
+<section id="wpbench_fdo">
+
+<div id="wpbench_fdo_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wpbench_fdo.js"></script>
+ </section> </section>
+ <section>
+ <section id="moodlebench">
+
+<div id="moodlebench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/moodlebench.js"></script>
+ </section> </section>
+ <section>
+ <section id="wardrobebench">
+
+<div id="wardrobebench_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/nov3/wardrobebench.js"></script>
+ </section> </section>
+ <section>
+ <section id="smembase">
+
+<div id="smembase_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/smembase.js"></script>
+ </section> </section>
+ <section>
+ <section id="smemdrupal">
+
+<div id="smemdrupal_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/smemdrupal.js"></script>
+ </section> </section>
+ <section>
+ <section id="smemwp">
+
+<div id="smemwp_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/smemwp.js"></script>
+ </section> </section>
+ <section>
+ <section id="smemmoodle">
+
+<div id="smemmoodle_container" class="stretch" style="margin: 0 auto"></div>
+<script src="presentations/slides/intro/smemmoodle.js"></script>
+ </section> </section>
+ <section>
<section id="php7">
<img src="/presentations/slides/intro/php7trans-200.png" width="" height="">
<p class="p" style="font-size:1.1em;text-align:left;">✔ engine improvements</p>
@@ -345,150 +476,10 @@ $bytes = random_bytes(10);
var_dump( $int );
var_dump( bin2hex($bytes) );</code></pre>
- <pre class="output" style="font-size:1.2em;">int(-363)
-string(20) "98ee21d594529d55a327"
+ <pre class="output" style="font-size:1.2em;">int(348)
+string(20) "9576ce9260bcaa4509b5"
</pre> </section> </section>
<section>
- <section id="php7perfdetail">
- <h1 style="text-align:center;">JIT?</h1>
- </section>
-<section id="php7perfdetail1">
- <p class="p" style="font-size:1.1em;">Improve CPU cache usage</p>
- <ul>
- <li style="font-size: 1em;list-style-type: none;">Step 1: Decrease overall data</li>
- <li style="font-size: 1em;list-style-type: none;">Step 2: Better data locality and less indirections</li>
- <li style="font-size: 1em;list-style-type: none;">Step 3: Save the world!</li>
- </ul>
- </section>
-<section id="php7perfdetail1">
- <ul>
- <li style="font-size: 1em;list-style-type: none;">zval size reduced from 24 to 16 bytes</li>
- <li style="font-size: 1em;list-style-type: none;">Hashtable size reduced from 72 to 56 bytes</li>
- <li style="font-size: 1em;list-style-type: none;">Hashtable bucket size reduced from 72 to 32 bytes</li>
- <li style="font-size: 1em;list-style-type: none;">Immutable array optimization</li>
- </ul>
- <pre><code data-trim style="font-size:1.1em;">$a = [];
-for($i=0; $i < 100000;$i++) {
- $a[] = ['abc','def','ghi','jkl','mno','pqr'];
-}
-echo memory_get_usage(true);
-
-// PHP 5.x 109M
-// PHP 7.0 42M no opcache
-// PHP 7.0 6M with opcache enabled</code></pre>
- </section>
-<section id="php7perfdetail2">
- <ul>
- <li style="font-size: 1em;list-style-type: none;">New memory allocator similar to jemalloc</li>
- <li style="font-size: 1em;list-style-type: none;">Faster hashtable iteration API</li>
- <li style="font-size: 1em;list-style-type: none;">Array duplication optimization</li>
- <li style="font-size: 1em;list-style-type: none;">PCRE JIT enabled by default</li>
- <li style="font-size: 1em;list-style-type: none;">Precomputed string hashes</li>
- <li style="font-size: 1em;list-style-type: none;">Fast ZPP (ZendParseParameters) implementation</li>
- <li style="font-size: 1em;list-style-type: none;">Faster stack-allocated zvals (instead of heap)</li>
- <li style="font-size: 1em;list-style-type: none;">Optimized VM calling</li>
- <li style="font-size: 1em;list-style-type: none;">Global register variables with gcc 4.8+</li>
- <li style="font-size: 1em;list-style-type: none;">plus hundreds of micro-optimizations</li>
- </ul>
- </section>
-<section id="php7perfdetail3">
- <p class="p" style="font-size:1.1em;">HugePage support in Opcache</p>
- <pre><code class="shell nohighlight" data-trim style="font-size:1.1em;">./configure --enable-huge-code-pages</code></pre>
- <pre><code class="ini" data-trim style="font-size:1.1em;">opcache.memory_consumption=256
-opcache.huge_code_pages=1</code></pre>
- <pre><code class="shell nohighlight" data-trim style="font-size:1.1em;">% sysctl -w vm.nr_hugepages=256
-% service php-fpm start
-% cat /proc/meminfo | grep Huge
-HugePages_Total: 256
-HugePages_Free: 231
-HugePages_Rsvd: 119
-HugePages_Surp: 0
-Hugepagesize: 2048 kB</code></pre>
- </section>
-<section id="php7detail4">
- <h1 style="text-align:center;">JIT?</h1>
- </section> </section>
- <section>
- <section id="drupalbench">
-
-<div id="drupalbench_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/drupalbench.js"></script>
- </section> </section>
- <section>
- <section id="wpbench">
-
-<div id="wpbench_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/wpbench.js"></script>
- </section>
-<section id="fdo">
- <p class="p" style="font-size:1.1em;text-align:center;">GCC Feedback-Directed Optimization (FDO)</p>
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">$ make clean
-$ make -j8 prof-gen
-...
-$ sapi/cgi/php-cgi -T 1000 /var/www/wordpress/index.php > /dev/null
-$ make prof-clean
-$ make -j8 prof-use</code></pre>
- </section>
-<section id="wpbench_fdo">
-
-<div id="wpbench_fdo_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/wpbench_fdo.js"></script>
- </section> </section>
- <section>
- <section id="bbbench">
-
-<div id="bbbench_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/bbbench.js"></script>
- </section> </section>
- <section>
- <section id="moodlebench">
-
-<div id="moodlebench_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/moodlebench.js"></script>
- </section> </section>
- <section>
- <section id="wardrobebench">
-
-<div id="wardrobebench_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/nov3/wardrobebench.js"></script>
- </section> </section>
- <section>
- <section id="smembase">
-
-<div id="smembase_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smembase.js"></script>
- </section> </section>
- <section>
- <section id="smemdrupal">
-
-<div id="smemdrupal_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smemdrupal.js"></script>
- </section> </section>
- <section>
- <section id="smemwp">
-
-<div id="smemwp_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smemwp.js"></script>
- </section> </section>
- <section>
- <section id="smembb">
-
-<div id="smembb_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smembb.js"></script>
- </section> </section>
- <section>
- <section id="smemmoodle">
-
-<div id="smemmoodle_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smemmoodle.js"></script>
- </section> </section>
- <section>
- <section id="smemwardrobe">
-
-<div id="smemwardrobe_container" class="stretch" style="margin: 0 auto"></div>
-<script src="presentations/slides/intro/smemwardrobe.js"></script>
- </section> </section>
- <section>
<section id="bc7">
<h1 style="text-align:center;">Top-5 Things that might bite you</h1>
<br/>
@@ -541,217 +532,6 @@ Foo::{$bar['baz']}()</code></pre>
<pre class="output" style="font-size:0.5em;">Parse error: Invalid numeric literal in file.php on line 2 </pre> <p class="p" style="font-size:0.8em;text-align:left;">Detecting parse errors is easy: php -l</p>
</section> </section>
<section>
- <section id="phan">
- <h1 style="text-align:center;">Static Analysis</h1>
-<br/>
-<br/>
-<br/>
- <div align="center" style="font-size: 1.25em; color: ; text-align: center; margin-left: ; margin-right: ; margin-top: ; margin-bottom: ;"><a href="https://github.com/etsy/phan" target="">github.com/etsy/phan</a></div>
- </section>
-<section id="phan1">
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">% phan -h
-Usage: ./phan [options] [files...]
- -f, --file-list <filename>
- A file containing a list of PHP files to be analyzed
-
- -r, --file-list-only
- A file containing a list of PHP files to be analyzed to the
- exclusion of any other directories or files passed in. This
- is useful when running Phan from a stored state file and
- passing in a small subset of files to be re-analyzed.
-
- -l, --directory <directory>
- A directory to recursively read PHP files from to analyze
-
- -3, --exclude-directory-list <dir_list>
- A comma-separated list of directories for which any files
- included from that directory will not be analysis. Note
- that adding a directory here will not cause its files to
- be parsed.
-
- -d, --project-root-directory
- Hunt for a directory named .phan in the current or parent
- directory and read configuration file config.php from that
- path.
-
- -m <mode>, --output-mode
- Output mode from 'text', 'json', 'codeclimate', or 'checkstyle'
-
- -o, --output <filename>
- Output filename
-
- -p, --progress-bar
- Show progress bar
-
- -a, --dump-ast
- Emit an AST for each file rather than analyze
-
- -e, --expand-file-list
- Expand the list of files passed in to include any files
- that depend on elements defined in those files. This is
- useful when running Phan from a state file and passing in
- just the set of changed files.
-
- -q, --quick
- Quick mode - doesn't recurse into all function calls
-
- -b, --backward-compatibility-checks
- Check for potential PHP 5 -> PHP 7 BC issues
-
- -i, --ignore-undeclared
- Ignore undeclared functions and classes
-
- -y, --minimum-severity <level in {0,5,10}>
- Minimum severity level (low=0, normal=5, critical=10) to report.
- Defaults to 0.
-
- -c, --parent-constructor-required
- Comma-separated list of classes that require
- parent::__construct() to be called
-
- -x, --dead-code-detection
- Emit issues for classes, methods, functions, constants and
- properties that are probably never referenced and can
- possibly be removed.
-
- -j, --processes <int>
- The number of parallel processes to run during the analysis
- phase. Defaults to 1.
-
- -z, --signature-compatibility
- Analyze signatures for methods that are overrides to ensure
- compatiiblity with what they're overriding.
-
- -h,--help
- This help information</code></pre>
- </section>
-<section id="phan2">
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">% phan -i -b display.php
-
-display.php:416 CompatError expression may not be PHP 7 compatible</code></pre>
- <pre><code data-trim style="font-size:1em;">echo preg_replace('/:-:(.*?):-:/e', '$this->pres->\\1', $text);</code></pre>
- <pre><code data-trim style="font-size:1em;">echo preg_replace_callback(
- '/:-:(.*?):-:/',
- function($matches) {
- return $this->pres->$matches[1]; // Oops!
- },
- $text);</code></pre>
- <pre><code data-trim style="font-size:1em;">echo preg_replace_callback(
- '/:-:(.*?):-:/',
- function($matches) {
- return $this->pres->{$matches[1]}; // Ok
- },
- $text);</code></pre>
- </section>
-<section id="phan3">
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">% git clone https://github.com/Seldaek/monolog.git
-% cd monolog
-% find . -name '*.php' | grep -v test > filelist.txt
-% phan -i -f filelist.txt
-
-./src/Monolog/Handler/ChromePHPHandler.php:178 PhanTypeMismatchReturn Returning type int but headersAccepted() is declared to return bool
-./src/Monolog/Handler/ElasticSearchHandler.php:124 PhanTypeMismatchArgumentInternal Argument 3 (previous) is \elastica\exception\exceptioninterface but \runtimeexception::__construct() takes \runtimeexception|\throwable
-./src/Monolog/Handler/FirePHPHandler.php:81 PhanTypeMismatchReturn Returning type array but createRecordHeader() is declared to return string
-./src/Monolog/Handler/FirePHPHandler.php:153 PhanTypeMismatchArgumentInternal Argument 1 (array_arg) is string but \current() takes array
-./src/Monolog/Handler/FirePHPHandler.php:154 PhanTypeMismatchArgumentInternal Argument 1 (array_arg) is string but \current() takes array
-./src/Monolog/Handler/FirePHPHandler.php:154 PhanTypeMismatchArgumentInternal Argument 1 (array_arg) is string but \key() takes array
-./src/Monolog/Handler/FlowdockHandler.php:70 PhanTypeMissingReturn Method \monolog\handler\flowdockhandler::getdefaultformatter is declared to return \monolog\formatter\formatterinterface but has no return value
-./src/Monolog/Handler/GelfHandler.php:55 PhanTypeMismatchProperty Assigning null to property but \monolog\handler\gelfhandler::publisher is \gelf\imessagepublisher|\gelf\publisher|\gelf\publisherinterface
-./src/Monolog/Handler/MandrillHandler.php:49 PhanSignatureMismatch Declaration of function send($content, array $records) should be compatible with function send(string $content, array $records) defined in ./src/Monolog/Handler/MailHandler.php:46
-./src/Monolog/Handler/NativeMailerHandler.php:117 PhanSignatureMismatch Declaration of function send($content, array $records) should be compatible with function send(string $content, array $records) defined in ./src/Monolog/Handler/MailHandler.php:46
-./src/Monolog/Handler/RedisHandler.php:41 PhanTypeMismatchDefault Default value for int $capSize can't be bool
-./src/Monolog/Handler/SocketHandler.php:115 PhanTypeMismatchProperty Assigning float to property but \monolog\handler\sockethandler::timeout is int
-./src/Monolog/Handler/SocketHandler.php:126 PhanTypeMismatchProperty Assigning float to property but \monolog\handler\sockethandler::writingTimeout is int
-./src/Monolog/Handler/SocketHandler.php:218 PhanTypeMismatchArgumentInternal Argument 2 (seconds) is float but \stream_set_timeout() takes int
-./src/Monolog/Handler/SocketHandler.php:218 PhanTypeMismatchArgumentInternal Argument 3 (microseconds) is float but \stream_set_timeout() takes int
-./src/Monolog/Handler/SocketHandler.php:274 PhanTypeMismatchProperty Assigning resource to property but \monolog\handler\sockethandler::resource is null
-./src/Monolog/Handler/StreamHandler.php:65 PhanTypeMismatchProperty Assigning null to property but \monolog\handler\streamhandler::stream is resource|string
-./src/Monolog/Handler/StreamHandler.php:86 PhanTypeMismatchProperty Assigning null to property but \monolog\handler\streamhandler::stream is resource|string
-./src/Monolog/Handler/StreamHandler.php:105 PhanTypeMismatchProperty Assigning array|string to property but \monolog\handler\streamhandler::errorMessage is null
-./src/Monolog/Handler/SwiftMailerHandler.php:43 PhanSignatureMismatch Declaration of function send($content, array $records) should be compatible with function send(string $content, array $records) defined in ./src/Monolog/Handler/MailHandler.php:46
-./src/Monolog/Handler/SyslogUdp/UdpSocket.php:38 PhanTypeMismatchProperty Assigning null to property but \monolog\handler\syslogudp\udpsocket::socket is resource</code></pre>
- </section>
-<section id="phan4">
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">ChromePHPHandler.php:178 PhanTypeMismatchReturn Returning type int but headersAccepted() is declared to return bool</code></pre>
- <pre><code class="php" data-trim style="font-size:1em;">/**
- * Verifies if the headers are accepted by the current user agent
- *
- * @return Boolean
- */
-protected function headersAccepted() {
- if (empty($_SERVER['HTTP_USER_AGENT'])) {
- return false;
- }
- return preg_match('{\bChrome/\d+[\.\d+]*\b}', $_SERVER['HTTP_USER_AGENT']);
-}</code></pre>
- <img src="/presentations/slides/intro/preg_match.png" align="center" width="1050" height="170">
- </section>
-<section id="phan5">
- <pre><code class="shell nohighlight" data-trim style="font-size:1em;">FirePHPHandler.php:154 PhanTypeMismatchArgumentInternal Argument 1 (array_arg) is string but \current() takes array</code></pre>
- <pre><code class="php" data-trim style="font-size:1em;">/**
- * Base header creation function used by init headers & record headers
- *
- * @param array $meta Wildfire Plugin, Protocol & Structure Indexes
- * @param string $message Log message
- * @return array Complete header string ready for the client as key and message as value
- */
-protected function createHeader(array $meta, $message) {
- $header = sprintf('%s-%s', self::HEADER_PREFIX, join('-', $meta));
-
- return array($header => $message);
-}
-
-/**
- * Creates message header from record
- *
- * @see createHeader()
- * @param array $record
- * @return string
- */
-protected function createRecordHeader(array $record)
-{
- // Wildfire is extensible to support multiple protocols & plugins in a single request,
- // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake.
- return $this->createHeader(
- array(1, 1, 1, self::$messageIndex++),
- $record['formatted']
- );
-}
-
-/**
- * Creates & sends header for a record, ensuring init headers have been sent prior
- *
- * @see sendHeader()
- * @see sendInitHeaders()
- * @param array $record
- */
-protected function write(array $record)
-{
- if (!self::$sendHeaders) {
- return;
- }
-
- // WildFire-specific headers must be sent prior to any messages
- if (!self::$initialized) {
- self::$initialized = true;
-
- self::$sendHeaders = $this->headersAccepted();
- if (!self::$sendHeaders) {
- return;
- }
-
- foreach ($this->getInitHeaders() as $header => $content) {
- $this->sendHeader($header, $content);
- }
- }
-
- $header = $this->createRecordHeader($record);
- if (trim(current($header)) !== '') {
- $this->sendHeader(key($header), current($header));
- }
-}</code></pre>
- </section> </section>
- <section>
<section id="deploy">
<h1 style="text-align:center;">Let's deploy it!</h1>
</section>
diff --git a/expotec.xml b/expotec.xml
index c76a8fc..9ccc864 100644
--- a/expotec.xml
+++ b/expotec.xml
@@ -24,24 +24,21 @@
<slide>slides/intro/titlepage.xml</slide>
-<slide>slides/intro/php7_2016s.xml</slide>
+<slide>slides/intro/php7_speed.xml</slide>
<slide>slides/intro/php7_perf.xml</slide>
<slide>slides/intro/nov3/drupalbench.xml</slide>
<slide>slides/intro/nov3/wpbench.xml</slide>
-<slide>slides/intro/nov3/bbbench.xml</slide>
<slide>slides/intro/nov3/moodlebench.xml</slide>
<slide>slides/intro/nov3/wardrobebench.xml</slide>
<slide>slides/intro/smembase.xml</slide>
<slide>slides/intro/smemdrupal.xml</slide>
<slide>slides/intro/smemwp.xml</slide>
-<slide>slides/intro/smembb.xml</slide>
<slide>slides/intro/smemmoodle.xml</slide>
-<slide>slides/intro/smemwardrobe.xml</slide>
+<slide>slides/intro/php7_2016s.xml</slide>
<slide>slides/intro/bc7.xml</slide>
-<slide>slides/intro/phan.xml</slide>
<slide>slides/intro/deploy_2016.xml</slide>
<slide>slides/intro/php7prod.xml</slide>
diff --git a/slides/intro/php7_speed.xml b/slides/intro/php7_speed.xml
new file mode 100644
index 0000000..0169bcb
--- /dev/null
+++ b/slides/intro/php7_speed.xml
@@ -0,0 +1,11 @@
+<slide title="" section="php7_speed">
+
+<image filename="php7trans-200.png" />
+
+<blurb fontsize="1.1em" align="left">✔ engine improvements</blurb>
+<list>
+<bullet fontsize="1em">100%+ performance gain on most real-world applications</bullet>
+<bullet fontsize="1em">Lower memory usage, sometimes drastically lower</bullet>
+</list>
+
+</slide>