我正在开发WPF应用程序。
在屏幕/视图中,我必须对WCF服务进行6次调用。这些调用都不涉及它们不共享数据,也不相互依赖。我打算使用TPL并将这6个WCF服务调用作为6个任务。现在,应用程序可以部署在单个核心机器或多个核心机器上。任务并行库 - 单核并行度
我被告知在单核机器上使用TPL实际上会增加完成任务所需的时间,因为将花费在cpu调度程序上的时间将不同任务拼接起来。这是真的。如果是的话,我应该继续我的设计,还是应该寻找替代品。
如果我要寻找替代,那些是什么替代品:)?
我正在开发WPF应用程序。
在屏幕/视图中,我必须对WCF服务进行6次调用。这些调用都不涉及它们不共享数据,也不相互依赖。我打算使用TPL并将这6个WCF服务调用作为6个任务。现在,应用程序可以部署在单个核心机器或多个核心机器上。任务并行库 - 单核并行度
我被告知在单核机器上使用TPL实际上会增加完成任务所需的时间,因为将花费在cpu调度程序上的时间将不同任务拼接起来。这是真的。如果是的话,我应该继续我的设计,还是应该寻找替代品。
如果我要寻找替代,那些是什么替代品:)?
在做什么CPU密集型的,你将是单核的机器上运行的并行线程加入的开销。
你的情况的任务不是CPU密集型,他们正在等待一个服务呼叫响应,这样就可以很好的单核的机器上运行并行线程。
根据服务器如何处理来电,可能没有任何反正时间而增加。如果呼叫在服务器上排队,则无论如何都需要几乎同时运行所有呼叫。在这种情况下,按顺序运行呼叫会更好,因为它更简单。
您能否定义CPU密集型?我知道文件系统访问是CPu密集型的,因为CPU必须等待磁盘头读取磁盘。我如何识别cpu密集型任务? –
@HariSubramaniam:CPU密集型工作是CPU本身正在完成工作的时候,例如,繁重的计算。等待磁盘访问不是CPU密集型的,因为CPU大多处于空闲状态,等待磁盘驱动器完成工作。 – Guffa
一般来说,当运行在单核多线程它会慢一些,因为它具有在螺纹之间上下文切换。
我觉得下面的图表会解释你的区别:
正如你所看到的图是指在单核心,多任务和第二时间顺序第一次运行4个线程。
你可以看到,在多任务的所有线程将比顺序任务以后的时间完成。
在您的具体情况可能会不一样,我认为@Guffa是正确的,因为它涉及到WCF他的回答呼吁
最好的办法是使用多核心和单核心配置文件。大多数BIOS可以设置活动核心的数量,所以它不应该是一个大问题。你可以做一些模拟测试,看看它是否适合你。
很明显,使用任务切换有开销问题,但只要每个任务的时间比设置时间长得多,您都不会注意到它。
有很多方法可以实现多任务行为,如果你不知道哪个是最好的,那么你很可能需要编写一些测试用例并进行一些分析。这并不难。如果您只是尝试使用多核系统,那么使用最新版本的.NET通常很容易,您甚至可以将其设置为多核,但通过使用适当的构造还原为单核。
例如,异步/等待模式可以通过使用#ifdef
或删除所有等待关键字(使用搜索和替换工具)轻松同步运行。 Parallel.For
循环可以直接或通过更改MaxDegreeOfParallelism
轻松转换为正常的for
循环。任务可以很容易地同步运行。
如果你想使之更透明,你可以使用像T4一些预处理脚本。
另一种可能性是异步调用的服务。在C#5中这尤其容易。 – svick