4 Réponses :


0
votes

Je dois croire que l'utilisation par rapport à Type / Catch ne va pas faire de différence performance sage par rapport au code que vous utilisez dans ces constructions.


0 commentaires

2
votes

en utilisant compile dans essayer / attrape / enfin . Je ne vois vraiment pas qu'il y ait une différence sémantique ou de performance, tant que vous disposez correctement de disposer de votre objet dans le cas d'un manuel Essayez / attrape . .

Dans tous les cas, allez avec à l'aide de , voir comme les nettoyages automatiquement (en réalité dans la clause enfin ) pour vous. Même s'il y a une différence de performance, il est probablement si minime que vous ayez de meilleurs endroits pour optimiser.


0 commentaires

0
votes

Essayer / Catch / Enfin est plus rapide.

1) 6.638 sec: à l'aide de tag
2) 6.265 Sec: Essayez / enfin P>

J'ai couru sur une douzaine de fois. Essayer / Catch / Finalement est toujours sorti sur le dessus. P>

DateTime start = DateTime.Now;
for (int i = 0; i < 50000000; i++)
{
    using (MemoryStream s = new MemoryStream())
    {
        s.WriteByte(1);
    }
}
Console.WriteLine(DateTime.Now.Subtract(start) + " seconds");
start = DateTime.Now;
for (int i = 0; i < 50000000; i++)
{
    MemoryStream s = null;
    try
    {
        s = new MemoryStream();
        s.WriteByte(1);
    }
    catch { }
    finally
    {
        if (s != null) s.Dispose();
    }
}
Console.WriteLine(DateTime.Now.Subtract(start) + " seconds");


2 commentaires

Le repère a des problèmes. Les plus importants sont: utiliser un chronomètre pour mesurer et non datetime.now . chronomètre utilise un compteur de performance et vous donne une précision plus haute. Ensuite, exécutez le code sans mesurer en premier, il pourrait y avoir un temps d'échauffement de votre échantillon mesuré.


En fait, vous obtiendrez le résultat opposé si vous mettez d'abord l'essai / enfin pour la boucle de votre code, puis mesurez la boucle d'utilisation.



9
votes

Il n'y aura pas de différence de performance. en utilisant code> est développé par le compilateur à un blocage / enfin.

Vous verrez que les deux méthodes suivantes compilent d'IL identique IL. P>

.method private hidebysig instance void  SampleWithTryFinally() cil managed
{
  // Code size       26 (0x1a)
  .maxstack  2
  .locals init ([0] class [mscorlib]System.IO.MemoryStream s)
  IL_0000:  newobj     instance void [mscorlib]System.IO.MemoryStream::.ctor()
  IL_0005:  stloc.0
  .try
  {
    IL_0006:  ldloc.0
    IL_0007:  ldc.i4.1
    IL_0008:  callvirt   instance void [mscorlib]System.IO.Stream::WriteByte(uint8)
    IL_000d:  leave.s    IL_0019
  }  // end .try
  finally
  {
    IL_000f:  ldloc.0
    IL_0010:  brfalse.s  IL_0018
    IL_0012:  ldloc.0
    IL_0013:  callvirt   instance void [mscorlib]System.IO.Stream::Dispose()
    IL_0018:  endfinally
  }  // end handler
  IL_0019:  ret
} // end of method Program::SampleWithTryFinally


2 commentaires

Vous manquez la capture là-bas.


@Jojaba: Eh bien, j'ai décidé d'aller sans attraper dans l'exemple de simplicité. Si vous vous attendez à ce que le corps de la déclaration utilise, vous pouvez ajouter un essai / attraper. Mais veuillez noter que pour une comparaison équitable, vous devez ajouter les captures aux deux méthodes, c'est-à-dire ajouter une capture à l'essai / enfin la version et Ajoutez un bloc d'essai / attraper à l'intérieur ou à l'extérieur de l'instruction Utilisation. bien.