我有一段生成大量网络和磁盘I/O的C# 5.0代码,需要并行运行多个副本。以下哪种技术可能会给我最好的性能:
使用await的async方法
直接使用TPL中的Task
TPL Dataflow nuget
响应式扩展
我对这个并行化的东西不是很擅长,但如果使用像Thread这样的低级技术可以给我更好的性能,我也会考虑。
我有一段生成大量网络和磁盘I/O的C# 5.0代码,需要并行运行多个副本。以下哪种技术可能会给我最好的性能:
使用await的async方法
直接使用TPL中的Task
TPL Dataflow nuget
响应式扩展
我对这个并行化的东西不是很擅长,但如果使用像Thread这样的低级技术可以给我更好的性能,我也会考虑。
这就像试图通过询问最快的方法来解除安全带来优化你的跨大西洋航班的长度。
把性能看作“活动”的类别-每个活动都比上一个慢一个数量级(至少是这样!):
如果您执行了#3活动之一,那么进行典型于#1和#2活动的优化(如优化线程库)将毫无意义,因为它们完全被磁盘操作所掩盖。如果您不断产生L2 / L3高速缓存未命中,则手写汇编代码省略了一些CPU周期没有价值(这就是为什么如展开循环这样的东西现在通常是个坏主意)。
那么,我们能从中得出什么呢?要使程序更快,有两种方法,要么从#3升级到#2(这通常取决于您在做什么),要么减少I/O操作。在大多数现代应用程序中,I/O和网络速度是限制速率的因素,因此您应该尝试进行优化。
async
,如果您的逻辑更适合表示为流,则选择Dataflow或Rx。这是一个老问题,但对于任何看到这个的人...
这取决于情况。如果您尝试使用50B消息饱和1Gbps链路,则即使使用简单的非阻塞原始套接字发送,您也会被CPU限制。另一方面,如果您满意1Mbps吞吐量或您的消息大于10KB,则任何这些框架都可以胜任。
对于低带宽情况,我建议按易用性进行优先排序,即按顺序为async/await、Dataflow、Rx、TPL。请注意,高带宽应用程序应首先以低带宽的方式进行原型开发,然后进行优化。
对于真正的高带宽应用程序,我推荐Dataflow而不是Rx,因为Rx不适用于高并发。原始TPL是底层,如果您能处理复杂性,则保证具有最低的开销。如果您可以有效地利用专用线程,则速度将更快。在Async/await与Dataflow之间,我认为没有性能差异。开销似乎相当,所以选择更适合自己的那个。
nuget
的上下文,为什么它只与TPL-Dataflow
一起使用?你是在使用.NET 4.0的Async CTP
还是.NET 4.5? - Gennady Vanin Геннадий Ванин