2012-05-02 7 views
6

decir si esto es el código:En PHP, ¿cómo devolvemos una gran matriz?

function bar() { 
    $result = array(); 
    for ($i = 0; $i < 1000; $i++) { 
     $result[] = $i * 10; 
    } 
    return $result; 
} 

$ha = bar(); 
print_r($ha); 

¿No es eficaz para devolver una gran variedad de esa manera ya que es "retorno de valor"? (por ejemplo, si no es 1000 sino 1000000). Así que para mejorarlo, tendríamos que cambiar la primera línea a:

function &bar() { 

que es, simplemente añadiendo un & delante del nombre de la función - se trata de una forma correcta y preferido si se devuelve un arsenal grande?

Respuesta

7

Hay muchos malentendidos sobre cómo maneja PHP el almacenamiento variable. Como PHP es "copiar al escribir", no es necesario crear una "referencia" (en realidad, un alias de tabla de símbolos) en un esfuerzo por ahorrar espacio o tiempo. De hecho, hacerlo puede hacerte daño. Debe solo crear una referencia en PHP si desea usarlo como alias de algo. Ejecuté ambos fragmentos y parece que el segundo realmente usa más memoria (aunque no por mucho).

Por cierto, una matriz de 1000 enteros es minúscula.

5

Consumen absolutamente la misma cantidad de memoria, debido a COW

  1. http://ideone.com/bZgm7
  2. http://ideone.com/e3Jfr

PS: para obtener "verdadera" que pasa por referencia también hay que añadir en la asignación:

$ha =& bar(); 
+0

Solo las definiciones de funciones pueden tener signos de referencia, no llamadas de función –

+2

@Jack: lea la documentación (* cuidadosamente *) y desvíseme: http://nz.php.net/manual/en/language.references.return.php (especialmente ver la primera Nota: "A diferencia del paso de parámetros, aquí tienes que usar & en ambos lugares") – zerkms

+0

Mis disculpas, me corrigen ... cosas bastante oscuras debo decir :) –

0

¿Qué tal esto?

function bar($result) { 
    $result = array(); 
    for ($i = 0; $i < 1000; $i++) { 
     $result[] = $i * 10; 
    } 
} 

bar(&$ha); 
print_r($ha); 
3

Si se lanza en un memory_get_peak_usage() en la función y el exterior, verá que la devolución de la matriz no aumenta la memoria.

Copias PHP en escritura. En este caso, no hay nada que copiar incluso si escribe porque la variable original está fuera del alcance. Entonces no, no hay razón para hacer esto.

Y, de hecho, en PHP, generalmente no hay ninguna razón para usar referencias a menos que necesite la funcionalidad que proporcionan: alterar la variable original.

+0

Entonces, después de recuperar la matriz, si cambiamos inmediatamente un elemento de matriz o agregamos un elemento a la matriz, se considera una "escritura", pero no habrá "copia en escritura"? –

+0

@Jeremy L: si cambia la matriz fuera de la función, solo existe una referencia, por lo tanto, no se realizarán copias. se considerará como una escritura, pero sin copias (porque solo existe una referencia) – zerkms

+0

@Jeremy L: no habrá copia en escritura debido a que es la única referencia a esa matriz. Si devolviera una variable de instancia de un objeto, entonces habría una copia después de modificar la matriz. Sin embargo, en ese caso, tendría que preguntarse: ¿realmente deseo que la persona que llama pueda alterar la matriz de instancias del objeto? Así que de nuevo, repetiría que, como regla general, no utiliza referencias en PHP para obtener rendimiento. – Matthew

1

La página del manual oficial dice: La devolución por referencia es útil cuando se quiere usar una función para encontrar a qué variable se debe vincular una referencia. No use retorno por referencia para aumentar el rendimiento. El motor automáticamente optimizará esto por sí mismo. Sólo volver referencias cuando se tiene una razón técnica válida para hacerlo

http://it2.php.net/manual/en/language.references.return.php

Así, en su caso, no lo use.