Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:67300 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 86000 invoked from network); 4 May 2013 14:28:34 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 4 May 2013 14:28:34 -0000 Authentication-Results: pb1.pair.com smtp.mail=laruence@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=laruence@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.217.175 as permitted sender) X-PHP-List-Original-Sender: laruence@gmail.com X-Host-Fingerprint: 209.85.217.175 mail-lb0-f175.google.com Received: from [209.85.217.175] ([209.85.217.175:42831] helo=mail-lb0-f175.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id B1/2D-26044-01B15815 for ; Sat, 04 May 2013 10:28:33 -0400 Received: by mail-lb0-f175.google.com with SMTP id w20so2291580lbh.20 for ; Sat, 04 May 2013 07:28:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:mime-version:sender:in-reply-to:references:from:date :x-google-sender-auth:message-id:subject:to:cc:content-type; bh=QBEQ1CM7MxlIi7u+ehd5sb1ese3o785jXautphOJmEk=; b=qqbj9HkwXKkA6oG8yE/Hty+YMjEHNbmzfxjoOzMcmYb/rvWKGKNiJy500FYqWibstu OBrDfrSAHVGBEC0Y+0vijvp8H+7N2Rx2Y0qO+7f0LGq/K3MgYIY/ZNz5vsyL+muYQBll 4ZsI84eD4dTWQ3idLy9RNHL/qndG+fGAXNQkAgCeUkqIqg2iqopE6EWCPByGinSiQc8b 0tuUWgs4vV09z5xSbV79oigH3xxrCdrN73NYnrd1D0FUpnZLixknqiCzwYqd/IVzz2i8 XBrSSNGpiQRCaMANmZnG/AOBkUB78AnLbP3lxFxkBODBBNIu0uCX8mphUoA3X8jDJRBX SFEw== X-Received: by 10.152.26.195 with SMTP id n3mr2876773lag.32.1367677709191; Sat, 04 May 2013 07:28:29 -0700 (PDT) MIME-Version: 1.0 Sender: laruence@gmail.com Received: by 10.114.11.129 with HTTP; Sat, 4 May 2013 07:28:09 -0700 (PDT) In-Reply-To: References: Date: Sat, 4 May 2013 22:28:09 +0800 X-Google-Sender-Auth: dlA-kXFFqeGagi8-KnOYbVfnFGA Message-ID: To: Anthony Ferrara Cc: Nikita Popov , PHP Internals Content-Type: multipart/alternative; boundary=089e0160b9d206131f04dbe54894 Subject: Re: [PHP-DEV] Re: [PROPOSAL]Add second to callback of preg_replace_callback From: laruence@php.net (Laruence) --089e0160b9d206131f04dbe54894 Content-Type: text/plain; charset=UTF-8 On Sat, May 4, 2013 at 9:46 PM, Anthony Ferrara wrote: > 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... > Hey: thanks for the benchmark, but please don't think it's useless just because it's monior PHP is a web program language, let's think about a high trafiic site, which get 100, 000, 000 pv perday. 100, 000, 000 * 0.0000005 = 500s perday and inefficent not always means performance only, in this case , you need to define various functions for different regexs if you use loop style. and do you prefer array_walk or foreach when you try to iteraterly process an array? thanks > > My $0.02 at least... > > Anthony > -- Laruence Xinchen Hui http://www.laruence.com/ --089e0160b9d206131f04dbe54894--