using System; using System.Diagnostics; using System.Threading; namespace Recetas.CSharp.Cap04.R0411 { public sealed class RendimientoInterlocked { // Objeto para bloqueo en lock: private static Object bloqueo = new Object(); // Variable a sincronizar: private static int sincVariable = 0; // Iteraciones private static int iteraciones = 10000000; public static void Main() { // Creación cronómetro: Stopwatch cron1 = Stopwatch.StartNew(); // Uso de lock en un ciclo de 10000000 iteraciones: for (int i = 1; i <= iteraciones; ++i) { lock (bloqueo) { ++sincVariable; } } cron1.Stop(); // Creación de otro cronómetro: Stopwatch cron2 = Stopwatch.StartNew(); // Uso de Interlocked.Increment: for (int i = 1; i <= iteraciones; ++i) { Interlocked.Increment(ref sincVariable); } cron1.Stop(); // Muestra resultados en pantalla: Console.WriteLine ("\nValor total de `sincVariable`: {0}", sincVariable.ToString()); Console.WriteLine ("\tTiempo de uso de lock: {0}", ((double) (cron1.Elapsed.TotalMilliseconds * 1000000) / iteraciones).ToString("0.00 ns") ); Console.WriteLine ("\tTiempo de uso de Interlocked.Increment: {0}\n", ((double) (cron2.Elapsed.TotalMilliseconds * 1000000) / iteraciones).ToString("0.00 ns") ); } } }