Performance 使用C中的任务并行库对并行操作进行计时#

Performance 使用C中的任务并行库对并行操作进行计时#,performance,c#-4.0,task-parallel-library,benchmarking,Performance,C# 4.0,Task Parallel Library,Benchmarking,我正在进行一些实验,对它们进行计时并比较时间,以找到最佳的“算法”。出现的问题是,并行运行这些任务是否会导致实验的相对运行时间错误,以及我是否会通过顺序运行它们来获得更具代表性的结果。以下是代码的(简化)版本: public static void RunExperient(IEnumerable<Action> experiments) { Parallel.ForEach(experiments, experiment => {

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

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);
        });
    }
publicstaticvoid运行体验(IEnumerable实验)
{
Parallel.ForEach(实验,实验=>
{
var sw=Stopwatch.StartNew();//第1行
实验();//第2行
sw.Stop();//第3行
WriteLine(@“Time was{0}”,sw.elapsedmillesons);
});
}
我的问题是关于“幕后”发生了什么:

  • 任务启动后,操作系统或框架是否可能在任务执行期间暂停任务,然后继续执行,从而导致实验的运行时间完全错误

  • 通过按顺序进行实验,我会得到更具代表性的结果吗


  • 这取决于你正在运行的机器和实验所做的,但通常答案是肯定的,它们可能会相互影响。主要是由于资源匮乏。下面是一个例子:

    public class Piggy { 
       public void GreedyExperiment() { 
           Thread.Priority = ThreadPriority.Highest;
           for (var i=0;i<1000000000;i++) {
               var j = Math.Sqrt(i / 5);
           }
       }
    }
    
    公共类Piggy{
    公共无效GreedExperiment(){
    Thread.Priority=ThreadPriority.Highest;
    
    对于(var i=0;实际上,这是在正常优先级线程上调用csrss.exe。工作时优先级反转:)当然,我会让这项工作更合适。这一点仍然值得思考,但这是否意味着其他任务根本不会启动?这不是问题,因为时间不会从第十八个开始。如果一个任务已经启动,问题就会出现,然后在第一个任务执行时另一个任务接管。会发生这种情况吗?(从你的回答来看似乎可以,但我只是想确定)顺便问一下,有没有一种简单的方法可以确保任务在处理器上单独运行(我有八个任务可供使用)你可以设置线程()的处理器关联性,但你仍然在争夺RAM、磁盘I/O、网络I/O等。