disruptor3
我决定对整个版本的Disruptor都放置一个beta标签感到无聊,所以我决定将Disruptor 3.0.0发行到全世界。 此版本的最大挑战是清理代码并提出更好的算法来处理多个生产者。 如果我很幸运,可以更快。 在发布此版本时,我最初走了几个阴暗的小巷,但与2.x版本的区别不大,但是又带来了一些好处。 我本来想实施一些功能测试并改善文档,但是我可能会一直等到那些方面,直到我100%满意为止。
改进了对多个生产者的支持
Disruptor的2.x版本真正令人讨厌的问题之一是,它附带了ClaimStrategy的2种实现。 一种是用于线程多于CPU的情况,另一种用于线程少的情况。 这有点难看。 现在,第3版只有一个MultiProducerSequencer(稍后会在Sequencers / ClaimStrategies上提供更多信息),在两种情况下都可以正常工作。 对于无竞争的情况,我们以前的实现大约是18M ops / sec v 15M ops / sec *,但速度较慢,但是随着线程数量的增加和CPU数量的增加,扩展性会更好。 去年,我在TechMesh和JAX London上做了一些关于新实现的讨论。 如果您对算法的细节感兴趣,可以观看有关JAX London演讲的YouTube视频 。
没有更多的索赔策略
内部设计和API的主要变化之一是,我摆脱了ClaimStrategy接口。 通过对多生产者用例进行的一些更改,它变得很麻烦。 因此,我删除了它,而是提供了覆盖2个重要用例的Sequencer,SingleProducerSequencer和MultiProducerSequencer的2种实现。 很抱歉,我们不再允许用户在其中插入自己的实现,但是结果使代码变得更加简洁,简单和快捷。
单生产者案例更快
从一个生产者到一个消费者基准测试*,第3版的运行速度约为2.2亿每秒,而第2版的运行速度约为8000万每秒。这主要是总体清理(例如删除ClaimStrategies)和一些小优化的结果。
改进的用于RingBuffer的EventTranslator API
RingBuffer现在支持的EventTranslator API现在具有用于传递给EventTranslator实现的1、2、3和Varargs参数的变体。 这意味着不必通过匿名内部类或通过EventTranslator实现中的字段推送值来完成对EventTranslator的输入。 它还使将EventTranslators编写为易于测试的独立单元变得更加容易。 代码隔离FTW!
定序器的批量生产者接口
我不是我们现有的批量生产者接口的忠实拥护者,最初我打算将其转储。 经过一番思考,我将其部分重新添加了。即,它仅在Sequencer上可用。 如果我可以提出一个干净安全的API来公开该功能,则可以稍后将其添加到RingBuffer中。 出于兴趣,我添加了使用批处理接口的原始定序器吞吐量测试。 该测试没有实际作用,只是在线程之间发出信号。 但是,我证明了Disruptor不能做任何有用的事情,它以10批为单位的速度超过4000000000000 ops / sec。 无论如何,这都不是一个有用的基准,但是对于吹牛的权利来说却是一个很好的选择!
特别提及
有一些人帮助将Disruptor从版本2状态升级到版本3:
- Jason Koch:亲自做了大量JavaDoc。 自合并他的请求请求以来,我一直在努力使其保持最新状态。
- Dalibor Novak和Danny Yates:Github和Gradle迁移。
- Adrian Sutton:有关DSL的进一步工作。
- 马丁·汤普森(Martin Thompson):对于他的许多有用想法,尤其是围绕支持多个生产者的算法。
现在可以从Maven Central和Github下载页面获得 。
*所有测试都是在3.40 GHz – YMMV的Intel Core i7-3770(Ivy Bridge)上完成的。
参考:来自Bad Concurrency博客的JCG合作伙伴 Michael Barker 发布了Disruptor 3.0.0 。
翻译自: https://www.javacodegeeks.com/2013/04/release-of-disruptor-3-0-0.html
disruptor3