Pregunta

Esto es extremadamente lenta:

try
{
    x = k / y;
}
catch (DivideByZeroException) { }

Esto es aproximadamente 5 veces más rápido:

if (y > 0) x = k / y;

¿Alguien puede decirme por qué?

¿Fue útil?

Solución

A solo 5 veces más rápido? Usted hace me sorprende. Es de suponer que significa que los datos de la muestra no tiene muchos ceros en ella.

Las excepciones son más caras que las comparaciones simples. Cuando se utiliza correctamente (es decir, para casos excepcionales) que no tienden a entorpecer el funcionamiento significativamente - porque si usted está lanzando suficientes excepciones para que tenga un gran impacto, es probable que su servicio ya se riega. Es hace causa un problema cuando se utiliza excepciones a tratar de ignorar condiciones que fácilmente se podría probar para empezar -. Como éste

Una cosa a la nota sobre el costo de excepciones: cuestan mucho más en el depurador que cuando se ejecuta sin un depurador asociado; en particular, la primera excepción que necesita para cargar un montón de recursos puede tomar segundos en lugar de milisegundos / micro. Si vas a el código de prueba, es vital que usted no lo hace en un depurador -. Es cierto que, en general, pero particularmente para las excepciones

Otros consejos

Debido excepciones son caros.

Cuando se produce una excepción, el tiempo de ejecución tiene que escoger un buen montón de información (seguimientos de pila, por ejemplo) y de la burbuja hacia arriba. Esto lleva tiempo y recursos, cuando una prueba de valor 0 es muy barato en comparación.

esta pregunta SO preguntan cómo caros excepciones son para obtener más información.

Err, porque las excepciones son más lentas que la comprobación. Excepciones generalmente tienen mucha mucha infraestructura alrededor de ellos que una simple declaración if no lo hace.

Son operaciones no equivalentes ya que tiene una gran cantidad de información que se entrega en una excepción , incluso si decide no usarlo como en este caso.

  

¿Por qué son excepciones lento?

Debido a que un montón de cosas que sucede cuando se produce una excepción y atrapó. Ver post de Chris Brumme sobre el modelo de excepción y administrado este post sobre el subyacente modelo Win32 SEH para más detalles.

  

¿Por qué es una prueba rápida y sencilla?

Debido a que sólo se ejecuta una instrucción para saltar dependiendo del resultado de la comparación de dos números enteros, que es mucho menos trabajo que una excepción.

  

¿Eso quiere decir que siempre debería tratar de excepciones evitar?

No, depende de la semántica. Si la división por cero es un caso verdaderamente excepción de que no se espera que suceda y que su programa no puede manejar razonablemente, a continuación, dejar que se produzca la excepción y bloquee su programa. Sin embargo, si se trata de un caso esperado y se puede manejar de una manera razonable, entonces parecería razonable para evitar la excepción.

Las excepciones son extremadamente lento - Esta es la razón por la que el marco .Net tiene métodos TryParse:

// This is much quicker...
double result;
if (!double.TryParse("Twelve", out result))
{
    result = -1;
}
return result;

// Than this...
try
{
    return double.Parse("Twelve");
}
catch 
{
    return -1;
}

siempre se debe tratar de evitar (excepciones excepto en circunstancias excepcionales - jaja ...)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top