多核多线程处理结果怪异

用户名

我正在尝试在多核虚拟机上测试多线程程序的线程执行。我为此编写了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个线程时相比,每个线程花费的计算时间更少。

有人可以在这里解释吗?

贝拉德·法西(Behrad Farsi)

操作系统为您的每个线程分配了一定数量的CPU运行时间。每个线程必须在队列中等待才能执行,该等待时间随着线程数量的增加而变长。另一方面,每个线程将获得更少的量子时间来执行。在虚拟多核环境中,这将更加明显,因为没有足够的物理核来同时执行线程。

另外,您应该考虑在线程之间进行上下文切换会带来成本,随着线程数量的增加,成本也会增加。因此,请避免在不使用应用程序的情况下在应用程序上运行许多线程

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用openMP进行多核处理与多线程

来自分类Dev

具有超线程的多核处理器上的多线程程序

来自分类Dev

多处理结果列表

来自分类Dev

GooglePlus登录处理结果

来自分类Dev

linux命令的处理结果

来自分类Dev

多线程-多核处理器真的在进行并行处理吗?

来自分类Dev

具有单核处理器的多线程代码和具有多核处理器的单线程代码

来自分类Dev

CompletableFuture:异步调用后,在当前线程中处理结果

来自分类Dev

如何异步等待网络请求完成,而在主线程中处理结果?

来自分类Dev

多核系统上的C ++多线程

来自分类Dev

Ipython Notebook上的多核和多线程

来自分类Dev

多核系统上的C ++多线程

来自分类Dev

Android-Loopj取消处理结果

来自分类Dev

如何从forkJoin返回处理结果

来自分类Dev

来自 ReactiveX Observable 的批处理结果

来自分类Dev

Ruby多线程的怪异行为

来自分类Dev

变量和多线程的怪异问题

来自分类Dev

多线程进程是多核还是单核的两倍速度?

来自分类Dev

多线程应用程序中的多核JIT

来自分类Dev

Python中多处理后的后处理结果

来自分类Dev

等待承诺完成,然后再处理结果

来自分类Dev

使用jQuery的POST表单并处理结果

来自分类Dev

Libreoffice headless处理结果未返回,但等待超时

来自分类Dev

Java和Matlab的不同图像处理结果

来自分类Dev

执行多个Windows cmd命令并存储处理结果

来自分类Dev

T-SQL:处理结果周期并按组计数

来自分类Dev

返回处理结果后无法触发取消按钮操作

来自分类Dev

来自Java和Matlab的不同图像处理结果

来自分类Dev

根据行数选择文件并处理结果