我正在尝试在多核虚拟机上测试多线程程序的线程执行。我为它编写了 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,开始:2/8/2014 7:30:13 PM,结束:2/8/2014 7:30:18 PM
线程:2,时间:4.1015625,开始:2/8/2014 7:31:13 PM,结束:2/8/2014 7:31:17 PM
线程:2,时间:4.2441407,开始:2/8/2014 7:31:13 PM,结束:2/8/2014 7:31:18 PM
线程:4,时间:2.0351562,开始:2/8/2014 7:32:13 PM,结束:2/8/2014 7:32:15 PM
线程:4,时间:2.0527343,开始:2/8/2014 7:32:13 PM,结束:2/8/2014 7:32:15 PM
线程:4,时间:2.0869141,开始:2/8/2014 7:32:13 PM,结束:2/8/2014 7:32:15 PM
线程:4,时间:2.0898437,开始:2/8/2014 7:32:13 PM,结束:2/8/2014 7:32:15 PM
线程:8,时间:3.34375,开始:2/8/2014 7:33:13 PM,结束:2/8/2014 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,开始:2/8/2014 7:33:14 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.4560547,开始:2/8/2014 7:33:13 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.5029296,开始:2/8/2014 7:33:13 PM,结束:2/8/2014 7:33:17 PM
线程:8,时间:3.2841796,开始:2/8/2014 7:33:14 PM,结束:2/8/2014 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,开始:2/8/2014 7:34:15 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:5.9658203,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:5.9873047,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.2226563,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.1552735,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.5576172,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.5273437,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.2529297,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.2958984,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:5.8544922,开始:2/8/2014 7:34:15 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.3886719,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:5.7089844,开始:2/8/2014 7:34:15 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.7207031,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:20 PM
线程:16,时间:6.0742188,开始:2/8/2014 7:34:14 PM,结束:2/8/2014 7:34:21 PM
请注意,我正在 4 核 Windows 7 虚拟机上运行该程序。
对我来说没有意义的是,当我同时运行 4 个线程时,每个线程花费的计算时间比我同时运行 1 或 2 个线程时要少。
谁能解释一下?
最佳答案
这可能是因为优化器在您到达那里之前并没有真正达到目标。尝试添加一些调用以首先将其扭曲到程序的开头以获得更一致的结果。我只有一个双核,所以我得到的结果与你展示的结果非常不同,所以我不能更精确。
for (int r = 0; r < 20; r++)
fib(40);
关于c# - 多核处理器上的多线程奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653702/