using System; using System.Threading; class Test { interface ITest { String desc { get; } void runTest(); } class StraightThroughTest : ITest { int j; public String desc { get { return "StraightThroughTest"; } } public void runTest() { for (int i = 0; i < 100000; i += 1) { lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; lock (this) j = i; } } } class ContentionTest : ITest { int j; public String desc { get { return "ContentionTest"; } } public void runTest() { Thread t1 = new Thread(new ThreadStart(this.run)); t1.Start(); this.run(); t1.Join(); } Object o1 = new Object(); Object o2 = new Object(); public void run() { for (int i = 0; i < 100000; i += 1) { lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; lock (o1) j = i; lock (o2) j = i; } } } class WaitTest : ITest { public String desc { get { return "WaitTest"; } } public void runTest() { Monitor.Enter(o2); Thread t1 = new Thread(new ThreadStart(this.run1)); t1.Start(); Monitor.Wait(o2); this.run2(); t1.Join(); } const int loops = 100000; Object o1 = new Object(); Object o2 = new Object(); public void run1() { Monitor.Enter(o2); Monitor.Pulse(o2); for (int i = 0; i < WaitTest.loops; i += 1) { Monitor.Enter(o1); Monitor.Exit(o2); Monitor.Wait(o1); Monitor.Enter(o2); Monitor.Exit(o1); Monitor.Pulse(o2); } Monitor.Pulse(o2); Monitor.Exit(o2); } public void run2() { for (int i = 0; i < WaitTest.loops; i += 1) { Monitor.Enter(o1); Monitor.Exit(o2); Monitor.Pulse(o1); Monitor.Enter(o2); Monitor.Exit(o1); Monitor.Wait(o2); } Monitor.Exit(o2); } } static void Main() { ITest[] tests = new ITest[] { new StraightThroughTest(), new ContentionTest(), new WaitTest(), }; for (int i = 0; i < 5; i += 1) { foreach (ITest test in tests) runATest(test); } } static void runATest(ITest test) { Console.Write(test.desc + ": "); DateTime start = DateTime.Now; test.runTest(); Console.WriteLine(DateTime.Now.Subtract(start).ToString()); } }