我尝试了一个非常小的例子:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
using System.Diagnostics;
namespace TPLExample {
class Program {
static void Main(string[] args) {
int[] dataItems = new int[100];
double[] resultItems = new double[100];
for (int i = 0; i < dataItems.Length; ++i) {
dataItems[i] = i;
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Reset();
stopwatch.Start();
Parallel.For(0, dataItems.Length, (index) => {
resultItems[index] = Math.Pow(dataItems[index], 2);
});
stopwatch.Stop();
Console.WriteLine("TPL Time elapsed: {0}", stopwatch.Elapsed);
stopwatch.Reset();
stopwatch.Start();
for (int i = 0; i < dataItems.Length; ++i) {
resultItems[i] = Math.Pow(dataItems[i], 2);
}
stopwatch.Stop();
Console.WriteLine("Sequential Time elapsed: {0}", stopwatch.Elapsed);
WaitForEnterKey();
}
public static void WaitForEnterKey() {
Console.WriteLine("Press enter to finish");
Console.ReadLine();
}
public static void PrintMessage() {
Console.WriteLine("Message printed");
}
}
}
输出是:
TPL Time elapsed: 00:00:00.0010670
Sequential Time elapsed: 00:00:00.0000178
Press enter to finish
顺序循环比 TPL 快得多!这怎么可能?据我了解,计算范围内Parallel.For
会并行执行,那么一定会更快吗?
简而言之:对于仅迭代一百多个项目并执行小型数学运算的情况,生成新线程并等待它们完成会比仅运行循环产生更多开销。
根据我的理解,Parallel.For 中的计算将并行执行,那么它一定会更快吗?
正如人们对计算机性能做出笼统陈述时通常会发生的那样,这里有更多的变量在起作用,你不能真正做出这样的假设。例如,在你的内部for
循环,你什么都不做Math.Pow
,处理器可以非常快地执行该操作。如果这是一个 I/O 密集型操作,需要每个线程等待很长时间,或者即使它是一系列处理器密集型操作,您将从并行处理中获得更多(假设您有一个多线程处理器) 。但事实上,创建和同步这些线程的开销远远大于并行性可能给您带来的任何优势。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)