2010-03-05 23 views
6

Estoy tratando de optimizar mi código. Necesito rellenar un formulario con datos de una base de datos, y necesito verificar si la variable existe para llenar el cuadro de texto (no me gusta el @ error oculto). El formulario es realmente largo, luego tengo que verificar varias veces si existen las variables.

¿Qué es más rápido de los siguientes dos?

  • if (isset ($item))
  • if ($item_exists==true)

O incluso

  • if ($item_exists===true)
+3

se puede meter en problemas con 'if ($ foo == true)', ¿y si $ foo es cero y que es válida? –

+0

La penalización de rendimiento para el caso == y === es que se produce un error E_NOTICE porque la variable no existe. Lanzar errores es relativamente caro. Cuando llama a isset(), no se produce ningún error si la variable no existe. –

Respuesta

7

Estoy seguro de que hay una diferencia de rendimiento; Estoy seguro de que ha sido evaluado en alguna parte; pero también estoy seguro de que realmente no importa en absoluto para propósitos del mundo real. Cualquier ganancia alcanzable está en milisegundos aquí, y lo que es mucho, mucho más importante es la legibilidad del código, y la evitación de advertencias (que cuestan rendimiento, ya sea de salida o no).

Probablemente necesitará isset si no puede estar seguro de que está configurado en el momento de acceder. la comparación de tipo seguro === no debería ser necesaria si $item_exists siempre es un booleano, pero tampoco perjudicará. Así que dependiendo de su situación, es posible que necesite

if ((isset($item)) and ($item_exists === true)) 
+0

Gracias por su respuesta Pekka. – earlyriser

+0

Es mejor usar 'if (empty ($ item))' en lugar de ese código. – Ariel

11

En este caso no se debe preguntar sobre el rendimiento, sino de corrección en primer lugar. Porque isset no se comporta como una conversión booleana y la comparación es verdadero (consulte type comparison table). Especialmente los valores "" (cadena vacía), array() (matriz vacía), false, 0 y "0" (0 como cadena) se manejan de manera diferente.

+1

+1. Además de la diferencia en las tablas de comparación, el uso de un operador de comparación en una variable no declarada da como resultado un E_NOTICE. –

1

Para responder, lo más probable es que isset() y "===" sean los más rápidos ya que solo verifican una condición, donde == verifica múltiples condiciones y es más lento. No he probado oficialmente esto, pero creo que es correcto. @Pekka también es correcto, si estás buscando optimizar, realmente no será donde lo hagas. Como probablemente tomaría miles de llamadas solo para notar unos pocos milisegundos de diferencia.

22

Con un bucle for repitiéndolo 10000000 veces el mismo guión tomó:

  • if (isset ($item)) 2,25843787193
  • if ($item_exists==true) 6,25483512878
  • if ($item_exists===true) 5,99481105804

Así que puede decir isset seguramente es más rápido.

+0

+1 para hacer el benchmarking. También muestra que no hace una gran diferencia: es extremadamente raro que un script PHP haga algo 10 millones de veces, y generalmente, la sobrecarga de E/S de la base de datos/archivo aumentaría enormemente el tiempo necesario incluso entonces. –

+0

¿qué era $ item_exists? Creo que el "==" puede variar en función de su tipo – Seaux

+2

Para agregar al juego de números: De cualquier forma es del orden de 0.0000001 segundos. Lo que significa que tendrías que hacerlo alrededor de 1,000,000 de veces por página para que sea algo que el usuario notaría (suponiendo que el usuario lo notaría en 0.1 segundos). En resumen, el tipo de micro-optimización que raramente, si alguna vez, hará la diferencia. –

-1

Solo hay una forma de optimizar su código, llamado "perfilado". Primero debe saber qué parte del código requiere optimización. Y solo entonces ejecuta pruebas, encuentra soluciones, etc.

El enfoque "circundante" de la respuesta de Marcx es horrible también. Si desea probar si algún código marca una diferencia real, pruébelo desde el punto de vista del navegador, utilizando la utilidad de evaluación comparativa Apache.

0

Yo sugeriría las siguientes alternativas:

if (@$item) 
if (@$item_exists) 
Cuestiones relacionadas