【问题标题】:Timing of parallel actions using the Task Parallel Library in C#使用 C# 中的任务并行库对并行操作进行计时
【发布时间】:2012-05-09 18:32:55
【问题描述】:

我正在进行一些实验,对它们进行计时并比较时间以找到最佳“算法”。出现的问题是并行运行任务是否会使实验的相对运行时间错误,以及我是否可以通过按顺序运行它们来获得更具代表性的结果。这是代码的(简化)版本:

public static void RunExperient(IEnumerable<Action> experiments)
    {
        Parallel.ForEach(experiments, experiment =>
        {
            var sw = Stopwatch.StartNew(); //line 1
            experiment();                  //line 2   
            sw.Stop();                     //line 3
            Console.WriteLine(@"Time was {0}", sw.ElapsedMilliseconds);
        });
    }

我的问题是关于“幕后”发生的事情:

  1. 任务启动后,操作系统或框架是否有可能在任务执行期间暂停任务并继续执行,导致实验的运行时间全部出错?

  2. 按顺序运行实验能否获得更具代表性的结果?

【问题讨论】:

    标签: performance c#-4.0 task-parallel-library benchmarking


    【解决方案1】:

    这取决于您正在运行的机器以及实验的用途,但通常答案是肯定的,它们可能会相互影响。主要是通过资源匮乏。这是一个例子:

    public class Piggy { 
       public void GreedyExperiment() { 
           Thread.Priority = ThreadPriority.Highest;
           for (var i=0;i<1000000000;i++) {
               var j = Math.Sqrt(i / 5);
           }
       }
    }
    

    这将在高优先级线程上进行紧密循环,基本上会消耗一个处理器,直到完成。如果您的机器中只有一个处理器,而 TPL 决定在其上安排两个实验,那么另一个处理器将缺乏 CPU 时间。

    【讨论】:

    • 实际上,这是在普通优先级线程上调用 csrss.exe。工作中的优先级倒置:)
    • 当然,我会让工作更合适。重点仍然存在
    • 但这是否意味着其他任务根本无法启动?这不是问题,从那时起计时将不会启动。如果一个任务已经开始,然后另一个任务在第一个任务执行时接管,就会出现问题。这会发生吗? (似乎可以从您的回答中获得,但我只是想确定一下)
    • 顺便说一句,有没有一种简单的方法可以确保任务在处理器上单独运行(我有八个可供使用)
    • 你可以设置一个线程的处理器亲和性(msdn.microsoft.com/en-us/library/…),但是你还在争夺RAM、磁盘I/O、网络I/O等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    相关资源
    最近更新 更多