OVH Cloud OVH Cloud

.NET et les exceptions

21 réponses
Avatar
patrick.duvanel
Bonjour,

J'ai un code de couche m=E9tier dont l'ex=E9cution est tr=E8s longue alors
qu'il ne fait que comparer des donn=E9es, moins d'un millier. Je
suspecte, les exception try{}catch{} d'=EAtre =E0 l'origine de ce
probl=E8me. Est-ce que qqn peut m'en dire plus sur cette possible
probl=E9matique ?

Merci et cordialement.

Patrick

10 réponses

1 2 3
Avatar
Antoine Polatouche
> J'ai fait les tests comme ça:



Après correction du code pour qu'il fasse ce qu'il devait faire, les
différences sont de 1.250 à 1.265 en faveur de la version sans try/catch
Avatar
Michael Moreno
> Après correction du code pour qu'il fasse ce qu'il devait faire, les
différences sont de 1.250 à 1.265 en faveur de la version sans try/catch



Sachant que Datetime.Now est precis de l'ordre de 10 a 15 ms on ne peut
rien conclure.

--
Michael
----
http://michael.moreno.free.fr/
http://port.cogolin.free.fr/
Avatar
Antoine Polatouche
Michael Moreno a écrit :
Après correction du code pour qu'il fasse ce qu'il devait faire, les
différences sont de 1.250 à 1.265 en faveur de la version sans try/catch



Sachant que Datetime.Now est precis de l'ordre de 10 a 15 ms on ne peut
rien conclure.




C'est une moyenne.
Avatar
zoltix
Antoine Polatouche wrote:
Michael Moreno a écrit :

Après correction du code pour qu'il fasse ce qu'il devait faire, les
différences sont de 1.250 à 1.265 en faveur de la version sans try/catch



Sachant que Datetime.Now est precis de l'ordre de 10 a 15 ms on ne peut
rien conclure.





C'est une moyenne.



je viens de faire les tests en modifiant le code pour chez moi chez moi
avec une boucle 10000000 qui devrait faire une bonne moyenne et
effectivement le résultat ..........

using System;

namespace ConsoleApplication1
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
DateTime dt0 = DateTime.Now;
DateTime dt1;
TimeSpan ts1 = new TimeSpan();
TimeSpan ts2 = new TimeSpan();
DateTime date;

int i;
for (i = 0; i < 10000000; i++)
{
try
{
date = DateTime.ParseExact("01092006", "MMddyyyy",null);
} catch {
date = DateTime.Now;
}
dt1 = DateTime.Now;
ts1 = dt1 - dt0;
}
dt0 = DateTime.Now;
for (i = 0; i < 10000000; i++)
{
date = DateTime.ParseExact("01092006", "MMddyyyy", null);
}
dt1 = DateTime.Now;
ts2 = dt1 - dt0;
Console.Write("with: {0}s {1}msnwithout: {0}s {1}ms",
Console.ReadLine();
}
}
}



with: 12s 463ms
without: 12s 463ms

Meme chose..
Avatar
Antoine Polatouche
zoltix a écrit :
je viens de faire les tests en modifiant le code pour chez moi chez moi
avec une boucle 10000000 qui devrait faire une bonne moyenne et
effectivement le résultat ..........


Mais tu as recopié mon erreur:

Console.Write("with: {0}s {1}msnwithout: {0}s {1}ms",



Il faut penser à mettre {2} et {3} sinon le résultat est un peu faussé ;-)

Le code corrigé:
{
DateTime date;

DateTime dt0 = new DateTime();
DateTime dt1 = new DateTime();
TimeSpan ts1 = new TimeSpan();
TimeSpan ts2 = new TimeSpan();
int i,imax = 1000000;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
try
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
catch
{
date = DateTime.Now;
}
}
dt1 = DateTime.Now;
ts1 = dt1 - dt0;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
dt1 = DateTime.Now;
ts2 = dt1 - dt0;

MessageBox.Show(string.Format("with: {0}s {1}msnwithout: {2}s {3}ms",
ts1.Seconds, ts1.Milliseconds, ts2.Seconds, ts2.Milliseconds));
}
Avatar
Patrice Manac'h
Bonsoir,

peut être que Ticks ferait mieux l'affaire :
http://msdn2.microsoft.com/fr-fr/library/system.datetime.ticks.aspx

Cdt,

P. Manac'h
MCS France

"Antoine Polatouche" a écrit dans le message de news:
ed6n5t$2lqr$
zoltix a écrit :
je viens de faire les tests en modifiant le code pour chez moi chez moi
avec une boucle 10000000 qui devrait faire une bonne moyenne et
effectivement le résultat ..........


Mais tu as recopié mon erreur:

