我正在尝试在多核虚拟机上测试多线程程序的线程执行。我为此编写了C#代码:
class Program
{
public static int fib(int n)
{
if (n < 2)
return n;
return fib(n-1)+fib(n-2);
}
public static void execution(object n)
{
int STEP = 40;
var start = DateTime.Now;
int value = fib(STEP);
var end = DateTime.Now;
Console.WriteLine(string.Format("threads: {0}, time : {1}, start: {2}, end: {3}", n, end.Subtract(start).TotalSeconds,
start, end));
}
static void Main(string[] args)
{
int[] threads = {1, 2, 4, 8, 16};
for(int j=0; j<5; ++j)
{
for (int i = 0; i < threads[j]; ++i)
{
var thread = new Thread(Program.execution);
thread.Start(threads[j]);
}
Thread.Sleep(60000);
}
}
这就是我得到的结果
线程:1,时间:4.2177734,开始:2014年2月8日晚上7:30:13,结束:2014年2月8日晚上7:30:18
线程:2,时间:4.1015625,开始:2014年2月8日7:31:13 PM,结束:2014年2月8日7:31:17 PM
线程:2,时间:4.2441407,开始:2/8/2014 7:31:13 PM,结束:2/8/2014 7:31:18 PM
线程:4,时间:2.0351562,开始:2014年2月8日下午7:32:13,结束:2014年2月8日下午7:32:15
线程:4,时间:2.0527343,开始:2014年2月8日下午7:32:13,结束:2014年2月8日下午7:32:15
线程:4,时间:2.0869141,开始:2/8/2014 7:32:13 PM,结束:2/8/2014 7:32:15 PM
线程:4,时间:2.0898437,开始:2014年2月8日下午7:32:13,结束:2014年2月8日下午7:32:15
线程:8,时间:3.34375,开始:2014年2月8日7:33:13 PM,结束:2014年2月8日7:33:17 PM
线程:8,时间:3.381836,开始:2/8/2014 7:33:13 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.3066406,开始:2/8/2014 7:33:14 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.2451172,开始:2014年2月8日7:33:14 PM,结束:2014年2月8日7:33:17 PM
线程:8,时间:3.4560547,开始:2/8/2014 7:33:13 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.5029296,开始:2014年2月8日7:33:13 PM,结束:2014年2月8日7:33:17 PM
线程:8,时间:3.2841796,开始:2014年2月8日7:33:14 PM,结束:2014年2月8日7:33:17 PM
线程:8,时间:3.4160157,开始:2/8/2014 7:33:14 PM,结束:2/8/2014 7:33:17 PM
线程:16,时间:5.9921875,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.4404297,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:5.3896484,开始:2014年2月8日晚上7:34:15,结束:2014年2月8日晚上7:34:20
线程:16,时间:5.9658203,开始:2014年2月8日7:34:14 PM,结束:2014年2月8日7:34:20 PM
线程:16,时间:5.9873047,开始:2014年2月8日下午7:34:14,结束:2014年2月8日下午7:34:20
线程:16,时间:6.2226563,开始:2014年2月8日7:34:14 PM,结束:2014年2月8日7:34:20 PM
线程:16,时间:6.1552735,开始:2014年2月8日下午7:34:14,结束:2014年2月8日下午7:34:20
线程:16,时间:6.5576172,开始:2014年2月8日7:34:14 PM,结束:2014年2月8日7:34:20 PM
线程:16,时间:6.5273437,开始:2014年2月8日下午7:34:14,结束:2014年2月8日下午7:34:20
线程:16,时间:6.2529297,开始:2014年2月8日下午7:34:14,结束:2014年2月8日下午7:34:20
线程:16,时间:6.2958984,开始:2014年2月8日7:34:14 PM,结束:2014年2月8日7:34:20 PM
线程:16,时间:5.8544922,开始:2014年2月8日晚上7:34:15,结束:2014年2月8日晚上7:34:20
线程:16,时间:6.3886719,开始:2014年2月8日下午7:34:14,结束:2014年2月8日下午7:34:20
线程:16,时间:5.7089844,开始:2014年2月8日下午7:34:15,结束:2014年2月8日下午7:34:20
线程:16,时间:6.7207031,开始:2014年2月8日7:34:14 PM,结束:2014年2月8日7:34:20 PM
线程:16,时间:6.0742188,开始:2014年2月8日晚上7:34:14,结束:2014年2月8日晚上7:34:21
请注意,我正在4核Windows 7虚拟机上运行该程序。
对我来说没有意义的是,当我同时运行4个线程时,与同时运行1个或2个线程时相比,每个线程花费的计算时间更少。
有人可以在这里解释吗?
操作系统为您的每个线程分配了一定数量的CPU运行时间。每个线程必须在队列中等待才能执行,该等待时间随着线程数量的增加而变长。另一方面,每个线程将获得更少的量子时间来执行。在虚拟多核环境中,这将更加明显,因为没有足够的物理核来同时执行线程。
另外,您应该考虑在线程之间进行上下文切换会带来成本,随着线程数量的增加,成本也会增加。因此,请避免在不使用应用程序的情况下在应用程序上运行许多线程
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句