> De : Bob Weinand [mailto:bobw...@hotmail.com]
>
> Interesting idea (from the concept). I even could get on board with this; I'm
> just not that sure about the performance impact. (alignment of refcount to
> base address etc.)

        zend_string *s;
        
        s = zend_string_alloc(256, 0);
        ...
        ZSTR_SET_LEN(s, snprint(s, ZSTR_LEN(s)+1, "<format>", args...); /* 
Overflow-protected */
        ...
        hash = ZSTR_HASH(s);
        ...
        char *p = estrndup(s, ZSTR_LEN(s)); /* Result is a pure 'char *', not a 
zend_string */
        ...
        ZSTR_RELEASE(s);

Isn't it nice ?

You're right, refcount alignement is the serious issue to solve. Peformance 
needs to be tested of course, but we compute '->val' much more often than we 
use the struct base address (for realloc/free only except when accessing gc). 
Accessing length and hash using an offset has the same cost as before.

> Also, you have to make sure, to not accidentally pass a real char * array to
> something that expects a char * from a zend_string *… which is where I'm
> not so sure if we can do it. It may loose some typing security :-/

The zend_string type would remain, even if typedef-ed to 'char'. So, 
'zend_string *' declarations would remain, they wouldn't become 'char *' (just 
a question of declarations because it would work too). In debug mode, we also 
can add a marker in the structure to detect when we receive an invalid address, 
as it is sometimes done in memory management libs.

> Also wrappers around such low-level structures often tend to be leaky or be
> just such a shitload of individual functions that nobody ever can remember it
> before having worked with it all day for a few months.
> (I mean leaky in a sense that you maybe are able to do everything, but not
> quite in the performant way we like to)

I agree, that's often the case but, even when performance impose low-level 
control, an appropriate abstraction layer often allows for a cleaner future. 
What I fear most is not this, it's having an idea impossible to implement 
because people designing the API did not think wide enough when it was time. 
The PHP history is full of such changes which required a lot of time and 
energy, just because everyone had been working during years with too 
short-sighted APIs. The art of APIs id to find the best compromise between 
usability, performance, and extensibility, knowing there's no ideal solution. 
And one additional difficulty is that many people think it is easy !

> Meh, that persistent/non-persistent is annoying me a bit too sometimes.
> I don't disagree that we should change that. We could e.g. use GC_TYPE()
> and add our custom flag here. But maybe it's there to be able to tell compiler
> what branch in perealloc() will be taken, so that that branch can be compiled
> out.
> Abstraction APIs are a powerful tool, but they come at a price…

Actually, the information is already stored in the struct, there's nothing to 
add. zend_string_release/free() functions even use it to determine which kind 
of mem they are freeing. It is not even consistent because only 
realloc/extend/truncate use this 'useless' arg. Actually, the only reason given 
is too optimize compilation. I know that everything has a price but I think 
that's going too much on the performance side. An argument with a single value 
allowed is not an argument, IMO. Remember, if the wrong value is given, your 
program crashes ! Anyway, I'd first like to measure the performance gains/loss 
of such choices.

> But issue is a bit now that with 7.1 we don't want to do major API changes.
> We're *allowed* to, but we shouldn't.

While the politics of BC breaks at the PHP level is now quite well-defined, it 
is less clear at the C level. During 5.x, we saw several macros and functions 
disappear without notice, and nobody seems so surprised about it. IMO, the 
hardest part is to get a consensus on such changes.

> I don't feel controlled by Zend. The only major appearance from Zend was in
> scalar types discussion in form of Zeev. Err yeah, and maybe the PHP 7 name.
> Hah.
> Yes, it's maybe Zend which pushed Dmitry to optimize PHP to death, I have
> no idea. But that's a good thing, stop ranting against that :-P

I don't say I'm controlled by Zend. I say we shouldn't have given the phpng 
whitecard with so few supervision and control from the community.

Regards

François


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

Reply via email to