4 Réponses :
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. P>
Dans tous les cas, allez avec en utilisant code> compile dans
essayer code> /
attrape code> /
enfin code>. 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 code> /
attrape p>. P>.
à l'aide de code>, voir comme les nettoyages automatiquement (en réalité dans la clause
enfin code>) 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. P>
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");
Le repère a des problèmes. Les plus importants sont: utiliser un chronomètre code> pour mesurer et non
datetime.now code>.
chronomètre code> 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.
Il n'y aura pas de différence de performance. Vous verrez que les deux méthodes suivantes compilent d'IL identique IL. P> en utilisant code> est développé par le compilateur à un blocage / enfin.
.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
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 i> Ajoutez un bloc d'essai / attraper à l'intérieur ou à l'extérieur de l'instruction Utilisation. bien.
Le
en utilisant une balise code> beaucoup plus rapidement. M'a sauvé environ 5 secondes de frappe.