PHP 8.6 Closure Optimizations (wiki.php.net)

by moebrowne 50 comments 124 points
Read article View on HN

50 comments

[−] kevincox 29d ago
It is an interesting comparison that JavaScript always ensures that different evaluations of a closure expression results in unique instances. So in general the closures will require allocations for each (unless the allocation is otherwise prevented such as via escape analysis). Of course much of the underlying data may be shared, but the identity itself will be unique.

I don't know how strict JavaScript garbage collection rules are. This was non-observable for the longest time but FinalizationRegistry now exists which makes cleanup observable. It sounds like basically no guarantees are provided when an object will be cleaned up, so presumably an implementation would be allowed to make optimizations such are proposed where for PHP.

[−] eurleif 28d ago
The part that would violate guarantees in JavaScript is not function objects being kept alive longer, but function objects which should be distinct not being so.

    function foo() {
        return function() { };
    }
    console.log(foo() === foo()); // This must log `false` in a compliant implementation
[−] philo23 28d ago
Little bit of extra detail about static closures in PHP for anyone interested: https://www.php.net/manual/en/functions.anonymous.php#functi...
[−] moebrowne 31d ago

> Non-static closures are turned into static ones if they are guaranteed not to make use of $this.

> Stateless closures, i.e. those that are static, don't capture any variables and don't declare any static variables, are cached between uses.

[−] hyperionultra 29d ago
~3% performance gains. I didn’t understood part about $this.