Hi,
I'm glad to present the result of my recent work - Inheritance Cache.
https://github.com/php/php-src/pull/6627
This is a new transparent technology that eliminates overhead of PHP class
inheritance.
PHP classes are compiled and cached (by opcahce) separately, however their
"linking" was done at run-time - on each request. The process of "linking"
may involve a number of compatibility checks and borrowing
methods/properties/constants form parent and traits. This takes significant
time, but the result is the same on each request.
Inheritance Cache performs "linking" for unique set of all the depending
classes (parent, interfaces, traits, property types, method types involved
into compatibility checks) once and stores result in opcache shared memory.
As a part of the this patch, I removed limitations for immutable classes
(unresolved constants, typed properties and covariant type checks). So now
all classes stored in opcache are "immutable". They may be lazily loaded
into process memory, if necessary, but this usually occurs just once (on
first linking).
The patch shows 8% improvement on Symphony "Hello World" app.
I'm going to merge this patch into master on next week.
Please review and give your comments.
Thanks. Dmitry.
Hi,
I'm glad to present the result of my recent work - Inheritance Cache.
https://github.com/php/php-src/pull/6627
This is a new transparent technology that eliminates overhead of PHP class
inheritance.PHP classes are compiled and cached (by opcahce) separately, however their
"linking" was done at run-time - on each request. The process of "linking"
may involve a number of compatibility checks and borrowing
methods/properties/constants form parent and traits. This takes significant
time, but the result is the same on each request.Inheritance Cache performs "linking" for unique set of all the depending
classes (parent, interfaces, traits, property types, method types involved
into compatibility checks) once and stores result in opcache shared memory.
As a part of the this patch, I removed limitations for immutable classes
(unresolved constants, typed properties and covariant type checks). So now
all classes stored in opcache are "immutable". They may be lazily loaded
into process memory, if necessary, but this usually occurs just once (on
first linking).The patch shows 8% improvement on Symphony "Hello World" app.
I'm going to merge this patch into master on next week.
Please review and give your comments.Thanks. Dmitry.
Hi Dmitry, that sounds awesome, congrats for this work!
If I understand correctly, this only offers performance improvements when
the classes are not preloaded, and thus closes a bit the gap between
preloading on & off?
— Benjamin
Hey Dmitry
Out of curiousity: how does this compare to preloading? From what I understand preloading also links classes, which was one of the most important differences between preloading files and simply storing them in opcache. Does this change mean that preloading becomes much less relevant since class linking can now also happen at runtime?
Kind regards
Brent
Hi,
I'm glad to present the result of my recent work - Inheritance Cache.
https://github.com/php/php-src/pull/6627
This is a new transparent technology that eliminates overhead of PHP class
inheritance.PHP classes are compiled and cached (by opcahce) separately, however their
"linking" was done at run-time - on each request. The process of "linking"
may involve a number of compatibility checks and borrowing
methods/properties/constants form parent and traits. This takes significant
time, but the result is the same on each request.Inheritance Cache performs "linking" for unique set of all the depending
classes (parent, interfaces, traits, property types, method types involved
into compatibility checks) once and stores result in opcache shared memory.
As a part of the this patch, I removed limitations for immutable classes
(unresolved constants, typed properties and covariant type checks). So now
all classes stored in opcache are "immutable". They may be lazily loaded
into process memory, if necessary, but this usually occurs just once (on
first linking).The patch shows 8% improvement on Symphony "Hello World" app.
I'm going to merge this patch into master on next week.
Please review and give your comments.Thanks. Dmitry.
Hi Brent,
Preloading had intention to completely eliminate opcache overhead, but
because of limitations it wasn't able to preload classes with unresolved
constants, typed properties and covariant checks.
This PR makes these preloading limitations less strict and adds transparent
inheritance cache. Inheritance cache eliminates only part of redundancy, in
comparison to preloading. It should be a bit slower, but it will work out
of the box.
Thanks. Dmitry.
Hey Dmitry
Out of curiousity: how does this compare to preloading? From what I
understand preloading also links classes, which was one of the most
important differences between preloading files and simply storing them in
opcache. Does this change mean that preloading becomes much less relevant
since class linking can now also happen at runtime?Kind regards
BrentHi,
I'm glad to present the result of my recent work - Inheritance Cache.
https://github.com/php/php-src/pull/6627
This is a new transparent technology that eliminates overhead of PHP
class
inheritance.PHP classes are compiled and cached (by opcahce) separately, however
their
"linking" was done at run-time - on each request. The process of
"linking"
may involve a number of compatibility checks and borrowing
methods/properties/constants form parent and traits. This takes
significant
time, but the result is the same on each request.Inheritance Cache performs "linking" for unique set of all the depending
classes (parent, interfaces, traits, property types, method types
involved
into compatibility checks) once and stores result in opcache shared
memory.
As a part of the this patch, I removed limitations for immutable classes
(unresolved constants, typed properties and covariant type checks). So
now
all classes stored in opcache are "immutable". They may be lazily loaded
into process memory, if necessary, but this usually occurs just once (on
first linking).The patch shows 8% improvement on Symphony "Hello World" app.
I'm going to merge this patch into master on next week.
Please review and give your comments.Thanks. Dmitry.