Req #54249 [Com]: extra CPU operation on each usage or E_* error types
Edit report at http://bugs.php.net/bug.php?id=54249&edit=1
ID: 54249
Comment by: Jared dot Williams at ntlworld 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:
See constant folding. http://en.wikipedia.org/wiki/Constant_folding
Previous Comments:
------------------------------------------------------------------------
[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)