线程上下文切换的性能损耗测试

发表于:2014-6-18 11:42

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Ethan Cai    来源:51Testing软件测试网采编

  MultiThreadTester可以指定线程数,多个线程争抢计数。
1: class MultiThreadTester : ThreadTester
2:     {
3:         private Stopwatch _aStopWatch = new Stopwatch();
4:         private readonly int _threadCount = 0;
5:         private readonly object _counterLock = new object();
6:
7:         public MultiThreadTester(int threadCount)
8:         {
9:             this._threadCount = threadCount;
10:         }
11:
12:         public override void Start()
13:         {
14:             _aStopWatch.Start();
15:
16:             for (int i = 0; i < _threadCount; i++)
17:             {
18:                 Thread aThread = new Thread(() => WorkInThread());
19:                 aThread.Start();
20:             }
21:         }
22:
23:         public override long GetElapsedMillisecondsOfIncreaseCounter()
24:         {
25:             return this._aStopWatch.ElapsedMilliseconds;
26:         }
27:
28:         public override bool IsTesterRunning()
29:         {
30:             return _aStopWatch.IsRunning;
31:         }
32:
33:         private void WorkInThread()
34:         {
35:             while (true)
36:             {
37:                 lock (_counterLock)
38:                 {
39:                     if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
40:                     {
41:                         _aStopWatch.Stop();
42:                         break;
43:                     }
44:
45:                     this.IncreaseCounter();
46:                 }
47:             }
48:         }
49:     }
  Program的Main函数中,根据用户的选择来决定执行哪个测试类。
1: class Program
2:     {
3:         static void Main(string[] args)
4:         {
5:
6:             string inputText = GetUserChoice();
7:
8:             while (!"4".Equals(inputText))
9:             {
10:                 ThreadTester tester = GreateThreadTesterByInputText(inputText);
11:                 tester.Start();
12:
13:                 while (true)
14:                 {
15:                     Console.WriteLine(GetStatusOfThreadTester(tester));
16:                     if (!tester.IsTesterRunning())
17:                     {
18:                         break;
19:                     }
20:                     Thread.Sleep(100);
21:                 }
22:
23:                 inputText = GetUserChoice();
24:             }
25:
26:             Console.Write("Click enter to exit...");
27:         }
28:
29:         private static string GetStatusOfThreadTester(ThreadTester tester)
30:         {
31:             return string.Format("[耗时{0}ms] counter = {1}, {2}",
32:                     tester.GetElapsedMillisecondsOfIncreaseCounter(), tester.GetCounter(),
33:                     tester.IsTesterRunning() ? "running" : "stopped");
34:         }
35:
36:         private static ThreadTester GreateThreadTesterByInputText(string inputText)
37:         {
38:             switch (inputText)
39:             {
40:                 case "1":
41:                     return new SingleThreadTester();
42:                 case "2":
43:                     return new TwoThreadSwitchTester();
44:                 default:
45:                     return new MultiThreadTester(100);
46:             }
47:         }
48:
49:         private static string GetUserChoice()
50:         {
51:             Console.WriteLine(@"==Please select the option in the following list:==
52: 1. SingleThreadTester
53: 2. TwoThreadSwitchTester
54: 3. MultiThreadTester
55: 4. Exit");
56:
57:             string inputText = Console.ReadLine();
58:
59:             return inputText;
60:         }
61:     }
43/4<1234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号