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")
);
}
}
}