0

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

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. 通过按顺序运行实验,我会得到更具代表性的结果吗?

4

1 回答 1

2

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

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 时间。

于 2012-05-09T18:35:24.253 回答