Alex Tkachman用一个测试基准比较Scala actor、Jetlang和Groovy++消息传递的性能差异,并解释了Scala actor比较慢的原因。
该基准用来测量消息发送和接收的的平均速度。我们选择了众所周知的线程环测试基准的一个变体
- 有10000个actors,0..9999
- 当object接收一个消息后将其转发给下一个object
- 测试一开始,向头500个对象发送字符串“Hi”
总共大概有接近50M的消息被发送和接收,我们记录下来整个过程的时间
测试结果如下:
Benchmarking results (milliseconds, smaller number the better) 2155 - Jetlang 1682 - Groovy++ 47911 - Scala //这是原始数据,根据评论中建议修改之后,数据可达5221ms //但仍比groovy++显慢,Alex说还会就此话题贴文。
Alex认为造成这一结果的原因是Scala模仿了Erlang的行为,而没有使用更适合JVM的消息传递模型。而Groovy++的实现方式与Jetlang基本一样,主要区别是groovy++选择不区分fiber(消息消费者)和message channel(消息发布地),从而内部可以使用一些简单的数据结构。还有就是Groovy++还不支持Jetlang所支持的一些特性,那些特性对效率多少也会有影响。