Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:67026 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 92032 invoked from network); 10 Apr 2013 13:17:08 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 10 Apr 2013 13:17:08 -0000 Authentication-Results: pb1.pair.com smtp.mail=florinpatan@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=florinpatan@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.219.42 as permitted sender) X-PHP-List-Original-Sender: florinpatan@gmail.com X-Host-Fingerprint: 209.85.219.42 mail-oa0-f42.google.com Received: from [209.85.219.42] ([209.85.219.42:59263] helo=mail-oa0-f42.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id A9/A0-21449-25665615 for ; Wed, 10 Apr 2013 09:17:07 -0400 Received: by mail-oa0-f42.google.com with SMTP id i18so421843oag.29 for ; Wed, 10 Apr 2013 06:17:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=EIpMagDBKY+/BHreSsRJGg9yoNKZdZzCqqrlo+OceYU=; b=LiD+S2JP9bTq+RVHCuZGY62alFAUJbgldaMSVE/Arb4cQiAdV52lnikMJNNqQleNzc v4X5LnjnKr0KTP7SE3B2hYRAWzHQlurKwCd5KoMjkEKZ8XeOZF8Ew2032S1/+OnG4OtZ RSqR/r+3+l46XGP8K8flXzzA9OyQb/fuEO2nfBZC1l4fa9ES7KgImvxa2gGvzJFCPF60 Y15jus7W3q2xOnQbA2UtotWH9iaPEJs6plcTJz6KIUIqz52vilZbmXUbDRxfU+QH4sxH BOAkGyAt5y05ZwgLeogGmWdwQzjB4anwdY4rVHYYFUXX5LtHxHGaHQ97TPUggoSNcxkD BZkg== X-Received: by 10.60.15.137 with SMTP id x9mr716791oec.7.1365599824658; Wed, 10 Apr 2013 06:17:04 -0700 (PDT) MIME-Version: 1.0 Received: by 10.76.141.115 with HTTP; Wed, 10 Apr 2013 06:16:34 -0700 (PDT) In-Reply-To: References: Date: Wed, 10 Apr 2013 16:16:34 +0300 Message-ID: To: Arvids Godjuks Cc: PHP Internals Content-Type: text/plain; charset=UTF-8 Subject: Re: [PHP-DEV] OPcache optimizer improvement in PHP-5.5? From: florinpatan@gmail.com (Florin Patan) >On Wed, Apr 10, 2013 at 4:07 PM, Arvids Godjuks wrote: > 2013/4/10 Dmitry Stogov > >> Hi, >> >> Recently, I've found that OPcache optimizer misses a lot of abilities, >> because it handles only one op_array at once. So it definitely can't >> perform any inter-function optimizations (e.g. inlining). >> >> Actually, it was not very difficult to switch to "script at once" approach. >> The attached patch demonstrates it and adds per script constants >> substitution explained in the following script >> >> > define("FOO", 1); >> function foo() { >> echo FOO . "\n"; // optimizer will replace it with: echo "1\n"; >> } >> ?> >> >> Of course, I ran the PHP test suite and it passed all the same tests. >> Personally, I think it's safe to include this patch into 5.5 and make a >> green light to some other advanced optimizations in 5.5. (e.g. conversion >> INIT_FCALL_BY_NAME into DO_FCALL). >> >> Any thoughts? >> >> Thanks. Dmitry. >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >> > > > Hi! > > Many obvious optimizations are not used due to the fact, that script > translation into opcode state has to be fast. The nature of PHP dictated > that and this was re-iterated countless times on this mailing list by the > core developers. > > To do advanced stuff, you have to create some sort of pre-compile or > storing that compiled code reliably on disk so that if memory cache is > dropped or restart is done, there is no significant preformance hit while > all the code compiles into optimized opcode again. > > I would also imagine that good part of the optimizations would require > multiple files to be processed and optimized, but due to dynamic nature of > the PHP opcode compilation is done on per-file basis, so do the > optimizations. > > It's very commendable that you want to push optimizations and stuff, but > there are some fundamental stuff that needs to be cared of to do some > really good stuff. > > My 0.02$ Hello, If applying optimizations in multiple passes would be a problem for speed, especially on the first request, then maybe a way to solve this would be to have a configurable variable like: opcache.passes which is between 1 and 10 (lets say) and then have the engine do something like this: - load the file, compile it and apply a first round of 'quick' optimizations for the first time and mark it as passed once; - next request, load the compiled version, apply another round of optimization then mark it as a second pass - repeat the above step until the optimization passes in the said file = opcache.passes value This way only the initial requests will be affected by this but in a way that the hit on those requests is smaller that applying all the steps at once. I'm really not sure if it's that easy to implement but 'on paper' this could be the way to solve it imho. What do you think, does it make sense? Best regards ---- Florin Patan https://github.com/dlsniper http://www.linkedin.com/in/florinpatan