On 9/4/07, Nuno Lopes <[EMAIL PROTECTED]> wrote:
> It can also have some use if we
> decide to investigate the usage of an off-the-shelf (conservative)
> garbage collector such as Boehm's (maybe in next year's SoC).
>

As an aside, I was also thinking about this throughout the course of
the project. It's said that reference counting is the slowest form of
garbage collection since the reference counts must constantly be
maintained. Changing to a tracing garbage collector won't require
these macros, because reference counts would be eliminated altogether.
However, it would be sort of a big pain to implement

Off the shelf garbage collectors such as BDW would be inappropriate
because we use some weird kinds of "pointers" (such as object handles)
stored in weird kinds of ways (such as a zend_hash object). I think it
would be pretty inefficient, since those implementations just scan the
stack, registers and heap and we're trying to do GC not for the PHP
interpreter, but for the code the PHP interpreter is running.

I have a certain suspicion that a traditional mark-and-sweep collector
might be faster if just on the virtue of eliminating the refcount
field and getting rid of tons of cache misses that way. For just
displaying page, there wouldn't be much memory used and that's all
freed at the end of a request anyway: all of that reference counting
overhead would just disappear. For larger scripts that use a lot of
memory, the only problem would be pause times but in most real life
cases, it seems the total time would be shorter than reference
counting. However, I'm not sure if that would be the case in PHP:
rummaging through objects scattered all over memory would result in a
lot of cache misses. The question is whether that is greater than all
the misses we're currently having just managing the refcount.

However, answering that question would require implementing the thing,
and that honestly seems like it would be a bit of a nightmare. Roots
would include zvals linked to PHP variables, the stack of the running
PHP code, and the stack and heap of the PHP interpreter itself. It
would've been far easier if PHP had been designed from the ground up
to use some sane way of managing memory, but with the current
situation, with extensions depending on reference counting, it's
pretty difficult.

If ever a version of this patch is committed, you'll be able to see
that the cycle collector touches the whole reference counting mess
extremely minimally, which is why it was relatively safe to implement.

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

Reply via email to