Question

C'est extrêmement lent :

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

C'est environ 5 fois plus rapide :

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

Quelqu'un peut-il me dire pourquoi?

Était-ce utile?

La solution

seulement 5 fois plus rapide? Vous ne me surprennent. On peut supposer que cela signifie que vos données d'échantillon n'a pas beaucoup de zéros dedans.

Les exceptions sont plus chers que des comparaisons simples. Lorsqu'ils sont utilisés correctement (à savoir des circonstances exceptionnelles), ils ne tendent pas à entraver la performance de manière significative - parce que si vous jetez des exceptions assez pour elle de faire un grand impact, les chances sont que votre service est déjà lavé au jet. Il fait causer un problème lorsque vous utilisez des exceptions pour essayer d'ignorer les conditions que vous pouvez tester très facilement pour commencer -. Comme celui-ci

Une chose à noter sur le coût des exceptions: ils coûtent beaucoup plus dans le débogueur que lors de l'exécution sans un débogueur attaché; en particulier la première exception qui a besoin de charger un groupe de ressources peut prendre quelques secondes plutôt que les micro / millisecondes. Si vous allez au code de référence, il est essentiel que vous ne le faites pas dans un débogueur -. Qui est vrai en général, mais en particulier pour les exceptions

Autres conseils

Parce que les exceptions sont chères.

Quand une exception est levée, le moteur d'exécution doit choisir un bon nombre d'informations (traces de pile par exemple) et les bulles vers le haut. Cela prend du temps et des ressources, lorsqu'un test de valeur 0 est vraiment pas cher en comparaison.

Voir cette question SO demandent comment les exceptions sont coûteuses pour plus d'informations.

Err, car les exceptions sont plus lentes que la vérification. Les exceptions ont généralement autour d'eux beaucoup de beaucoup d'infrastructures qu'une simple déclaration de if ne fonctionne pas.

Ils sont pas des opérations équivalentes puisque vous avez beaucoup d'informations délivrées dans une exception même si vous choisissez de ne pas l'utiliser comme dans ce cas.

  

Pourquoi exceptions lent?

Parce que beaucoup de choses se produit quand une exception est levée et a pris. Voir poste de Chris Brumme sur le modèle d'exception géré et ce post sur le modèle Win32 SEH sous-jacent pour plus de détails.

  

Pourquoi un test simple et rapide?

Parce qu'il exécute simplement une instruction de sauter en fonction du résultat de la comparaison de deux entiers qui est beaucoup moins de travail que l'exception.

  

Est-ce que cela signifie que je dois toujours essayer d'éviter des exceptions?

Non, cela dépend de la sémantique. Si la division par zéro est un véritable cas d'exception que vous ne vous attendez pas à se produire, et que votre programme ne peut pas gérer raisonnablement, puis laissez l'exception se produit et crash de votre programme. Si, cependant, il est un cas prévu et vous pouvez le manipuler d'une manière raisonnable, alors il semble raisonnable d'éviter l'exception.

Les exceptions sont extrêmement lentes - C'est la raison pour laquelle le framework .Net dispose de méthodes 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;
}

vous devriez toujours essayer d'éviter les exceptions (sauf circonstances exceptionnelles - haha...)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top