【发布时间】:2016-03-09 18:03:37
【问题描述】:
我正忙于运行并行线程,因此我决定在较小的基础上对其进行测试,然后在我感到舒服时进行扩展。我将同样的过程与自己相提并论;一个使用 Parallel.For,另一个使用基本的 for 循环。我正在捕捉时间(以刻度为单位)进行比较。示例代码采用一个数组(在本例中为 53 个两个字符串)并用该数组填充给定的ListBox。
对我来说几乎没有意义的是,当我运行基本的 For 循环时,它平均产生 1,400 个滴答声,但是当我运行 Parallel.For 循环时,它平均返回 5,200 个滴答声。样本量是否太小而无法并行有效?
这是我正在使用的两个 sn-ps。 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);
}
感谢您提前输入或验证我的想法。
【问题讨论】:
-
除了执行时间之外,您可能还想查看列表框项目的最终顺序。最好的情况是它们将处于与数组无关的随机半不匹配顺序。最坏的情况是,如果列表框不是线程安全的,它将做未定义的事情。除了仅用于高 CPU 情况外,您还应该尝试保留 Parallel 以供项目执行不完全依赖于一个中心对象时使用。 (这可能意味着将来合并结果)
标签: c# for-loop parallel.for