2009-02-24 22 views
6

¿La asignación variable es cara en comparación con una verificación nula? Por ejemplo, ¿vale la pena comprobar que foo no es nulo antes de asignarle nulo?Comprobar si la variable null antes de asignar a nulo?

if (foo != null) { 
    foo = null; 
} 

¿O es esto nada del todo pensado?

+0

Estoy votando esta pregunta porque creo que el mensaje (consistente) en todas las respuestas es importante. En mi humilde opinión, Knuth como se cita a continuación es absolutamente correcto. E incluso si esto cayera en el 3% de los casos en los que podría ser importante, solo los perfiles sólidos y la evaluación comparativa darán una respuesta definitiva. – RBerteig

+0

Supongo que las respuestas consistentes también indican que obtuve algo muy obviamente incorrecto ... – Albert

Respuesta

30

Esto es una micro-micro-optimización (y posiblemente algo manejado por el compilador de todos modos). No te preocupes por eso Obtendrá un rendimiento mucho mayor al centrarse en el algoritmo real de sus programas.

Debemos olvidarnos de las pequeñas eficiencias, digamos aproximadamente el 97% del tiempo: la optimización prematura es la raíz de todos los males. - Donald Knuth

+0

Dado que la diferencia es esencialmente cero, ¿cuál sería más claro? Con el cheque o sin? – Albert

+0

Sin el cheque. –

+0

@mike, estás en lo cierto. pero, ¿no nos desviamos de la cuestión real aquí? la pregunta es cuál sería más eficiente. pero estamos hablando de cómo no debemos pasar demasiado tiempo en pequeñas cosas. ¡Esas son buenas prácticas de las que estamos hablando y no la respuesta a la pregunta! –

7

Esto es en realidad (muy, muy ligeramente) menos eficiente. Las asignaciones de variables son más o menos equivalentes a las verificaciones nulas, además de que hay una rama adicional posible. No es que haga mucha diferencia.

¿O es esto nada del todo pensado?

Lo tienes.

3

No me preocuparía, solo se necesitan líneas adicionales de código para mantener. Este es el tipo de micro-optimización que nunca debe hacer a menos que tenga lotes de una prueba documentada de que es su cuello de botella.

1

foo = null; 

if (foo != null) 
    foo = null; 

Si miro el segundo código de bloque Me gustaría pensar que sólo desea establecer la variable foo en nulo si no fuera nula antes, y si miro el primer código Me gustaría pensar que quería establecer la variable foo a null de todos modos.

Sé que esto se debe al ejemplo que escribió, pero al final este tipo de micro-optimización solo agrega confusión (no lo vale).

+0

¿Qué versión es más confusa? – Albert

1

Esto hará que su código sea mucho más difícil de leer que incluso si fuera una optimización, no valdría la pena.

Y no es una optimización. En la mayoría de las CPU modernas, las declaraciones son bastante caras.

+0

¿Qué versión es más confusa? – Albert

+0

Aparentemente, ambas versiones son confusas para algunas personas. –

+0

Ah, eso es genial;) – Albert

1

Esto tendrá poco o ningún efecto. No creo que puedas crear un punto de referencia para demostrar la diferencia.

De hecho, se podría argumentar que el asignar a nulo en absoluto es un olor código (véase la PMD detector for NullAssignment):

Asignación de un "nulo" a una variable (fuera de su declaración) es general mala forma. Algunas veces, la asignación es una indicación de que el programador no comprende completamente lo que está sucediendo en el código . NOTA: Este tipo de asignación puede ser útil en casos excepcionales para fomentar la recolección de basura.Si eso es lo que lo está utilizando para, por todos los medios, no tener en cuenta esta regla :-)

En general, estoy personalmente recelosos de cualquier cosa que se intenta fomentar la recogida de basura (que casi siempre consigue efectos que no esperabas).

+0

Tiene razón, no pude crear un punto de referencia que mostrara alguna diferencia significativa. Voy a reflexionar sobre si asignar a nulo es una mala práctica en una fecha posterior. ¡Gracias! – Albert

2

En primer lugar, es la optimización de micro. Entonces no hay necesidad de preocuparse mucho por eso.

Pero para responder a su pregunta, debe reducirla a una sola línea. (como todo lo que hace su código es establecerlo en NULL).

foo = NULL; 

razones es que,

comparación es una operación mucho, mucho más costosa que la asignación. (Como la comparación consume muchas instrucciones de ensamblaje comparativamente. Generalmente una resta y una comparación a cero o un XOR y comparación a cero). La tarea requiere menos instrucciones.

+0

"La comparación es una operación mucho más costosa que la asignación" Cita necesaria :) – user

2

Si tiene un compilador decente, generará un código idéntico. Si tienes un compilador de mierda, el que tiene el if será peor. En 2009, las asignaciones de hardware a las variables son muy baratas, y las ramas condicionales a veces pueden ser costosas.

Cuestiones relacionadas