È una prova e cattura che non genera un'eccezione più efficiente di una condizione?

8

Mi sono imbattuto recentemente in questo esempio:

If 999 times out of 1,000 an exception will not be thrown then the exception is only generated once. On the other hand a conditional would have been called needlessly 999 times, therefore in this case the exception is superior.

In questo caso è C #, ma in generale è vero? In precedenza avevo pensato che le dichiarazioni try / catch avessero il proprio overhead che equivalesse al tempo impiegato per gestire un condizionale.

Certo, basta lanciare i blocchi try / catch ogni volta che un condizionale verrebbe normalmente sarebbe un modo terribile di codificare, ma per quanto riguarda le risorse questa affermazione è valida?

    
posta Jane Panda 25.04.2013 - 15:43
fonte

3 risposte

4

In genere è vero per i compilatori di qualità commerciale. Tuttavia, i condizionali possono raggiungere efficienze simili usando le annotazioni in stile assume(false) . L'ottimizzazione guidata dei profili potrebbe battere entrambi.

La ragione di fondo è che i buoni compilatori possono generare codice più efficiente formulando ipotesi corrette sulla probabilità che il codice venga eseguito. Poiché la convenzione è che le eccezioni sono eccezionali, la maggior parte dei compilatori (in assenza di dati di profilazione) genererà un codice ottimale quando le eccezioni sono davvero rare.

Ad esempio, il codice di gestione delle eccezioni può essere inserito nel proprio segmento e può essere inserito solo quando si verifica la prima eccezione. Ciò significa che la cache della CPU può essere utilizzata in modo più efficiente, memorizzando solo codice non eccezionale.

    
risposta data 25.04.2013 - 16:37
fonte
4

Ci sono scenari per usare try / catch e altri per usare i condizionali.

L'uso di un try / catch non danneggia le prestazioni come ampiamente descritto Qui

The overall cost of a try...catch block that never handles an exception is a few bytes of memory

Al di là delle prestazioni, la corretta gestione delle eccezioni è importante. L'ultima cosa che vuoi è che gli errori non rilevati vengano mostrati a un utente, a prestazioni con errori o all'applicazione sospesa dopo che si è verificato un problema.

    
risposta data 25.04.2013 - 16:07
fonte
-1

Un esempio di performance migliore usando try / catch al posto di un condizionale è quando si ha a che fare con dizionari, quando si chiede se contiene la chiave è O (n) contro provare semplicemente ad accedere / aggiungere la chiave e catturare la potenziale eccezione.

try
{
    dict.Add(key, val);
}
catch (Exception)
{

    dict[key] = val;
}
    
risposta data 25.04.2013 - 16:33
fonte

Leggi altre domande sui tag