Re: State of Generics and Collections

From: Date: Fri, 23 Aug 2024 14:13:19 +0000
Subject: Re: State of Generics and Collections
References: 1 2  Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
On Fri, Aug 23, 2024, at 4:58 AM, Kévin Dunglas wrote:
> Thanks for sharing this research work.
>
> Instead of having to choose between fully reified generics and erased 
> type declarations, couldn't we have both? A new option in php.ini could 
> allow to enable the “erased” mode as a performance, production-oriented 
> optimization.
> In development, and on projects where performance isn't critical, types 
> (including generics) will be enforced at runtime, but users will have 
> the option of opting to disable these checks for production 
> environments.

Strictly speaking, yes, a disabled-types mode could be made regardless of what happens with
generics.  But the downsides of that approach remain the same.  I'm personally against type
erasure generally, in large part because I don't know what it would break in terms of
reflection, and in part because I *know* people will turn it off for dev, too, and then end up
writing buggier code.

> If this is not possible, the inline caches presented in the article, 
> combined with “worker” runtimes such as FrankenPHP, Swoole, RoadRunner, 
> etc., could make the cost of enforcing generics negligible: 
> technically, types will be computed once and reused for many HTTP 
> requests (because they are handled by the same long-running PHP script 
> under the hood). As working runtimes already provide a significant 
> performance improvement over FPM, we could say that even if 
> non-performance-critical applications (most applications) will be a bit 
> slower because of the new checks,  people working on 
> performance-sensitive applications will have the opportunity to reduce 
> the cost of checks to virtually nothing by switching to a 
> performance-oriented runtime.

From talking to Arnaud, the main issue here is the file-at-a-time compilation.  I'm not
entirely clear if a persistent process would side-step that, with the delayed resolution bits, or if
those would have to be re-resolved each time.  (That's an Arnaud question.)  Another
possibility that's been floated a bit, tangentially, is allowing some kind of multi-file
loading, which would allow for a larger scope to be included at once as an opcache segment, and thus
the optimizer could do more.

That said, I suspect the benefits of the JIT when using a worker-mode runner would be larger anyway.

Also, speaking for me personally and no one else, I am still very much in favor of official steps to
improve worker-mode options in php-src directly.  What form that takes I'm not sure, but I
would very much favor making worker-mode a first-class citizen, or at least a one-and-a-half class
citizen, rather than its current second-class status.

--Larry Garfield


Thread (36 messages)

« previous php.internals (#125145) next »