我正在绕着并行的线程缠绕我的头,所以我决定在较小的基础上测试它,然后在我舒服的时候展开。我正在对自己进行相同的处理;一个使用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);
}
感谢您提前输入或验证我的想法。
答案 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件物品排序,那么可能......