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 &lt; 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 &gt; /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 &lt; 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 &gt; /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 &lt;filename&gt;
-  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 &lt;directory&gt;
-  A directory to recursively read PHP files from to analyze
-
- -3, --exclude-directory-list &lt;dir_list&gt;
-  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 &lt;mode&gt;, --output-mode
-  Output mode from 'text', 'json', 'codeclimate', or 'checkstyle'
-
- -o, --output &lt;filename&gt;
-  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 -&gt; PHP 7 BC issues
-
- -i, --ignore-undeclared
-  Ignore undeclared functions and classes
-
- -y, --minimum-severity &lt;level in {0,5,10}&gt;
-  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 &lt;int&gt;
-  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-&gt;pres-&gt;\\1', $text);</code></pre>
-		<pre><code data-trim style="font-size:1em;">echo preg_replace_callback(
-    '/:-:(.*?):-:/', 
-    function($matches) {
-      return $this-&gt;pres-&gt;$matches[1]; // Oops!
-    },
-    $text);</code></pre>
-		<pre><code data-trim style="font-size:1em;">echo preg_replace_callback(
-    '/:-:(.*?):-:/', 
-    function($matches) {
-      return $this-&gt;pres-&gt;{$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 &gt; 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 &amp; record headers
- *
- * @param  array  $meta    Wildfire Plugin, Protocol &amp; 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 =&gt; $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 &amp; plugins in a single request,
-    // but we're not taking advantage of that (yet), so we're using &quot;1&quot; for simplicity's sake.
-    return $this-&gt;createHeader(
-        array(1, 1, 1, self::$messageIndex++),
-        $record['formatted']
-    );
-}
-
-/**
- * Creates &amp; 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-&gt;headersAccepted();
-        if (!self::$sendHeaders) {
-            return;
-        }
-
-        foreach ($this-&gt;getInitHeaders() as $header =&gt; $content) {
-            $this-&gt;sendHeader($header, $content);
-        }
-    }
-
-    $header = $this-&gt;createRecordHeader($record);
-    if (trim(current($header)) !== '') {
-        $this-&gt;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>