【问题标题】:I/O performance - async vs TPL vs Dataflow vs RXI/O 性能 - 异步 vs TPL vs Dataflow vs RX
【发布时间】:2013-04-17 01:05:00
【问题描述】:

我有一段 C# 5.0 代码可以生成大量的网络和磁盘 I/O。我需要并行运行此代码的多个副本。以下哪项技术可能会给我带来最佳性能:

  • 带有等待的异步方法

  • 直接使用TPL中的Task

  • TPL 数据流核心

  • 反应式扩展

我不太擅长这种并行的东西,但如果使用较低的杠杆,比如 Thread,可以给我带来更好的性能,我也会考虑这样做。

【问题讨论】:

  • 我没有掌握nuget的上下文,为什么它只与TPL-Dataflow一起使用?您使用的是 .NET 4.0 Async CTP 还是 .NET 4.5?

标签: task-parallel-library system.reactive async-await conceptual tpl-dataflow


【解决方案1】:

这就像通过询问最快的方法来解开安全带来尝试优化跨大西洋航班的长度。

好吧,一些真正的建议,因为我有点混蛋

让我们给出一个有用的答案。将性能视为活动的“类” - 每一个都慢一个数量级(至少!):

  1. 仅访问 CPU,内存使用量很少(即将非常简单的图形渲染到速度非常快的 GPU,或计算 Pi 的位数)
  2. 仅访问 CPU 和内存中的内容,磁盘上没有任何内容(即编写良好的游戏)
  3. 访问磁盘
  4. 正在访问网络。

如果您进行甚至一个活动 #3,则对活动 #1 和 #2 进行典型的优化(例如优化线程库)毫无意义 - 它们完全被磁盘命中所掩盖。 CPU 技巧也是如此 - 如果您经常发生 L2/L3 缓存未命中,那么通过手写汇编节省几个 CPU 周期是不值得的(这就是为什么像 loop unrolling 这样的事情现在通常是个坏主意)。

那么,我们可以从中得到什么?有两种方法可以让你的程序更快,要么从 #3 提升到 #2(这通常是不可能的,这取决于你在做什么),或者减少 I/O .在大多数现代应用程序中,I/O 和网络速度是速率限制因素,而这是您应该尝试优化的。

【讨论】:

  • 另一种使程序更快的方法是以更智能的方式执行 IO。例如,对于传统 HDD,并行执行 IO 通常更快,因为它会导致更多的搜索(这很慢)。
  • ^^ 这也是个好主意。通过测量顺序读取的速度,测量读取磁盘上随机扇区的速度,然后比较方差来检测 SSD 相当容易。如果它们相似,则说明您有 SSD
  • @svick 我认为这是错误的,因为并行 IO 更快,因为使用 SCAN 和电梯算法实际上能够更好地安排读取
  • 我认为你是不正确的,因为对不同位置的两组显式顺序读取总是比对两个位置的并行访问少,即使你正在重新安排 I/O
  • 精彩的文章。我还可以补充一点,硬件对#3 有很大影响。标准旋转 HD 可能执行 100 IOPS(每秒 I/O),中档 SSD 可能执行 6,000 IOPS,基于 PCI Express 的高端 SSD 可能执行 100,000 IOPS 到 1000 万 IOPS。 20 年后的读者会对这些数字嗤之以鼻。
【解决方案2】:

面对“大量的网络和磁盘 I/O”,这些选项之间的任何性能差异都无关紧要。

一个更好的问题是“哪个选项最容易学习和开发?”或者“从现在起五年内维护此代码的最佳选择是什么?”为此,我建议首先使用 async,或者如果您的逻辑更好地表示为流,则建议使用 Dataflow 或 Rx。

【讨论】:

    【解决方案3】:

    这是一个较老的问题,但对于阅读此内容的任何人......

    这取决于。如果您尝试使用 50B 消息使 1Gbps 链路饱和,即使通过原始套接字进行简单的非阻塞发送,您也会受到 CPU 的限制。另一方面,如果您对 1Mbps 的吞吐量感到满意,或者您的消息大于 10KB,那么这些框架中的任何一个都可以胜任。

    对于低带宽的情况,我建议按易用性进行优先级排序,即按此顺序排列 async/await、Dataflow、Rx、TPL。请注意,高带宽应用程序应该像低带宽应用程序一样进行原型设计,然后再进行优化。

    对于真正的高带宽应用,我可以推荐 Dataflow over Rx,因为 Rx 不是为高并发设计的。原始 TPL 是底层,如果您可以处理复杂性,它可以保证最低的开销。如果您可以有效地使用专用线程,那将更快。 Async/await 与 Dataflow IMO 没有任何性能差异。开销似乎相当,所以选择一个更合适的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2015-09-30
      • 2012-01-16
      • 2019-02-09
      • 1970-01-01
      • 1970-01-01
      • 2017-01-19
      相关资源
      最近更新 更多