c# Try/Catch cost

Oggi in ufficio è uscito il discorso performance, strutture di programmazione e ottimizzazione. Il dialogo si è particolarmente acceso sull’argomento "uso del try / catch". Ma quel’è il reale costo del try / catch?

Partiamo da un presupposto: il codice c# è ottimizzato dal compilatore. Ottimizzare il codice che scriviamo noi comporta anche strutturare gruppi di istruzioni più atomici possibili. In questo modo il compilatore può lavorare al meglio. Inoltre è buona regola prevedere le eccezioni, piuttosto che gestirle.

Il diabolico codice testato è il seguente:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestVoid
{
    public partial class _Default : System.Web.UI.Page
    {
        public const int n = 10000000;
        public const int nn = 100;
        protected void Page_Load(object sender, EventArgs e)
        {
            Conta();
            Conta1();
        } 
       public double Conta()
        {
            double i = 2;
            for (var iii = 0; iii < nn; iii++)
            {
                for (var ii = 0; ii < n; ii++) { i = i * i; }
            }
            return i;
        }
        public double Conta1()
        {
            double i = 2;
            for (var iii = 0; iii < nn; iii++)
            try
            {
                for (var ii = 0; ii < n; ii++) { i = i * i; }
            }
            catch
            {
                i = 0;
            }
            return i;
        }
    }
}

Alla fine il risultato non discosta dall’opinione del blog Programmers’ Heaven: 893,67 vs 875,50 millisecondi. In compilazione release la differenza è di 18,17 millisecondi. Vi sembrano tanti o rilevanti?

Tanto per non fare test esagerati ho provato anche con 10 milioni di loop x 100. Risultato? 88.958,76 vs 88.413,37 = 545,39 (traduzione: mezzo secondo!!!) su 1 miliardo di operazioni, una differenza dello 0,61%!

Loading Facebook Comments ...

5 pensieri su “c# Try/Catch cost

  1. Rosta

    Ottima osservazione.
    Però prova a pensare se invece di un sistema pc o server stai programmando un sistema embedded e/o realtime, magari mentre stai ricevendo dati a larga banda da un dispositivo.
    Anche qualche millesimo di secondo fa la differenza 😉
    Ciao!

    Rispondi
  2. Merlinox Autore articolo

    Ma per carità l’ottimizzazione è sacra. Ma ritengo che l’ottimizzazione stessa abbia dei costi. E se il costo di un certo tipo di programmazione non è in linea con il target bisogna pensarci bene prima di farlo.

    Se devi fare un vestito da 20 €, non lo fai in seta? E magari nemmeno fai le cuciture a mano. O sbaglio?

    Rispondi
  3. Rosta

    No, non sbagli. Purtroppo.
    Basta vedere certa “programmazione” che c’è in giro.
    Una volta un progettista hardware di sistemi embedded mi ha detto “meglio investire nell’hardware, che il software ha costo 0”.
    Tanto dopo ci sono le patch, i bug fixes…
    Si guadagna di più nella vendita o nei canoni di manutenzione? 😉
    Ciao!

    Rispondi
  4. Othello

    Beh…
    La differenza di performance tra i due blocchi di codice è effettivamente irrisoria, ma questo test dimostra che l’aggiunta di un try / catch non utilizzano non “pesa” così tanto.

    La vera differenza si nota tra due blocchi di codice che ottengono lo stesso risultato, ma in uno si usa il try / catch mentre l’altro evita l’errore programmaticamente.

    un esempio:
    http://appuntiamocelo.blogspot.com/2009/06/performance-quanto-pesa-un-trycatch-net.html

    Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *