2015-12-16 18 views
6

Il motore PHP ottimizzerebbe il secondo esempio per passare lo $arr come riferimento?PHP ottimizza gli argomenti della funzione del tipo di matrice, non passati esplicitamente per riferimento, quando non vengono modificati?

function test1(array &$arr) 
{ 
    $arr[] = 123; 

    echo $arr[0]; 
} 

function test2(array $arr) 
{ 
    echo $arr[0]; 
} 
+0

- Perché dovrebbe? –

+0

@u_mulder, per evitare di copiare l'intero array e consumare meno memoria – marsgpl

+0

L'array verrà copiato quando è necessario farlo. –

risposta

4

PHP utilizza un meccanismo chiamato copy-on-write per evitare esattamente la copia eccessivo di variabili fino a quando è necessario farlo. Quindi anche nel tuo esempio test2() non viene copiato lo $array. Se avessi modificato $array all'interno della funzione, PHP avrebbe copiato la variabile per consentire la modifica. Una spiegazione dettagliata di questo meccanismo è disponibile nel capitolo "Memory Management" di "PHP Internals Book". La seguente citazione è dalla sezione "Reference-counting and copy-on-write":

Se si pensa al sopra per un po ', si arriva alla conclusione che PHP deve fare un sacco di copia. Ogni volta che si passa a qualcosa in una funzione, è necessario copiare il valore. Questo potrebbe non essere particolarmente problematico per un intero o un doppio, ma immagina passando un array con dieci milioni di elementi a una funzione. La copia di milioni di elementi per ogni chiamata sarebbe proibitivamente lenta.

Per evitare di farlo, PHP impiega il paradigma copy-on-write: Uno zval può essere condiviso da più variabili/funzioni/etc finché è solo leggere e non modificati. Se uno dei titolari vuole modificarlo, , lo zval deve essere copiato prima di applicare qualsiasi modifica.

I seguenti due articoli prevedono anche più comprensione di questo argomento (entrambi scritti da sviluppatori di core di PHP):

Il il primo spiega anche perché l'utilizzo di riferimenti solo per motivi di prestazioni è spesso una cattiva idea:

Un altro motivo per cui le persone utilizzano il riferimento è dato dal fatto che ritengono di rendere più veloce il codice . Ma questo è sbagliato. È anche peggio: i riferimenti per lo più rendono il codice più lento!

Sì, i riferimenti spesso rallentano il codice: mi spiace, ho dovuto solo ripetere lo per chiarire.

E il secondo mostra perché gli oggetti non vengono realmente passati per riferimento in PHP5 +.

+0

Grazie! Non penso di essermi sbagliato completamente, ma tu sei decisamente più corretto :) Ho cancellato la mia risposta. Pensi che ci sia qualche guadagno in termini di prestazioni passando grandi array per riferimento se non vengono modificati? – Will

+1

@Will: vedere le risposte aggiornate.Non vi è alcun guadagno in termini di prestazioni nel passaggio di variabili con riferimento esplicito - è anche peggio: rende il codice più lento. Ho letto da qualche parte: * non cercare di superare in astuzia il motore *. –

+0

Risposta straordinaria, grazie! Molto informativo. – Will

Problemi correlati