On 24/10/2019 13:47, Rowan Tommins wrote:
The simpler idea I had in this area was caching what type checks a value
had passed, either on each zval or perhaps just at the class level, so that
checking the same type again would be much faster, even if it was a complex
union with multiple interfaces.

Last night I was playing about with caching the last passed interface as part of the instanceof_function.

https://gist.github.com/marandall/38d7dba6600889d897f2c8fc57532f31

When used in the likes of loops which are performing the same check over and over, it yields about a 18% increase when using a 3 layer deep nested interface.

It currently just stores a cache of the last match in the class entry so it would hit as many uses as possible.

For T_INSTANCEOF it could potentially use an extended cache slot to store a reference to it (would need expanding out into a separate struct as the cache slot is already used for converting the static name to a ce).

I'm less clear about how we could handle it for everything else, like parameter type validation. The underlying implementation already seems pretty well optimized so I'm not sure where a performance penalty is to be found.

--
Mark Randall

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to