1

我正忙于运行并行线程,因此我决定在较小的基础上对其进行测试,然后在我感到舒服时进行扩展。我将同样的过程与自己相提并论;一个使用 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);
}

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

4

3 回答 3

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就太大了。

于 2016-03-09T18:16:14.110 回答
2

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

一般来说,我会说这不是设计Parallel.For的目的。您在这里并不完全是 I/O 或 CPU 的瓶颈,这意味着任何并行开销都会使任何可以想象的改进相形见绌。

于 2016-03-09T18:17:53.433 回答
1

我认为您的样本量太小了,而且您在循环中所做的工作太小,无法克服任务/线程管理的开销。并行一个消耗如此少 CPU 的内存中的操作没有什么意义。如果您要对 100,000 个项目进行排序,那么也许...

于 2016-03-09T18:05:43.700 回答