这种从平行线程报告进度的方法比锁更好还是更差

本文关键字:方法 更好 线程 报告 | 更新日期: 2023-09-27 18:32:50

我实现了一种从并行选择报告进度的方法。它工作正常。但是在查看了堆栈溢出类似问题的一些答案后,我想知道我的方法是否矫枉过正或是否有优点。

我目前的方法就像不报告进度并对整个集合执行 AsParrallel 一样快。但是,我的兴趣是 12 个线程的限制。这可能如何影响其他计算机的性能。

int count = ids.Count();
const int takeValue = 12;
List<ImportantDataDecorator> parrallel = new List<ImportantDataDecorator>();
for (int i = 0; ids.Count > 0; i += takeValue)
{
    int take = takeValue;
    if (take > ids.Count)
    {
        take = ids.Count;
    }
    var idsToProcess = ids.Take(takeValue);
    var processed = idsToProcess.AsParallel().Select(x =>
    {
        var value = GetValue(x, divBuffer, mask);
        return new ValueDecorator(value, x);
    }).ToList();
    parrallel.AddRange(processed);
    ids.RemoveRange(0, take);

    int remaining = i;
    float percent = (remaining/(float)count) * 100.0f;
    if (backgroundWorker != null)
    {
        backgroundWorker.ReportProgress((int) percent);
        if (backgroundWorker.CancellationPending)
            return;
    }
}

这种从平行线程报告进度的方法比锁更好还是更差

拆分工作并报告进度似乎不会占用太多计算时间。但是该应用程序正在做一些(即使很少(工作来做到这一点。

我目前的方法就像不报告进度和做一样快 整个系列的AsParrallel。

您可以使用更大的数据尝试您的方法,并对两种策略进行基准测试并选择更好的策略。

但是,拆分处理并执行报告进度的额外工作将花费您一些额外的时间(这对于非常大的数据来说会很明显(。您应该在报表是否为应用程序增加价值以弥补额外时间之间做出决定Progress

AsParallel()取决于各种因素,例如计算负载、系统内核数量等。这种特定方法可能会在您的系统中运行得更快,而在计算能力较低的系统上性能更差。
请参阅此链接以加快 PLINQ 的速度:https://msdn.microsoft.com/en-us/library/dd997399(v=vs.110(.aspx