fork download
  1. using System;
  2. using System.Diagnostics;
  3. using System.Threading;
  4.  
  5. namespace Recetas.CSharp.Cap04.R0411
  6. {
  7. public sealed class RendimientoInterlocked
  8. {
  9. // Objeto para bloqueo en lock:
  10. private static Object bloqueo = new Object();
  11. // Variable a sincronizar:
  12. private static int sincVariable = 0;
  13. // Iteraciones
  14. private static int iteraciones = 10000000;
  15.  
  16. public static void Main()
  17. {
  18. // Creación cronómetro:
  19. Stopwatch cron1 = Stopwatch.StartNew();
  20.  
  21. // Uso de lock en un ciclo de 10000000 iteraciones:
  22. for (int i = 1; i <= iteraciones; ++i)
  23. {
  24. lock (bloqueo)
  25. {
  26. ++sincVariable;
  27. }
  28. }
  29. cron1.Stop();
  30.  
  31. // Creación de otro cronómetro:
  32. Stopwatch cron2 = Stopwatch.StartNew();
  33.  
  34. // Uso de Interlocked.Increment:
  35. for (int i = 1; i <= iteraciones; ++i)
  36. {
  37. Interlocked.Increment(ref sincVariable);
  38. }
  39. cron1.Stop();
  40.  
  41. // Muestra resultados en pantalla:
  42. Console.WriteLine ("\nValor total de `sincVariable`: {0}", sincVariable.ToString());
  43. Console.WriteLine ("\tTiempo de uso de lock: {0}",
  44. ((double) (cron1.Elapsed.TotalMilliseconds * 1000000) / iteraciones).ToString("0.00 ns")
  45. );
  46. Console.WriteLine ("\tTiempo de uso de Interlocked.Increment: {0}\n",
  47. ((double) (cron2.Elapsed.TotalMilliseconds * 1000000) / iteraciones).ToString("0.00 ns")
  48. );
  49. }
  50. }
  51. }
Success #stdin #stdout 0.3s 33992KB
stdin
Standard input is empty
stdout
Valor total de `sincVariable`: 20000000
	Tiempo de uso de lock: 17.09 ns
	Tiempo de uso de Interlocked.Increment: 12.42 ns