Req #54249 [Bgs]: extra CPU operation on each usage or E_* error types

From: Date: Mon, 14 Mar 2011 22:49:23 +0000
Subject: Req #54249 [Bgs]: extra CPU operation on each usage or E_* error types
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-159474@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=54249&edit=1

 ID:                 54249
 User updated by:    amrnablus at gmail dot com
 Reported by:        amrnablus at gmail dot com
 Summary:            extra CPU operation on each usage or E_* error types
 Status:             Bogus
 Type:               Feature/Change Request
 Package:            Performance problem
 Operating System:   ALL
 PHP Version:        5.3.5
 Block user comment: N
 Private report:     N

 New Comment:

woops. Thanks guy, my bad.


Previous Comments:
------------------------------------------------------------------------
[2011-03-14 19:44:37] Jared dot Williams at ntlworld dot com

See constant folding. http://en.wikipedia.org/wiki/Constant_folding

------------------------------------------------------------------------
[2011-03-14 18:31:43] rasmus@php.net

I think you are missing a few pieces here on how compilers work. Yes,
there is a 
preprocessor, but there is also a precompiler. The assembly generated by
your 
example looks like this:

    movl    $1, %esi
    leaq    LC0(%rip), %rdi
    xorl    %eax, %eax
    leave
    jmp _printf

That says, put 1 into esi, then call printf. That 1 came from 1<<0L. The

precompiler is smart enough to notice that this is an absolute constant
here.

------------------------------------------------------------------------
[2011-03-14 18:03:24] amrnablus at gmail dot com

Description:
------------
the way the errors are defined in zend_errors.h file makes an extra
unneeded cpu shift (multiplication?) operation each time the error
constant is used.

clue:
this is is from zend_errors.h:
#define E_ERROR                         (1<<0L)
if you printf( "%d" , E_ERROR ) the pre-processor will replace this line
with
printf( "%d" , 1<<0L ) which will cause an uncalled for shit operation

Test script:
---------------
/*
this script will cause a php E_NOTICE to be used, notice the (minor)
diff in execution time when error definitions are changed
*/

error_reporting( E_ALL );
for( $i=0 ; $i<10000000; $i++ ) {
        echo $x['a'];
}

Expected result:
----------------
no change to the output is a must



------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=54249&edit=1


Thread (4 messages)

« previous php.bugs (#159474) next »