2015-09-17 19 views
5

PHP ha una struttura dati interna chiamata smart string (smart_str?), Dove memorizzano sia la lunghezza che la dimensione del buffer. Cioè, viene allocata più memoria della lunghezza della stringa per migliorare le prestazioni di concatenazione. Perché questa struttura dati non è utilizzata per le stringhe PHP attuali? Non porterebbe a un minor numero di allocazioni di memoria e prestazioni migliori?Perché PHP non usa la stringa intelligente interna per le stringhe?

+0

Di quanti byte stiamo parlando? lol –

+0

@AdamBuchananSmith Bytes di cosa? –

+0

Umm ... di memoria. –

risposta

6

Le stringhe di PHP normali (come di PHP 7) sono rappresentate dal tipo zend_string, che include sia la lunghezza della stringa che il suo array di dati di carattere. zend_string di solito vengono assegnati per adattarsi perfettamente ai dati dei caratteri (nonostante l'allineamento): non lasceranno spazio per aggiungere caratteri aggiuntivi.

La struttura smart_str include un puntatore a zend_string e una dimensione di allocazione. Questa volta, zend_string sarà non essere allocati con precisione. Invece l'allocazione verrà resa troppo grande, in modo che i caratteri aggiuntivi possano essere aggiunti senza costose riallocazioni.

Il criterio di riallocazione per smart_str è il seguente: Innanzitutto, verrà assegnato un numero totale di 256 byte (meno l'intestazione zend_string, meno il sovraccarico dell'allocatore). Se questa dimensione viene superata, verrà riallocata a 4096 byte (meno il sovraccarico). Successivamente, la dimensione aumenterà in incrementi di 4096 byte.

Ora immagina di sostituire tutte le stringhe con smart_str ings. Ciò significherebbe che anche una singola stringa di caratteri avrebbe una dimensione di allocazione minima di 256 byte. Dato che la maggior parte delle stringhe in uso sono piccole, questo è un overhead inaccettabile.

Quindi, in sostanza, questo è un classico compromesso tra prestazioni e memoria. Per impostazione predefinita, utilizziamo una rappresentazione di memoria compatta e passiamo a una rappresentazione più veloce, ma meno efficace della memoria, nei casi che ne traggono il massimo beneficio, vale a dire i casi in cui le stringhe grandi sono costruite da piccole parti.

+0

Certo, ma si potrebbe ancora ottimizzare 'smart_str' per adattarsi meglio alla normale gestione delle stringhe PHP, giusto? Iniziando con piccole dimensioni e poi raddoppiandole ogni volta che avviene la concatenazione. Soprattutto perché i buffer di stringa sono impossibili da implementare in PHP (!). E soprattutto perché la memoria è più abbondante dei cicli della CPU. –

+1

@ OlleHärstedt Sì, è probabile che sia possibile trovare una politica di allocazione ragionevole dopo aver iniziato a memorizzare la capacità. Stavo rispondendo a proposito di smart_str in particolare qui. Una cosa relativamente sicura da fare è integrarsi con l'allocatore e (per piccoli allocazioni) scegliere la dimensione del secchio più grande che verrà comunque utilizzata. Con un po 'di inganno, sarebbe anche possibile non introdurre alcun sovraccarico di memoria addizionale per l'archiviazione della capacità (usando la codifica pseudo-float). Questo è ciò che fa HHVM;) – NikiC

+0

Hm, hai un link per spiegare questo inganno? Sembra interessante. –