鉴于此代码:
var arrayStrings = new string[1000];
Parallel.ForEach<string>(arrayStrings, someString =>
{
DoSomething(someString);
});
Run Code Online (Sandbox Code Playgroud)
所有1000个线程几乎会同时产生吗?
今天我尝试做一些优化foreach声明,这可以继续XDocument.
优化前:
foreach (XElement elem in xDoc.Descendants("APSEvent").ToList())
{
//some operations
}
Run Code Online (Sandbox Code Playgroud)
优化后:
Parallel.ForEach(xDoc.Descendants("APSEvent").ToList(), elem =>
{
//same operations
});
Run Code Online (Sandbox Code Playgroud)
我看到.NET Parallel.ForEach(...)只打开一个线程!结果,时间跨度Parallel大于标准foreach.
为什么你认为.NET只开了1个线程?因为锁定文件?谢谢
关于PLINQ中的订单保存的msdn文档说明了以下内容ForAll().
这是否意味着ForAll永远不能保证该方法的有序执行?
我以前没有使用PLINQ,但以下Code Review问题似乎是适合它的用法.在我的回答的底部,我写道:
Events.AsParallel().AsOrdered().ForAll( eventItem =>
{
...
} );
Run Code Online (Sandbox Code Playgroud)
阅读文档后,我相信AsOrdered()不会改变任何东西?
我也怀疑以前的查询不能取代for顺序很重要的简单循环?
可能StringBuilder会发生与意志的并行调用,导致输出错误?
我试图了解何时使用parallel会增加性能.
我用一个运行超过100,000个项目的简单代码对其进行了测试,List<Person>并将每个项目的名称更改为string.Empty.
并行版本比普通版本花费了两倍的时间.(是的,我用更多的核心进行了测试...)
我看到这个答案说一段并不总是并行的数据对性能有好处.
此外,在MSDN教程的并行示例的每一页中都会重复此注意事项:
这些示例主要用于演示用法,可能会或可能不会比等效的LINQ to Objects查询运行得更快
我需要一些规则和提示,当并行将提高我的代码的性能,什么时候不会.
显而易见的答案是"测试你的代码,如果并行循环更快地使用它",这是绝对正确的,但我想没有人在他写的每个循环上运行性能分析.
我以两种不同的方式运行Parallel.For循环:
不写任何async/await但只是调用Task ReadSensorAsync(int):
var watch = System.Diagnostics.Stopwatch.StartNew();
Parallel.For(3, 38,
index => {
ReadSensorsAsync(index);
});
watch.Stop();
Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
时间显示 1ms
跑步 async/await
var watch = System.Diagnostics.Stopwatch.StartNew();
Parallel.For(3, 38,
async index => {
await ReadSensorsAsync(index);
});
watch.Stop();
Console.WriteLine("Parallel finished in {0} ms", watch.ElapsedMilliseconds);
Run Code Online (Sandbox Code Playgroud)
这表明2-5ms.
问题是为什么存在这种差异以及使用哪种方式.