如何在运行时决定使用PLINQ还是LINQ?

3
要在一般情况下选择并行操作还是串行操作,很难在没有测试的情况下知道哪种实现方式最好,因为存在开销。显然,需要一些时间来训练“决策者”使用哪种方法。我认为这种方法不可能完美,因此具有概率性质。 x,y,z 对“决策者”有影响。我认为一个非常天真的实现方式是在开始时给予两种方法相等的机会,然后根据过去的表现开始偏爱其中一种。这忽略了 x,y,z。无论如何,请分享您的启发式方法、经验和技巧。
示例代码:
public interface IComputer {
    decimal Compute(decimal x, decimal y, decimal z);
}

public class SequentialComputer : IComputer {
    public decimal Compute( ... // sequential implementation
}

public class ParallelComputer : IComputer {
    public decimal Compute( ... // parallel implementation
}

public class HybridComputer  : IComputer {
    private SequentialComputer sc;
    private ParallelComputer pc;
    private TheDecider td;  // Helps to decide between the two.

    public HybridComputer() {
        sc = new SequentialComputer();
        pc = new ParallelComputer();
        td = TheDecider();
    }

    public decimal Compute(decimal x, decimal y, decimal z) {
        decimal result;
        decimal time;
        if (td.PickOneOfTwo() == 0) {
            // Time this and save result into time.
            result = sc.Compute(...);
        } else {
            // Time this and save result into time.
            result = pc.Compute();
        }
        td.Train(time);
        return result;
    }
}

好主意--但它确实有一个问题。如果用户在一个方法中执行其他耗时的操作,而在另一个方法中则没有怎么办?结果将是另一个进程窃取CPU时间的情况看起来比实际情况更糟糕。您需要使用某种方式来跟踪系统仅花费在您的进程上的时间。 - Billy ONeal
@Billy,好评论 - 继续。我撤回关于从业者的评论。 - Hamish Grubijan
有人提到硬编码...那可能是一种解决方法。我的问题是 - 我应该保留管道(if语句+测试)不变,以便在假设改变时轻松地切换开关吗?这不必成为博士论文。 - Hamish Grubijan
1个回答

1
我建议您移除计算机的特殊性,并在PLINQ代码中使用WithDegreeOfParallelism。如果您的决策者已经学习到不需要并行处理,则只需返回1即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接