Hi again Dmitry, Well, that should get the main runtime optimization job done just as well. :-) I was just trying for more compile-time improvement also (it was definitely measurable with fake tests), especially for those not using an opcode cache, with no lookup needed for the 3 basic constants, and only one without lowercasing for others.
One other thing it looks like with your patch, to be careful of, is wrongly substituting SID (session id) like I mentioned in the previous message, or other case-insensitive constants that could match at compile time, to later be defined as case sensitive, which should have priority. Know what I mean? Thanks, Matt ----- Original Message ----- From: "Dmitry Stogov" Sent: Thursday, July 24, 2008 > I would propose the attached patch for this optimization. > > Opcode caches and encoders will have to disable this optimization with > ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION > > Any objections? > > Thanks. Dmitry. > > Matt Wilmas wrote: > > Hi Dmitry, > > > > ----- Original Message ----- > > From: "Dmitry Stogov" > > Sent: Thursday, July 24, 2008 > > > >> Hi Matt, > >> > >> Sorry if I missed it. > > > > No problem. :-) > > > >> Does this patch make any performance difference? > >> > >> I assume it saves on hash lookup during compilation and its really > >> insignificant time. However it add new scanner rules which may slowdown > >> the whole scanner. > >> For now I don't see a big reason, but may be I didn't see something. > > > > Yes, I tried to explain the differences in the original message (below). In > > runtime, FETCH_CONSTANT is saved for the "built-in, global constants" > > (CONST_PERSISTENT). During compilation, no hash lookup is needed for > > TRUE/FALSE/NULL since they are caught by the scanner, as you saw. The > > compile-time hash lookups were added when you eliminated runtime fetching > > for TRUE/FALSE/NULL a couple years ago, which has since been looking up the > > other built-in constants too and discarding them, so I just use them. :-) > > Also, right now if the constant isn't found (zend_get_ct_const()), there's > > lowercasing and a second lookup -- only for catching case-insensitive > > TRUE/FALSE/NULL! > > > > One thing I was wondering about is if this would cause a problem for opcode > > caches if they need to know it's really a "constant constant" and not a > > "literal constant." If so, can probably have a compiler_options flag to > > disable my compile-time substitution, and the opcode cache can do what it > > wants (substitution with own optimizer, etc.). > > > >> Do you have any other "postponed" patches? > >> I remember something about string optimizations and long multiply. > > > > Yeah. :-) The multiply long one [1] is a pretty small thing that probably > > should be reviewed for a decision (MM's safe_address() function especially), > > though it does speed up mul_function() (* operator) on more platforms. > > > > The "string changes/optimizations" patch [2] is mostly fine, I think. Just > > wondering if it's OK to remove the INIT_STRING opcode. BTW, it has changes > > that make the scanner simpler/smaller if you're concerned about the > > constants patch adding a few rules. ;-D > > > > [1] http://marc.info/?l=php-internals&m=121630449331340&w=2 > > [2] http://marc.info/?l=php-internals&m=121569400218314&w=2 > > > >> Thanks. Dmitry. > >> > > > > Thanks, > > Matt > > > > > >> Matt Wilmas wrote: > >>> Hi all, > >>> > >>> Never heard anything about this optimization after sending it 3 months > > ago > >>> (should've sent a follow-up sooner)... > >>> > >>> Is this something that can be done? Dmitry? Details in original > > message. > >>> Patch is unchanged, I just updated them for the current file versions. > >>> > >>> http://realplain.com/php/const_ct_optimization.diff > >>> http://realplain.com/php/const_ct_optimization_5_3.diff > >>> > >>> > >>> Thanks, > >>> Matt > >>> > >>> > >>> ----- Original Message ----- > >>> From: "Matt Wilmas" > >>> Sent: Friday, April 18, 2008 > >>> > >>>> Hi all, > >>>> > >>>> I changed things so that the many "built-in" constants > > (CONST_PERSISTENT > >>>> ones) will be replaced at compile-time, saving the FETCH_CONSTANT > > opcode, > >>> if > >>>> these changes are usable. This was added for TRUE/FALSE/NULL 2 years > > ago, > >>>> but seems like it can be done for "lots" of others too. > >>>> > >>>> Since the change 2 years ago, other constants have been getting looked > > up > >>>> also, but just discarded. And if a constant wasn't found, its name was > >>>> lowercased and looked up again (for case-insensitive TRUE/FALSE/NULL). > >>>> Lowercasing has been removed, since case-insensitive constants can't be > >>> done > >>>> (guess an exception was made for TRUE/FALSE/NULL :-)), and > > TRUE/FALSE/NULL > >>>> get flagged in the scanner (not reserved words, which Marcus did > > briefly a > >>>> few years ago), skipping a hash lookup. BTW, to get this compile-time > >>>> optimization in a namespace, it needs to be prefixed (::CONSTANT). > >>>> > >>>> I also removed an unnecessary memcmp() in zend_get_constant() -- old > > code > >>>> that was needed a long time ago, it appears. > >>>> > >>>> http://realplain.com/php/const_ct_optimization.diff > >>>> http://realplain.com/php/const_ct_optimization_5_3.diff > >>>> > >>>> Thoughts? > >>>> > >>>> > >>>> Thanks, > >>>> Matt > > > ---------------------------------------------------------------------------- ---- > Index: Zend/zend_compile.c > =================================================================== > RCS file: /repository/ZendEngine2/zend_compile.c,v > retrieving revision 1.647.2.27.2.41.2.74 > diff -u -p -d -r1.647.2.27.2.41.2.74 zend_compile.c > --- Zend/zend_compile.c 24 Jul 2008 11:47:49 -0000 1.647.2.27.2.41.2.74 > +++ Zend/zend_compile.c 24 Jul 2008 14:40:12 -0000 > @@ -3804,6 +3804,12 @@ static zend_constant* zend_get_ct_const( > if (c->flags & CONST_CT_SUBST) { > return c; > } > + if (!CG(current_namespace) && > + !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) && > + Z_TYPE(c->value) != IS_CONSTANT && > + Z_TYPE(c->value) != IS_CONSTANT_ARRAY) { > + return c; > + } > return NULL; > } > /* }}} */ > @@ -5169,12 +5175,14 @@ void zend_do_use(znode *ns_name, znode * > void zend_do_declare_constant(znode *name, znode *value TSRMLS_DC) /* {{{ */ > { > zend_op *opline; > + zend_constant *c; > > if(Z_TYPE(value->u.constant) == IS_CONSTANT_ARRAY) { > zend_error(E_COMPILE_ERROR, "Arrays are not allowed as constants"); > } > > - if (zend_get_ct_const(&name->u.constant TSRMLS_CC)) { > + c = zend_get_ct_const(&name->u.constant TSRMLS_CC); > + if (c && (c->flags & CONST_CT_SUBST)) { > zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", Z_STRVAL(name->u.constant)); > } > > Index: Zend/zend_compile.h > =================================================================== > RCS file: /repository/ZendEngine2/zend_compile.h,v > retrieving revision 1.316.2.8.2.12.2.27 > diff -u -p -d -r1.316.2.8.2.12.2.27 zend_compile.h > --- Zend/zend_compile.h 24 Jul 2008 11:47:49 -0000 1.316.2.8.2.12.2.27 > +++ Zend/zend_compile.h 24 Jul 2008 14:40:13 -0000 > @@ -762,6 +762,9 @@ END_EXTERN_C() > /* generate ZEND_DECLARE_INHERITED_CLASS_DELAYED opcode to delay early binding */ > #define ZEND_COMPILE_DELAYED_BINDING (1<<4) > > +/* disable constant substitution at compile-time */ > +#define ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION (1<<5) > + > /* The default value for CG(compiler_options) */ > #define ZEND_COMPILE_DEFAULT ZEND_COMPILE_HANDLE_OP_ARRAY > > -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php