Parallel.For vs for循环

时间:2016-03-09 18:03:38

标签: c# for-loop parallel.for

我正在绕着并行的线程缠绕我的头,所以我决定在较小的基础上测试它,然后在我舒服的时候展开。我正在对自己进行相同的处理;一个使用Parallel.For,另一个使用基本for循环。我正在捕捉比较的时间(以滴答为单位)。示例代码采用数组(在本例中为53个两个字符串)并使用数组填充给定的ListBox

对我来说几乎没有意义的是,当我运行基本的For循环时,它会产生平均1,400个滴答,但是当我运行Parallel.For循环时,它平均返回5,200个滴答。样本量是否太小,以使并行有效?

以下是我使用的两个片段。 Parallel.For循环是:

public void ListboxFromArray(ListBox listbox, string[] array1)
{
    // This method takes an array and fills a listbox full of items from the array
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();

    Parallel.For(0, array1.Count(),
    index =>
    {
        listbox.Items.Add(array1[index]);
    });
    stopWatch.Stop();
    long ts = stopWatch.ElapsedTicks;
    string elapsedTime = ts.ToString() + " Ticks"; ;
    MessageBox.Show(elapsedTime);

}

for循环是:

public void ListboxFromArray(ListBox listbox, string[] array1)
{
    // This method takes an array and fills a listbox full of items from the array
    Stopwatch stopWatch = new Stopwatch();
    stopWatch.Start();

    for (int i = 0; i < array1.Count(); i++)
    {
        listbox.Items.Add(array1[i]);
    }
    stopWatch.Stop();
    long ts = stopWatch.ElapsedTicks;
    string elapsedTime = ts.ToString() + " Ticks"; ;
    MessageBox.Show(elapsedTime);
}

感谢您提前输入或验证我的想法。

3 个答案:

答案 0 :(得分:2)

如果您想为集合中的每个项目计算需要花费一些时间来计算的内容,那么使用Parallel.For非常有用。

int[] coll = new int[]{10,9,8,7,6,5,4,3,2,1};

Parallel.ForEach(coll,
    item=>
    {
       Thread.Sleep(TimeSpan.FromSeconds(item));
       Console.WriteLine(item + "Finished");
    });

与顺序方式相比

foreach (var item in coll)
{
    Thread.Sleep(TimeSpan.FromSeconds(item));
    Console.WriteLine(item + "Finished");
}

第一个代码运行得更快,因为它确实可以并行工作。

在您的情况下,如果您只想执行“无工作”,那么thead中的开销就会很大。

答案 1 :(得分:2)

我认为你不能这样做....首先,你是从非UI线程访问UI控件(ListBox)。 AFAIK,Parallel.For没有进行任何线程编组以确保安全。其次,您从多个线程访问相同的集合(ListBox.Items)而没有锁定 - 再次,不安全。

一般来说,我会说 Parallel.For的目的是什么。你在这里并不完全是对I / O或CPU的瓶颈,这意味着任何并行性开销都会使任何可能的改进相形见绌。

答案 2 :(得分:1)

我认为你的样本量太小了,你在循环中所做的工作太小了,无法克服任务/线程管理的开销。对于内存操作来说,消耗这么少的CPU是没有意义的。如果您正在进行100,000件物品排序,那么可能......