Tim的WideFinder习题让多核和并行编程实践在一个简单的问题上有了多种语言作一次比较的机会,所以参与者甚多,我觉得也是很有意义的一件事。今天有点时间,作一个小总结。
目前排行榜上列第一、第二、第三的分别是OCaml+JoCaml,Erlang和Python。C/C++的版本理论上应该可以有很好的结果,但现在还没出来,这反倒说明用C/C++来完成这么一个简单的并行任务并不是很顺畅。
就Erlang的实现而言,基本上是一些象我这样的初学者慢慢摸索(Anders和Steve也都是初学者),加上专家们在一些关键地方的适时指点的过程。
现在看来,几个重要的转折在:
1、min_heap_size的设置对Binary性能的影响非常重要,这涉及到Heap的初始分配、GC的性能。好在探询合适的+h参数比较方便,在命令行加+h Size就可以了;
2、遍历Binary时尽量只移动指针,如无必要,就不要分解出子binary。这对Binary的操作性能也是至关重要,因为分解出的binary要在globle heap中分配并被GC回收,这样是要耗时间的。
解决上述问题后,Erlanger们(包括Anders, Pichi和我)立刻不需要再担心binary的性能,而且已经可以轻易击败ruby了。但要和最快的python实现(wf-6.py)相比,还要解决一个问题:搜索算法。python对定长字符串的搜索是2006年时由Fredrik Lundh写了一个Boyer-Moore的算法并加入到Python 2.5中的,因此Fredrik Lundh在实现他的WideFinder时很自然就用了它。Steve注意到了这一点,用Erlang实现了一个类似的,这样Erlang和Python的的比较才算公平。
于是Anders的wfinder8能在T5120上跑到4.42秒,与Fredrik Lundh的wf-6的4.38秒期鼓相当。
但Fredrik Lundh的wf-6.py和Fernandez的JoCaml版本都是利用操作系统的process来跑并行的。Erlang则是用操作系统的thread来调度自己的轻量process,因此Anders就再写了一个wfinder7_2,干脆跑n个node,每个node是一个操作系统的process,利用Node之间的通讯来合并结果,这个实现能跑到3.54秒,超过了Python,只比JoCaml的1.76秒慢。
还应该提到的是,JoCaml和Python都使用到了Memory Mapping,相当于把整个log文件读到和映射到内存中,因为Tim的那台T5120有8个G的内存,所以这个处理不会带来频繁的swap,不过我本人不喜欢这种方式。
我写程序比较喜欢简洁和直接了当,所以我的实现注重的是在简洁、可读和性能之间的平衡,最后的实现是
tbray9a.erl,大约115行,最快是5.26秒。
与Python,JoCaml相比,我喜欢Erlang的地方在于,Erlang对并行和并发的支持在语法和机制上是一致的,而且性能也毫不逊色。Python在进程间通讯时使用了管道、JoCaml也基本上是这样,这也无所谓,但遇到并发情景时,Python和JoCaml就难受了,是用操作系统的Process呢还是用Thread?都不是好的方案。而对Erlang而言,并发和并行的处理机制是一致的,不管在是在自己的轻量processes层次,还是在Node层次,甚至,还有一个层次,就是,它同时还是分布的。
分享到:
- 2007-11-12 13:50
- 浏览 2652
- 评论(4)
- 论坛回复 / 浏览 (4 / 6889)
- 查看更多
相关推荐
error: /tmp/esl-erlang_26.0.2-1~alinux~3_x86_64.rpm : not an rpm package (or packape manifest): arning: /tmp/rabbitmg-erver 3.12.4-1 all.rpm: Header V4 RSA/SHA512 Signature, key ID 6026dfca: NOKEY ...
esl-erlang_17.3-1~centos~6_amd64.rpm esl-erlang_17.3-1~centos~6_amd64.rpm
erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm
esl-erlang_24.2.1-1_centos_7_amd64.rpm
esl-erlang_19.0~centos~6_amd64.rpm
esl-erlang_16.b.3-2~centos~6_amd64.rpm
linux环境 erlang rpm包 esl-erlang_23.0.3-1~centos~7_amd64.rpm
esl-erlang-20.1-1.x86_64只适用于Centos7; 安装命令:rpm -ivh --force esl-erlang-20.1-1.x86_64.rpm
esl-erlang_25.0.3-1_centos_7_amd64.rpm erlang_25.0.3-1 rpm用于rabitmq基础环境安装
esl-erlang_23.0和rabbitmq-3.8.4windows版本 直接下载安装就行,可以直接下载就可安装,非常的方便 ,欢迎大家下载 注意事项: 1. Erlang版本和RabbitMQ版本要配套 (Erlang23.0, RabbitMQ3.8.4) 2. amd芯片请乖乖...
3. **并发模型**:Erlang的并发是通过轻量级进程实现的,这些进程之间通过消息传递进行通信,而不是共享内存,从而减少了数据竞争和同步问题。 4. **错误处理**:Erlang采用“失败早发现,失败早恢复”的哲学,鼓励...
esl-erlang_17.0-1~centos~6_amd64.rpm
esl-erlang-compat-R14B-1.el6.noarch.rpm
这个erlang23.0版本,根据rabbitMQ官网的介绍,可以和下面这几个版本的rabbitMQ配合使用: 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 其他版本的rabbit,请移步其他资源下载
erlang23.0版本的exe安装包,适用于centos8系统,是安装RabbitMQ3.8.5版本(需erlang版本 >= 21.3)的先决安装插件。
1. **进程模型**:Erlang使用轻量级进程(LWP)来实现并发,这些进程间的通信高效且容错。进程间的通信通过消息传递,确保了数据的一致性。 2. **分布式计算**:Erlang OTP支持跨节点的分布式计算,允许开发者构建...
**Erlang与RabbitMQ简介** Erlang是一种由Ericsson公司开发的并发性、分布式和容错的编程语言,特别适合构建高可用性的实时系统。它以其强大的错误恢复能力和处理大量并发连接的能力而闻名。Erlang的 OTP (Open ...
esl-erlang_15.b.1~centos~6_amd64.rpm
esl-erlang_20.3-1_centos_6_amd64.rpm 10.7.1版本
此rpm包是专门为部署rabbitmq-server而准备的所需的包,centos7.5系统,相关博客详见https://blog.csdn.net/baidu_38432732/article/details/105813004