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等。