C# 充分利用.NET任务并行库
问题1. 使用Parallel.For和Parallel.ForEach是否更适合处理有序或无序的任务 我问这个问题的原因是,我最近更新了一个串行循环,其中使用StringBuilder根据各种参数生成SQL语句。结果是,与使用标准foreach循环时相比,SQL有点混乱(甚至包含语法错误),因此我的直觉是,TPL不适合执行数据必须以特定顺序出现的任务 问题2. TPL是否在执行之前自动使用多核体系结构C# 充分利用.NET任务并行库,c#,.net,performance,task-parallel-library,C#,.net,Performance,Task Parallel Library,问题1. 使用Parallel.For和Parallel.ForEach是否更适合处理有序或无序的任务 我问这个问题的原因是,我最近更新了一个串行循环,其中使用StringBuilder根据各种参数生成SQL语句。结果是,与使用标准foreach循环时相比,SQL有点混乱(甚至包含语法错误),因此我的直觉是,TPL不适合执行数据必须以特定顺序出现的任务 问题2. TPL是否在执行之前自动使用多核体系结构 我提出这个问题的原因与我之前提出的一个与第三方物流运营的性能分析有关的问题有关。对这个问题的
我提出这个问题的原因与我之前提出的一个与第三方物流运营的性能分析有关的问题有关。对这个问题的回答让我明白了一个事实,即TPL并不总是比标准串行循环更高效,因为应用程序可能无法访问多个内核,因此与标准串行循环相比,创建额外线程和循环的开销会导致性能下降。关于第1点,如果使用TPL,您不知道运行任务的顺序。这就是并行与顺序之美。有办法控制事物的顺序,但是你可能会失去平行的好处 第二,第三方物流利用多核开箱即用。但是在使用多个线程时确实会有开销。调度程序上的负载增加,线程(上下文)切换不是免费的。为了保持数据同步以避免竞争条件,您可能需要一些锁定机制,这也会增加开销 使用TPL制作快速并行算法变得容易多了,但仍然是一门艺术。我的直觉是,TPL不适合执行数据必须以特定顺序出现的任务 对。如果您希望事情按顺序进行,那么您可能会对将循环“并行化”时会发生什么产生误解 TPL是否在执行之前自动使用多核体系结构 请参阅msdn杂志上的以下文章: 使用该库,您可以方便地表示潜在的并行性 在现有的顺序代码中,公开的并行任务将 在所有可用处理器上并发运行
StringBuilder
有一个共享依赖关系,这就是并行查询失败的原因。TPL在独立的工作单元上运行得非常好。即使如此,您也可以使用一些简单的技巧强制计算并行查询并保留原始查询当并行操作全部完成时,对结果进行排序显然,TPL不是构建有序集(如查询)的好工具 如果要对一组项目执行一系列任务,则可以使用BlockingCollection。这些任务可以并行执行,但顺序不同