使用Parallel.For搜索最小值/最大值

佩罗12
object _ = new object();
List<int> list = new List<int>(new int {1,25,3....18,255}); //random values
int bestIndex = 0;
int bestValue = int.MinValue;
Parallel.For(0, list.Length, (i) => {
    if (list[i] > bestValue)
    {
        lock (_)
        {
            bestValue = list[i];
            index = i;
        }
    }
});

我的问题是,这有意义吗?因为我怀疑在某些情况下,即使不应该分配较低的值,它也会被分配。

离开

您的代码不是线程安全的,因为您正在从多个线程读取和写入相同的值。您还在非常紧密的循环中使用锁,这很可能会导致开销比并行执行锁要高得多。我也建议不要将其_用作变量名称,因为它在c#7中用于Discard

正确的解决方案是并行运行多个独立搜索,然后对每个线程的结果进行最终比较。

         var globalMin = int.MaxValue;
         var lockObj = new object();
         Parallel.ForEach(list,
             // LocalInit, runs once for each thread
             () => int.MaxValue, 
             // The parallel body, runs on multiple threads
             (value, _, localMin) =>
             {
                 if (value < localMin)
                 {
                     return value;
                 }
                 return localMin;
             }, 
             // Local finally, runs once for each thread,
             // given the final result produced on that thread
             localMin =>
             {
                 lock (lockObj)
                 {
                     if (localMin < globalMin)
                     {
                         globalMin = localMin;
                     }
                 }

             });
         return globalMin;

但是,这有点长且复杂,可以选择使用linq:

list.AsParallel().Min();

编辑:我想补充一点,对于这样一个简单的任务,使用并行算法不太可能获得很多性能,至少对于原始类型而言。一次执行大量工作时,并行运行事物最有用,因此同步开销仅占整体工作的一小部分。您可以对列表进行一些手动分区,以确保每次迭代都可以做更多的工作以提高性能。但是,除非您有非常庞大的清单,否则通常不值得付出努力。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用最小值和最大值的置信带

来自分类Dev

使用awk的最大值和最小值

来自分类Dev

使用Comparable查找最大值/最小值

来自分类Dev

使用if语句过滤最小值/最大值R

来自分类Dev

使用awk提取最大值和最小值

来自分类Dev

使用awk查找最小值和最大值?

来自分类Dev

使用Python的字典的最大值和最小值

来自分类Dev

使用 xpath 获取元素的最小值/最大值

来自分类Dev

与同时使用最小值和最大值相比,此函数同时检索最小值和最大值的速度快吗?

来自分类Dev

如何使用Highchart自动计算的最小值和最大值,除非它们高于或低于预定义的最小值和最大值

来自分类Dev

ggplot:使用类别值(最小值和最大值)添加geom_rect

来自分类Dev

Excel:使用什么公式返回一组查找值的最小值或最大值?

来自分类Dev

使用方括号获取表达式的最小值和最大值

来自分类Dev

使用SQL显示组内的最小值和最大值

来自分类Dev

找出两个数的最大值和最小值,而不使用“是否”?

来自分类Dev

在一次传递数据中使用pyspark查找最小值/最大值

来自分类Dev

如何使用numpy在可变长度数组中查找最小值/最大值?

来自分类Dev

cv.IntRanges中使用的cv。标量(最小值)和(最大值)是什么

来自分类Dev

如何使用LINQ以删除列表中的最小值和最大值

来自分类Dev

如何使用runif()生成最小值和最大值?

来自分类Dev

如何使用javascript中的范围在最小值和最大值之间创建刻度?

来自分类Dev

如何使用Dplyr的Summarize以及which()查找最小值/最大值

来自分类Dev

如何使用DocumentFilter设置可以在Jformattedtextfield中输入的最大值和最小值?

来自分类Dev

使用awk或shell脚本在局部极值中找到全局最小值/最大值

来自分类Dev

使用Linq从数据库中获取项目的最小值和最大值

来自分类Dev

使用node.js sdk从dynamoDb获取最小值和最大值

来自分类Dev

遍历名称列表并使用最小值/最大值创建新列表

来自分类Dev

如何使用iOS图表设置x轴的最小值和最大值

来自分类Dev

使用半已知键在ArrayList的HashMap中查找最大值和最小值-Java

Related 相关文章

  1. 1

    使用最小值和最大值的置信带

  2. 2

    使用awk的最大值和最小值

  3. 3

    使用Comparable查找最大值/最小值

  4. 4

    使用if语句过滤最小值/最大值R

  5. 5

    使用awk提取最大值和最小值

  6. 6

    使用awk查找最小值和最大值?

  7. 7

    使用Python的字典的最大值和最小值

  8. 8

    使用 xpath 获取元素的最小值/最大值

  9. 9

    与同时使用最小值和最大值相比,此函数同时检索最小值和最大值的速度快吗?

  10. 10

    如何使用Highchart自动计算的最小值和最大值,除非它们高于或低于预定义的最小值和最大值

  11. 11

    ggplot:使用类别值(最小值和最大值)添加geom_rect

  12. 12

    Excel:使用什么公式返回一组查找值的最小值或最大值?

  13. 13

    使用方括号获取表达式的最小值和最大值

  14. 14

    使用SQL显示组内的最小值和最大值

  15. 15

    找出两个数的最大值和最小值,而不使用“是否”?

  16. 16

    在一次传递数据中使用pyspark查找最小值/最大值

  17. 17

    如何使用numpy在可变长度数组中查找最小值/最大值?

  18. 18

    cv.IntRanges中使用的cv。标量(最小值)和(最大值)是什么

  19. 19

    如何使用LINQ以删除列表中的最小值和最大值

  20. 20

    如何使用runif()生成最小值和最大值?

  21. 21

    如何使用javascript中的范围在最小值和最大值之间创建刻度?

  22. 22

    如何使用Dplyr的Summarize以及which()查找最小值/最大值

  23. 23

    如何使用DocumentFilter设置可以在Jformattedtextfield中输入的最大值和最小值?

  24. 24

    使用awk或shell脚本在局部极值中找到全局最小值/最大值

  25. 25

    使用Linq从数据库中获取项目的最小值和最大值

  26. 26

    使用node.js sdk从dynamoDb获取最小值和最大值

  27. 27

    遍历名称列表并使用最小值/最大值创建新列表

  28. 28

    如何使用iOS图表设置x轴的最小值和最大值

  29. 29

    使用半已知键在ArrayList的HashMap中查找最大值和最小值-Java

热门标签

归档