繁体   English   中英

在Parallel.ForEach中传递列表

[英]Pass in lists in the Parallel.ForEach

这是我第一次尝试使用“ Parallel.ForEach”循环来查看是否可以使用系统中的许多内核来提高性能。 我试图看一下MSDN和其他示例,但是找不到以下3种列表的传递方法。

如何使用Parallel.ForEach循环交换此循环? 我想我正在寻找如何传递所有这三个列表的基础知识,以便可以在Parallel.ForEach循环中使用它们?

谢谢!

        List<double> nums = new List<double> { 0.0005, 0.00035, 0.00205 };
        List<double> list1 = new List<double>();
        List<double> list2 = new List<double>();
        List<double> list3 = new List<double>(); Random random = new Random(); double calc1 = 0;
        List<double> resultLIST = new List<double>();
        for (int i = 0; i < 4000000; i++)
        {
            list1.Add(nums[random.Next(0, 7)]);
            list2.Add(nums[random.Next(0, 7)]);
            list3.Add(nums[random.Next(0, 7)]);
        }

        //How can the below loop be replaced with a: Parallel.ForEach loop?
        for (int i = 0; i < list1.Count; i++)
        {
            calc1 = list1[i] * list2[i] * list3[i];
            resultLIST.Add(calc1);
        }

        //Now sort the list 
        resultLIST.Sort();

        //Here I will write "resultLIST" to a .txt file

我个人将LINQ与AsParallel使用:

var result = Enumerable.Range(0, list1.Count)
    .AsParallel()
    .Select(index => list1[index] + list2[index] + list3[index])
    .OrderBy(v => v)
    .ToList();

注意,在此计算期间,预计list1list2list3不会发生变化。

当每个列表上的操作可以并行运行时,可以使用Parallel.Foreach。 就您而言,您不能。 还要记住,对诸如*或+之类的琐碎操作使用Parallel.Foreach或AsParallel可能会降低性能,因为存在更多开销。

在您的情况下,最好的方法是将所有三个列表均分为1000000个元素。 将它们添加到一个数组数组中,并对其调用Parallel.Foreach。 这样,您将拥有4个线程,每个线程执行1000000次操作,如果您的计算机具有4个内核,则它们可以在每个内核上独立运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM