Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92060 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 48326 invoked from network); 1 Apr 2016 08:36:04 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 1 Apr 2016 08:36:04 -0000 Authentication-Results: pb1.pair.com smtp.mail=cornelius.howl@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=cornelius.howl@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.218.51 as permitted sender) X-PHP-List-Original-Sender: cornelius.howl@gmail.com X-Host-Fingerprint: 209.85.218.51 mail-oi0-f51.google.com Received: from [209.85.218.51] ([209.85.218.51:32949] helo=mail-oi0-f51.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 68/50-42107-2F23EF65 for ; Fri, 01 Apr 2016 03:36:03 -0500 Received: by mail-oi0-f51.google.com with SMTP id d205so96338859oia.0 for ; Fri, 01 Apr 2016 01:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc; bh=yLxBPpDGsDYeM8y4hMq8wDbT9Wswmu2zqSLO8fcl16o=; b=UxBFbjlmNc28w/kbd1593lR0DUPRUybO7tO0+NWfzDpDT3+sHmWPrI+8OA/D+dQ6pn eDsCUlhCR2DLz5VWWdbnwZeSr1b5kIATCfUvlme4PrdX4iF9ml+f6JPdQtqV0kHf1xDu L7Mc/fkwCiBke8iyivIq62BatikU7kuoQkhwqznO+6HqrVCp6yCGt9ZrhGTlKbBGPa2m 4acF7q+4syenc4WHP8dgEMP56GHxUMZ41kGHvTl5pAuFYgF7/l7qoWzb/qfCt9QtkT5A 9b2ku9aKMxKPQrz81XQeHzPWLDsglp+GQMBVqsD6AaaJDFbhL5GTPa/7FeTggX/+nuGk LgBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc; bh=yLxBPpDGsDYeM8y4hMq8wDbT9Wswmu2zqSLO8fcl16o=; b=T/yW1dMZw1Rnc7LVhm6DcipSvJOULudLa28qaAZZJPZdsT94Qr2TyvV6WYtnAxZVCD xa+//a1fGAP4MCt4tKy8eN0KVFSKDF3Umx+CExEY+esQN+w3dOreykfototOlEJpKDAY 6lAEwdLFGqcqUxdRI/8/Cb3NCmyS/DLrHN6n46r5gIPn6iKOrXUl2sExX3dLxpDbF/k5 iIasP/ZFhVBPmfZYEXJkG99VNMFbB5ADGUBg5o7WbOFxYMiqso9oJIy/QL5tY4Jo+v3S pHXjQILNSVpzu/R2WCKU4sKb+g71W8OljiTg2ifNJ7lOVZqZ8fserJWGYJKol42A5+15 uStg== X-Gm-Message-State: AD7BkJLNCYsuA/H9U2TR6990CNnNqCACMnGamhWirXwzcoDVwCMh80YKt0dbcNhBibGtE8jC2VjgZfOorYGRUQ== MIME-Version: 1.0 X-Received: by 10.202.197.66 with SMTP id v63mr1921251oif.23.1459499759810; Fri, 01 Apr 2016 01:35:59 -0700 (PDT) Received: by 10.157.7.194 with HTTP; Fri, 1 Apr 2016 01:35:59 -0700 (PDT) Date: Fri, 1 Apr 2016 16:35:59 +0800 Message-ID: To: Dmitry Stogov Cc: internals , Xinchen Hui , Nikita Popov Content-Type: multipart/alternative; boundary=001a113e4d62bbbe5d052f6844fd Subject: Re: [PHP-DEV] Object getter method optimization From: cornelius.howl@gmail.com (Lin Yo-An) --001a113e4d62bbbe5d052f6844fd Content-Type: text/plain; charset=UTF-8 Hi Dmitry, Nikita, Andrea My implementation now is able to get the property offset and fetch object property directly without invoking zend_std_read_property and pushing new call frame onto the stack. The current behavior: 1. In compile-time, the pass_two() function now marks the getter functions in op_array.accessor.type 2. When Zend Engine first time attempt to read the property, it saves the property offset in the accessor field and mark the method as a "getter". 3. When Zend Engine second time invoke the getter method, it checks the accessor field and try to read the property value directly instead a "method call" The implementation did some change: 1. Added accessor struct to op_array to save "accessor" related information (getter or setter, property offset) 2. Added two statement in zend_std_read_property to save property offset. 3. Added op code check in zend_compile (The pass_two() function) to mark a function is a getter) But now I encountered a problem, I can't store the result value in INIT_METHOD_CALL op, the result var is only available in DO_FCALL_* I have an idea for solving this, but I'm not sure if it's good or not: If DO_FCALL_* will always follow a INIT_METHOD_CALL, then I think we can store result var from the next op (DO_FCALL) and skip DO_FCALL directly. Would be great if I can have your advices and suggestion. :-) Thanks, Yo-An Lin On Tue, Mar 22, 2016 at 4:45 PM, Dmitry Stogov wrote: > Hi Yo-An Lin, > > > This "run-time inlining" approach may work. > > > PHP compiler (or optimizer) may mark functions and methods suitable for > "run-time" inlining (e.g. methods without arguments and FETCH_OBJ_R UNUSED, > CONST -> TMP; RETURN TMP). > > Then INIT_METHOD_CALL may check this flag and execute "optimized code > sequence" instead of pushing stack frame and real call. > > > However, I'm not sure what kind of performance impact this may make, > because we will have to make additional check on each INIT_METHOD_CALL > execution. > > > Thanks. Dmitry. > > > ------------------------------ > *From:* Lin Yo-An > *Sent:* Saturday, March 19, 2016 10:08 > *To:* Dmitry Stogov > *Cc:* internals; Xinchen Hui > *Subject:* Re: [PHP-DEV] Object getter method optimization > > Hi Dmitry, > > > Thanks for your reply! You're correct. let me try to explain your points: > > If I have a main.php and worker.php > > And I defined work($worker) { $status = $worker->getStatus(); } inside > main.php > > when main.php is compiled, we don't know what the class entry of $worker > is. What we only know is invoking a method "getStatus" on $worker CV unless > we know we have to compile worker.php before main.php and add a type hint > on $worker. > > Is it correct? > > > Since the original approach doesn't work, here comes another new idea: > > When executing method call on an object, if we found the method body are > just 2 op codes (FETCH_OBJ_R and RETURN), we then denote the method is a > "getter method" > > And the next time, when we execute the same method, we found the "getter > method" flag, we simply execute FETCH_OBJ_R on that object and return the > value to avoid extra op code execution time. > > Do you think if this could work? > > > > > Best Regards and Thanks for your work on PHP VM > Yo-An Lin > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Mar 18, 2016 at 3:36 PM, Dmitry Stogov wrote: > >> Hi Yo-An Lin, >> >> Unfortunately, this approach won't work. >> At first, at compile time we don't know the body of called getter. >> At second, the called method might be changed even at run-time, because >> of polymorphism. >> >> Tricks like this might be implemented using JIT and polymorphic inline >> caches. >> >> Thanks. Dmitry. >> >> ________________________________________ >> From: Lin Yo-An >> Sent: Friday, March 18, 2016 05:23 >> To: internals >> Subject: [PHP-DEV] Object getter method optimization >> >> Hello Everyone, >> >> >> I am recently trying to write an optimizer that could optimize the getter >> method call into just one object fetch opcode. >> >> I'd like to know thoughts from you guys, here is the note: >> https://c9s.hackpad.com/INLINE-OP-TVGo9WcshbZ >> >> -- >> Best Regards, >> >> Yo-An Lin >> https://github.com/c9s >> > > > > -- > Best Regards, > > Yo-An Lin > -- Best Regards, Yo-An Lin --001a113e4d62bbbe5d052f6844fd--