IHttpHandler:通过并行性加速性能
本文关键字:加速 性能 并行性 IHttpHandler | 更新日期: 2023-09-27 18:12:04
我有一个IHttpHandler执行三个方法:
- a = Method_A
- b = Method_B
- c = Method_C(a,b)
方法A和方法B的计算是完全独立的。方法C使用方法A和b的结果。目前这两个方法是顺序执行的。为了获得更好的IHttpHandler的整体性能,我的想法是并行计算方法a和B。如果A和B已经完成,则应该启动方法C。这可能吗?如何实现?
问候,托尔斯滕
当然有可能;然而,真正有趣的是弄清楚它是否明智。如果工作是cpu限制的,那么对于低数量的请求它将扩展(例如,它在只有您的本地机器上看起来很好)-然而,如果有许多其他并行请求,那么您实际上可以降低性能(线程有开销,并且您有有限的内核)。
如果您的请求数较低(即您有足够的核心来并行处理负载而不会耗尽),或者如果工作主要是io绑定的,那么您应该没问题。
为其中一个项目启动一个任务:
var task = new Task<ResultType>(() => Method_B());
task.Start();
var a = Method_A();
var b = task.Result;
Method_C(a, b);
请注意,这确实引入了许多相关的问题—例如,Method_B()
中的代码将不能直接访问任何与请求相关的上下文。理想情况下,首先收集Method_B()
将需要的所有信息(在主http-request线程上),并通过与http-context无关的简单数据类型传递这些信息。同样,任何使用线程本地数据(例如TransactionScope
)的数据都不会自动流入Method_B()
。
您需要使用TPL(任务并行库)。
这是可能的,而且很简单——要么使用异步扩展,要么只是将工作项排队,并使用信号来同步可用的返回。
主要问题是它是否有意义。只有当服务器不忙于计算时才有意义。因为如果它是-你不能神奇地创建新的cpu内核