try ... catch ou pas ?
Sur un des projets sur lequel je suis intervenu, un collègue ne souhaitait absolument pas utiliser de block Try ... Catch. L'argument était que c'était catastrophique au niveau performance y compris dans les cas où aucune exception n'était levée. J'ai donc fait un petit programme pour tester tout ça. Voyons ensemble les résultats.
|
|
Vu
3495
fois
|
Le programme utilisé
L'idée est de comparer un code utilisant le block try ... catch à un autre ne l'utilisant pas.
Voici celui que j'ai créé :
static void Main(string[] args) { Int64 tempsDebut = 1000000; int nbr = 10; bool multiplie = true; int start = 0; int stop = 0;
for(int j = 0; j < nbr; j++) { if (multiplie) { tempsDebut = tempsDebut * 2; } Console.WriteLine("Boucle = {0}", tempsDebut);
Console.WriteLine("Boucle sans try"); start = Environment.TickCount; for (int i = 0; i < tempsDebut; i++) { } stop = Environment.TickCount; Console.WriteLine(string.Format("Temps : {0} ms", new TimeSpan(stop - start).TotalMilliseconds));
Console.WriteLine("Boucle avec try"); start = Environment.TickCount; for (int i = 0; i < tempsDebut; i++) { try { } catch (Exception) { } } stop = Environment.TickCount; Console.WriteLine(string.Format("Temps : {0} ms", new TimeSpan(stop - start).TotalMilliseconds)); Console.WriteLine(); }
|
C'est vraiment très simple. J'ai fait deux boucles, l'une avec le block try ... catch et l'autre sans.
A chaque fois, j'affiche le temps passé dans la boucle.
J'ai une autre boucle qui permet de lancer le traitement plusieurs fois d'affilés ("nbr" fois) et, si la variable "multiplie" est à true, d'incrémenter le nombre d'itération à chaque fois.
Les résultats
Voici les résultats obtenus :
| Itérations |
Sans try (ms) |
Avec Try (ms) |
| 1000000 |
0 |
0 |
| 2000000 |
0,0015 |
0,0016 |
| 4000000 |
0,0015 |
0,0016 |
| 8000000 |
0,0031 |
0,0031 |
| 16000000 |
0,0063 |
0,0062 |
| 32000000 |
0,0109 |
0,0141 |
| 64000000 |
0,0203 |
0,0265 |
| 128000000 |
0,0421 |
0,0577 |
| 256000000 |
0,0858 |
0,1155 |
| 512000000 |
0,1747 |
0,2418 |
| 1024000000 |
0,3619 |
0,4633 |
et de façon plus visuel :

Conclusion
Au vu des résultats, on peut effectivement dire que l'utilisation des blocks try ... catch à un impact sur les performances même lorsqu'aucune exception n'est levée.
Cependant, cet impact ne peut-être considéré comme impactant à partir de plus de 200 000 000 (200 millions) d'itérations.
On va donc dire que pour une grande majorité de programme (site web, par exemple), cet impact est très largement négligeable. Seuls les concepteurs d'applications de traitement de volume peuvent considérer ces résultats et être amenés à limiter l'utilisation de ces blocks.
 |
|
Publié le
01/07/2009
|
|
Auteur:
Aleks
|
|
|