2011-01-03 12 views
6

imbattuti in qualche vecchio codice che sta gettando vuota e la cattura di alcune eccezioni del cast (circa 20 euro a viaggio :()C# Fusioni Eccezione

Che cosa succede se c'è ne è il calo di prestazioni stavano prendendo a causa di questo? Dovrei essere preoccupato questo o è l'overhead semplicemente nel try/catch

Sorprendentemente mancanza di informazioni sul tema della performance eccezione con C#.

Grazie, dal sottoscritto.

+0

Si è scoperto un problema con l'essenza del metodo stesso e ha trasformato un mostro di 30 linee di cast esplicito per provare le catture, in due righe di codice che passavano da 3,8 secondi a 10000 elementi fino a 3 millisecondi. Grazie a tutti! –

risposta

9

Le eccezioni stanno andando a rallentare se più di maggior parte delle linee medie di codice. Invece di lanciare e quindi rilevare l'eccezione, effettuare un controllo. Per esempio

BAD

myType foo = (myType)obj; 
foo.ExecuteOperation(); 

BUONA

myType foo = obj as myType; 
if (foo != null) 
{ 
    foo.ExecuteOperation(); 
} 
0

eccezioni sono costosi, prestazioni-saggio. Ultimo volta che mis questi, stavano prendendo su un millisecondo completo per lanciare e catturare ogni eccezione.

Evitare l'uso di eccezioni come meccanismo di controllo del flusso.

+0

Non dovrebbe gestire l'eccezione, solo non facendo un'eccezione, potrebbe gestirlo con garbo. Ogni eccezione che non riesce a catturare con garbo è il tipo di eccezione che vuoi lanciare se succede, ma non dovrebbe accadere se è attento. –

-1

Se non si sono verificati problemi di prestazioni e questo è l'unico modo per farlo, continuare a utilizzare questo metodo.

Forse prima di provare a trasmettere potresti vedere alcune clausole if se potresti eseguire il cast.

+0

Le eccezioni sono costose. È una cattiva pratica usarli per il normale funzionamento. –

+0

Non ho mai detto che non sono costosi. Se hai letto il mio post, ho scritto che può usarlo solo se non rileva problemi di prestazioni o se è l'unico modo per scrivere l'algoritmo. –

+0

L'espressione operativa qui è "se ... questo è l'unico modo in cui devi fare quell'algoritmo". A volte, devi infrangere le regole. Non è brutto, ma è la verità. Anche se probabilmente refactoring tale codice per utilizzare TryParse, la domanda rimane: cosa fai se fallisce? –

0

Come altri hanno già menzionato, le eccezioni sono costose quando vengono lanciate. In alcuni casi non possono essere evitati.

In questo caso, tuttavia, sembra proprio che possano esserlo.

Suggerisco di utilizzare la parola chiave as prima del cast. Che vi dirà se il cast è riuscito o non evitando così l'eccezione del tutto:

object someObject; 
SomeType typedObject; 

// fill someObject 

typedObject = someObject as SomeType; 

if(typedObject == null) 
{ 
    // Cast failed 
} 
+0

Uno dovrebbe combinare 'if (x è T) y = (T) x;' o 'y = x come T; se (x! = null) '. Il primo funziona anche con le strutture. – Dykam

1

Questo è un male per due motivi.

  1. Le eccezioni sono lente, c'è un bel colpo di prestazioni. Non penso che ci vorrebbe un intero millisecondo come Matt ha sottolineato, ma sono abbastanza lenti da volerli evitare nel normale funzionamento.
  2. A meno che non si abbia una buona ragione, non si devono rilevare eccezioni vuote. Stai solo nascondendo dei problemi. Meglio che un programma si arresti in modo anomalo di quello che porta con bug potenzialmente pericolosi.

Se sono solo gruppi try { } finally { }, allora va tutto bene - non ci sono spese generali. Tuttavia, try { } catch { } è potenzialmente pericoloso e potenzialmente lento.

Per quanto riguarda la documentazione, questo è abbastanza buono: http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

Edit: appena realizzato che hai detto vuota cattura eccezioni, non cattura vuote eccezioni. In entrambi i casi, a meno che tu non abbia a che fare con l'IO, probabilmente vorrai evitare di farlo per amore delle prestazioni.