2012-09-10 13 views
5

Eventuali duplicati:
How slow are .NET exceptions?Gestione delle eccezioni. Quanto tempo impiega prendere?

C'è un overhead per un'eccezione e la cattura subito? C'è una differenza tra questo

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     throw new NullReferenceException("Any message"); 
     else 
     { 
     //... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

e questo (qui non si getti eccezione):

void DoSomething(object basic) 
{ 
    try 
    { 
     if (basic == null) 
     { 
      _logger.WriteLog(new NullReferenceException("Any message"); 
      return; 
     } 
     else 
     { 
     ... 
     } 
    } 
    catch (Exception error) 
    { 
     _logger.WriteLog(error); 
    } 
} 

Sarà il secondo frammento essere più veloce, o no?

Anche io voglio sapere perché una soluzione è più veloce di un'altra.

+0

(nuovo NullReferenceException ("Qualsiasi messaggio");) è il mio errore di stampa. –

+2

Puoi sempre modificare la domanda per risolverla (fai clic sul link 'edit') – dasblinkenlight

+0

Se vuoi sapere quale è più veloce e hai già due snippet di codice validi, perché non eseguirli entrambi (molte migliaia di volte) e trovare fuori per te stesso? – Servy

risposta

4

eccezioni sono più lento di tutti gli altri il flusso del programma, ma non nella misura in cui essi dovrebbero essere evitati per motivi di prestazioni. Tuttavia, non sono pensati per essere utilizzati per il flusso del programma. Nella tua situazione, hai un'alternativa molto valida che è meglio dell'utilizzo di eccezioni. Quando puoi prevedere una situazione e gestirla appropriatamente senza eccezioni, fallo sempre. Inoltre, non utilizzare eccezioni nel normale flusso del programma per comodità.

Utilizzare le eccezioni quando si dispone di una situazione eccezionale non prevista che non è possibile gestire direttamente.

+0

Grazie. Primo frammento che ho trovato nel progetto e penso sia meglio fare senza fare eccezioni e chiedere qui. –

+0

Cosa ne pensi dell'utilizzo prova finalmente per il flusso del programma, quando in blocco di prova viene restituito, e infine il codice generale di blocco, che deve essere eseguito sempre, inserito? –

+0

@DaniilGrankin, 'try' /' finally' è davvero un costrutto importante per eseguire codice, di solito codice di pulizia, indipendentemente da come viene generato (da ritorno, fall-through o eccezione). Generalmente solo il codice di pulizia dovrebbe essere eseguito in un file 'finally' e si vuole essere sicuri che un' finally' non generi mai un'eccezione. Con queste cose in mente, usa sempre 'try' /' finally' quando è appropriato. –

0

Ho capito che Throw ha molto più overhead di try/catch fa. Con ciò intendo che c'è poco overhead per avere un try/catch, ma c'è un piccolo overhead una volta che si deve effettivamente prendere un'eccezione. In molti programmi, entrambe le opzioni mostrate andranno bene, ma se stai provando a profilare realmente il tuo codice, sarà più veloce senza il lancio. Un paio di altre domande vale la pena guardare:

Under C# how much of a performance hit is a try, throw and catch block

What is the real overhead of try/catch in C#?

0

In questo caso, penso che la seconda scelta sia più veloce, ma come già detto @Samuel Neff eccezioni sono molto lente. Tuttavia, mentre stavo leggendo un articolo Jon Skeet sulle eccezioni, ho trovato un articolo interessante di Krzysztof Cwalina: Design Guidelines Update: Exception Throwing., che spiega quando dovremmo e non dovremmo usare le eccezioni. Infatti leggendolo ho trovato un punto importante dice:

1.2 Eccezioni e prestazioni:

Una preoccupazione comune relativi alle eccezioni è che se le eccezioni sono utilizzato per il codice che non riesce regolarmente, le prestazioni di l'implementazione non sarà accettabile. Questa è una preoccupazione molto valida. Quando un membro lancia un'eccezione, le sue prestazioni possono essere ordini di grandezza più lenta. Tuttavia, è possibile ottenere buone prestazioni rispettando rigorosamente le linee guida delle eccezioni che non consentono di utilizzare utilizzando i codici di errore. Due schemi descritti in questa sezione suggeriscono i metodi per farlo.

  • fare non codici di errore uso a causa delle preoccupazioni che le eccezioni potrebbero influire sulle prestazioni negativamente.