Hi,
The attached patch modifies internal ZE data structures.
It gives 4% less heap memory usage on waiting PHP process (2210KB
instead of 2304KB) and up to 7% improvement on applications with many
classes (ZendFramework benchmark uses 17.7M instead of 19M). It also
makes small speedup on some big applications with opcode caches, because
of less memory transfer.
The patch performs the following optimizations:
-
zend_function.pass_rest_by_reference is replaced by
ZEND_ACC_PASS_REST_BY_REFERENCE in zend_function.fn_flags -
zend_function.return_reference is replaced by
ZEND_ACC_RETURN_REFERENCE in zend_function.fn_flags -
zend_arg_info.required_num_args removed. it was needed only for
internal functions. Now the first arg_info for internal function (which
has special meaning) is represented by zend_internal_function_info
structure. -
zend_op_array.size, size_var, size_literal, current_brk_cont,
backpatch_count moved into CG(context), because they are used only
during compilation. -
zend_op_array.start_op is moved into EG(start_op), because it's used
only for 'interactive' execution of single top-level op-array. -
zend_op_array.done_pass_two is replaced by ZEND_ACC_DONE_PASS_TWO in
zend_op_array.fn_flags. -
the sise of op_array.vars is reduced during pass_two.
-
zend_class_entry.constants_updated is replaced by
ZEND_ACC_CONSTANTS_UPDATED in zend_class_entry.ce_flags -
The size of zend_class_entry is reduced by sharing the same memory
space by different information for internal and user classes. See
zend_class_inttry.info union.
Of course the patch will affect some extensions (e.g. APC and xdebug),
but it shouldn't be difficult to fix them.
I'm going to commit the patch by the end of this week in case of no
objections. I'll also add corresponding notes into UPGRADING.INTERNALS.
Thanks. Dmitry.