Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:67298 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 82102 invoked from network); 4 May 2013 13:47:02 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 4 May 2013 13:47:02 -0000 Authentication-Results: pb1.pair.com header.from=ircmaxell@gmail.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=ircmaxell@gmail.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.212.54 as permitted sender) X-PHP-List-Original-Sender: ircmaxell@gmail.com X-Host-Fingerprint: 209.85.212.54 mail-vb0-f54.google.com Received: from [209.85.212.54] ([209.85.212.54:64433] helo=mail-vb0-f54.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id B5/6C-26044-45115815 for ; Sat, 04 May 2013 09:47:00 -0400 Received: by mail-vb0-f54.google.com with SMTP id f12so2036105vbg.13 for ; Sat, 04 May 2013 06:46:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type; bh=Xt/IaZI8z9MJYC3SoagtCpyESYrlzb4esHFFhnnS6no=; b=scXIka8VypblvR8wbD2yUeNsdZACm2nQWIppOEkhLS8Ml6DeP89ajbtewIi+FmOpp6 W000TAir/HD1jpQbpcmPecHqc6DZe/3EHZ1/Y/cLuEIKpy1LqvdBjS8tDALgbiujSznb PrVvgJdJGAhbTp7A2OfrhRMngdinobCNSFTJkUYfMTlfTGK3RAKGM7/VR4MEzEyh95a4 paqCKUilBcapsD18M4BfLv/v+dn+i9qZaEPfzlw/BsTw767TV0C75GiSfahjjtsJ2WYO 434BeJTqET6Ag9BvzrHUbkMI0NKLelxsnZwu3Yow5Rvxj3kUnfJxXbOKhSkpQoD9CfbZ N93g== MIME-Version: 1.0 X-Received: by 10.58.144.133 with SMTP id sm5mr4885425veb.23.1367675217690; Sat, 04 May 2013 06:46:57 -0700 (PDT) Received: by 10.58.156.103 with HTTP; Sat, 4 May 2013 06:46:57 -0700 (PDT) In-Reply-To: References: Date: Sat, 4 May 2013 09:46:57 -0400 Message-ID: To: Laruence Cc: Nikita Popov , PHP Internals Content-Type: multipart/alternative; boundary=047d7b675b2684c93a04dbe4b384 Subject: Re: [PHP-DEV] Re: [PROPOSAL]Add second to callback of preg_replace_callback From: ircmaxell@gmail.com (Anthony Ferrara) --047d7b675b2684c93a04dbe4b384 Content-Type: text/plain; charset=ISO-8859-1 Laruence, > foreach ($replacements as $regex => $callback) { > > $str = preg_replace_callback($regex, $callback, $str); > > } > > > > So if there are 10 regex in the array, you will got 10 DO_FCALL. 10 times > arguments accept, 10 times etc... > > and AS I already said: IT is inefficient. I personally can not accept it. > > thanks > > My initial reaction was that the difference in runtime is going to be so insignificant that it's the very definition of a micro-optimization between the two. And unless you're doing it millions of times in a hot-loop, it's never even going to be realized. I was going to reply to that effect. Then I decided to write a quick test. $count = 100; $start = microtime(true); for ($i = 0; $i < $count; $i++) { $str = "abc"; $str = preg_replace_callback('/a/', function($a) { return strtoupper($a[0]); }, $str); $str = preg_replace_callback('/b/', function($a) { return strtoupper($a[0]); }, $str); $str = preg_replace_callback('/c/', function($a) { return strtoupper($a[0]); }, $str); $str = preg_replace_callback('/a/', function($a) { return strtolower($a[0]); }, $str); $str = preg_replace_callback('/b/', function($a) { return strtolower($a[0]); }, $str); $str = preg_replace_callback('/c/', function($a) { return strtolower($a[0]); }, $str); } echo "Completed in " . (microtime(true) - $start) . " Seconds\n"; $start = microtime(true); for ($i = 0; $i < $count; $i++) { $str = "abc"; $str = preg_replace(array( '/a/e', '/b/e', '/c/e', '/a/e', '/b/e', '/c/e', ), array( 'strtoupper(\'$1\')', 'strtoupper(\'$1\')', 'strtoupper(\'$1\')', 'strtolower(\'$1\')', 'strtolower(\'$1\')', 'strtolower(\'$1\')', ), $str ); } echo "Completed in " . (microtime(true) - $start) . " Seconds\n"; So basically, it's comparing the old behavior (one call to preg_replace) that you want to emulate, with what Nikita is suggesting. I ran it on 3v4l (http://3v4l.org/dRjtU) and the results were quite surprising. I was expecting the first to be slightly slower than the second. But the reality surprised me: Completed in 0.00076389312744141 Seconds Completed in 0.0012428760528564 Seconds As it turns out, calling preg_replace_callback() multiple times is almost 50% faster than using a single call to preg_replace(). It's likely due to the precompiled nature of closures, vs the compilation happening multiple times at invocation in the preg_replace /e case. But it's still worth noting that switching from the /e style to a more traditional preg_replace_callback implementation will get you a significant boost in performance of that. Now, keep in mind, we're talking 0.000005 seconds saved per "execution" (group of 6 replacements). So it's not likely to matter much or be worth worrying about... My $0.02 at least... Anthony --047d7b675b2684c93a04dbe4b384--