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?
risposta
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.
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. –
@ 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
Hm, hai un link per spiegare questo inganno? Sembra interessante. –
- 1. Rappresentazione interna di stringhe in PHP
- 2. Modo intelligente per scoprire la codifica delle stringhe?
- 3. Confronto stringa intelligente
- 4. Traslitterazione intelligente in PHP
- 5. Regex per tutte le stringhe che non contengono una stringa?
- 6. PHP rimuove le virgole dalle stringhe numeriche
- 7. PHP: la funzione implode() è sicura per le stringhe multibyte?
- 8. Perché le stringhe non-letterali non possono contenere righe nuove?
- 9. Perché Phobos usa enum per le costanti?
- 10. perché OCaml usa la sottotipizzazione per le varianti polimorfiche?
- 11. C++ stringa non ottimizzato sufficiente per stringhe
- 12. Perché le funzioni incorporate di PHP utilizzano le costanti anziché solo le stringhe come parametri?
- 13. gettext PHP: non tutte le stringhe diventa tradotto
- 14. PHP stringa '==' restituisce false sul stesse stringhe
- 15. rappresentazione interna di stringhe in C#
- 16. Perché le chiavi int di un python dict si trasformano in stringhe quando si usa json.dumps?
- 17. Equivalente per le stringhe di stringhe
- 18. Perché TPageProducer non rimuove le virgolette dalle stringhe?
- 19. Perché non possiamo usare le stringhe C come SEL?
- 20. Riferimenti risorsa stringa interna
- 21. Perché non è possibile rilevare l'eccezione interna?
- 22. JS usa sempre due byte per carattere per memorizzare le stringhe?
- 23. Usa PHP per mostrare le statistiche di Icecast2
- 24. Word-wrap più intelligente in PHP per parole lunghe?
- 25. Perché la protezione interna non è più restrittiva di quella interna?
- 26. Confronto di stringhe PHP usando '=='
- 27. Modo memoria efficiente per memorizzare le stringhe
- 28. Perché jQuery non usa JSDoc?
- 29. Le stringhe nella matrice non sono più stringhe dopo jQuery.each()
- 30. Usa isinstance per testare per la stringa Unicode
Di quanti byte stiamo parlando? lol –
@AdamBuchananSmith Bytes di cosa? –
Umm ... di memoria. –