c# - 多核处理器上的多线程奇怪的结果

标签 c# multithreading

我正在尝试在多核虚拟机上测试多线程程序的线程执行。我为它编写了 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/

相关文章:

c# - 分类时,NEST搜索元数据丢失

c# - 实现 Azure 共置缓存

c# - 这可以通过 javascript 实现吗?

c# - 如何将 en-US 日期更改为 en-GB for asp.net?

ios - 显示 UIAlert 会使应用程序崩溃吗?

c++ - 为处于挂起状态的线程调用 TerminateThread C++

c# - 使用 .NET 的 ANSI 着色控制台输出

c# - .net 消息循环

c++ - 需要对条件变量寻求的互斥保护(原子)赋值吗?

java - Thread.sleep() 保证等待吗?