Console.Write("with: {0}s {1}msnwithout: {0}s {1}ms",



Il faut penser à mettre {2} et {3} sinon le résultat est un peu faussé ;-)

Le code corrigé:
{
DateTime date;

DateTime dt0 = new DateTime();
DateTime dt1 = new DateTime();
TimeSpan ts1 = new TimeSpan();
TimeSpan ts2 = new TimeSpan();
int i,imax = 1000000;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
try
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
catch
{
date = DateTime.Now;
}
}
dt1 = DateTime.Now;
ts1 = dt1 - dt0;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
dt1 = DateTime.Now;
ts2 = dt1 - dt0;

MessageBox.Show(string.Format("with: {0}s {1}msnwithout: {2}s {3}ms",
ts1.Seconds, ts1.Milliseconds, ts2.Seconds, ts2.Milliseconds));
}


Avatar
Antoine Polatouche
Patrice Manac'h a écrit :
Bonsoir,

peut être que Ticks ferait mieux l'affaire :
http://msdn2.microsoft.com/fr-fr/library/system.datetime.ticks.aspx




Pour mesurer des durées de plusieurs secondes, ça n'a pas d'importance.
Si il y avait besoin de plus de rigueur, il faudrait plutôt s'assurer
que les boucles aient tout le CPU à leur disposition, et que le GC ne se
déclenche pas pendant une des boucles ;-)
Avatar
Gilles TOURREAU
Antoine Polatouche avait énoncé :
zoltix a écrit :
je viens de faire les tests en modifiant le code pour chez moi chez moi
avec une boucle 10000000 qui devrait faire une bonne moyenne et
effectivement le résultat ..........


Mais tu as recopié mon erreur:

Console.Write("with: {0}s {1}msnwithout: {0}s {1}ms",



Il faut penser à mettre {2} et {3} sinon le résultat est un peu faussé ;-)

Le code corrigé:
{
DateTime date;

DateTime dt0 = new DateTime();
DateTime dt1 = new DateTime();
TimeSpan ts1 = new TimeSpan();
TimeSpan ts2 = new TimeSpan();
int i,imax = 1000000;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
try
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
catch
{
date = DateTime.Now;
}
}
dt1 = DateTime.Now;
ts1 = dt1 - dt0;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
dt1 = DateTime.Now;
ts2 = dt1 - dt0;

MessageBox.Show(string.Format("with: {0}s {1}msnwithout: {2}s {3}ms",
ts1.Seconds, ts1.Milliseconds, ts2.Seconds, ts2.Milliseconds));
}



Si vous utilisez le framework 2.0, vous pouvez utiliser le StopWatch de
l'assembly System.Diagnostics

Cordialement

--
Gilles TOURREAU
Responsable informatique


Société P.O.S
Spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
zoltix
Antoine Polatouche wrote:
zoltix a écrit :

je viens de faire les tests en modifiant le code pour chez moi chez moi
avec une boucle 10000000 qui devrait faire une bonne moyenne et
effectivement le résultat ..........



Mais tu as recopié mon erreur:


Console.Write("with: {0}s {1}msnwithout: {0}s {1}ms",




Il faut penser à mettre {2} et {3} sinon le résultat est un peu faussé ;-)

Le code corrigé:
{
DateTime date;

DateTime dt0 = new DateTime();
DateTime dt1 = new DateTime();
TimeSpan ts1 = new TimeSpan();
TimeSpan ts2 = new TimeSpan();
int i,imax = 1000000;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
try
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
catch
{
date = DateTime.Now;
}
}
dt1 = DateTime.Now;
ts1 = dt1 - dt0;

dt0 = DateTime.Now;
for (i = 0; i < imax; i++)
{
date = DateTime.ParseExact("01/09/2006", "dd/MM/yyyy", null);
}
dt1 = DateTime.Now;
ts2 = dt1 - dt0;

MessageBox.Show(string.Format("with: {0}s {1}msnwithout: {2}s {3}ms",
ts1.Seconds, ts1.Milliseconds, ts2.Seconds, ts2.Milliseconds));
}


Oupsssssss
Voici mes résultalts ...........
with: 3s 74ms
without: 1s 301ms

je ne comprends plus bien ........; donc ca influance quand meme ?....
Avatar
Antoine Polatouche
zoltix a écrit :
Voici mes résultalts ...........
with: 3s 74ms
without: 1s 301ms

je ne comprends plus bien ........; donc ca influance quand meme ?....



Tu as ça en faisant plusieurs fois le test ?
Sur ma machine, ce sont des temps comparables, des fois c'est avac le
try/catch que c'est le plus rapide, mais en moyenne c'est 1% plus rapide
sans.
1 2 3