锁定老帖子 主题:像Erlang一样写D程序
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-18
to: DavidL
tango 的fibre据说是assertfalse.com mikolalysenko的coroutine。language shootout的coroutine测试我不太懂其他语言的实现,然而感觉是对D不公平的,D用的是系统的线程。其他的可能根本就没有启动系统线程 shootout 的代码都是用户自己提供的, 算不上不公平, 如果qiezi 优化好了他的代码, 一样可以提供上去, 只要符合规定, 结果正确, 可以取代原来的代码作为 D 的性能基准的. |
|
返回顶楼 | |
发表时间:2007-09-18
他这个是比较公平的,各种语言都可以针对测试做特别的优化,那个gcc的版本就有用ucontext的,调度时甚至是按消息发送的顺序进行调度,但就是跑不过erlang。。所以我这个版本估计也不会好。
现在没做任何优化,每次都要调度500个“进程”,实际上每次只有一个进程有消息,所以最理想情况下能提速500倍,我计算过似乎还是比不上erlang版本。 |
|
返回顶楼 | |
发表时间:2007-09-18
他这个是比较公平的,各种语言都可以针对测试做特别的优化,那个gcc的版本就有用ucontext的,调度时甚至是按消息发送的顺序进行调度,但就是跑不过erlang。。所以我这个版本估计也不会好。 现在没做任何优化,每次都要调度500个“进程”,实际上每次只有一个进程有消息,所以最理想情况下能提速500倍,我计算过似乎还是比不上erlang版本。 erlang 这么强, 比专门写的代码都强, 原因何在呢 ? 哦, 对了 python 的代码是一来就关闭 gc的, 你做了这个没有. |
|
返回顶楼 | |
发表时间:2007-09-18
这个测试目前erlang是排第二的,他的轻量级线程切换开销比fiber/ucontext更小,实际上python版本也排在c++/D前面.
erlang版本在我的机器上运行是1秒多,我的D版本运行是304秒,如果真能加速500倍的话倒是可以超过它.我测试了关闭GC,结果内存用到640M,用到了交换文件,成绩反而下降了. |
|
返回顶楼 | |
发表时间:2007-09-18
看样子没办法让它提速500倍,优化调度过程,把LinkSeq换成D的数组以后,提升到12秒,D的线程版本只用8秒,erlang才1秒多,所以还相差很多。erlang是在windows上测试的,如果是linux下,HiPE应该还可以更快。
|
|
返回顶楼 | |
发表时间:2007-09-18
erlang的私有堆清扫非常方便,process退出,整个私有堆就撤掉.完全不用管其他的process里面的东西.而D/python这样的共享堆需要清扫的根集非常之大.python关掉gc disable能够跑的快,是因为python最早的gc是基于reference counting实现的,关闭gc相当于启用reference counting,对于cheap-concurrency这种应用,reference counting比mark-sweep GC省力很多,只要你不出reference cycles.而D的gc disable只是在性能攸关但是内存充足的情况下允许程序员关闭GC完全不清扫垃圾,等到性能瓶颈运算过去之后,再由程序员手工打开gc清扫垃圾,是一个纯粹空间换时间的策略.
|
|
返回顶楼 | |
发表时间:2007-09-18
为什么动态语言在这方面都好强,那个mozart-oz看它的语言特性介绍好像也很酷
|
|
返回顶楼 | |
发表时间:2007-09-18
优化到9秒了,感觉没办法进一步提高了,从12秒到9秒的一点提高就是Delegate对象改成scope了,直接在栈上分配。
erlang的这个应用实际上所有进程都没有退出,直到最后执行exit前没有进程退出,所以可能还没到清扫那一步,但它的内存占用也比较低,还是可以进一步分析一下。 |
|
返回顶楼 | |
发表时间:2007-09-18
可气的是python也这么快。。。
|
|
返回顶楼 | |