[八卦] 很希望D加上Generator呀

qiezi 2008-04-16
最近一直在研究并发编程模型,在考察了Thread, Coroutine, Callback后,感觉Generator是最好的,它有Callback的高效性和Coroutine的思维连贯性,当然Callback调用成本比Coroutine切换成本要低得多(我指的是用ucontext/fiber实现的的Coroutine),Generator模拟Coroutine的测试我也基本完成了,使用的是Python做的。

可惜Python的语言效率还是差了些,即便是Generator效率也不能和Erlang相比,C++是指望不上了,很希望D能加上Generator呀。

由于D里面实现Generator只是多几个状态的保存(logging),和Closure实现相似,所以我使用Closure来测试的,它的调度开销非常小,在我的虚拟机上轻松达到2.5亿次每秒,除开调度器本身的开销,实际能工作的版本估计在1亿次调度以上,这比之前我用ucontext实现的版本高出10倍,也终于能够超过Erlang很多。

新闻组里有个提案,很早了,不知道怎么能说动Walter把它给实现了。

http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D&article_id=41886
qiezi 2008-04-16
从我简单的测试来看,给Generator写调度器比Coroutine容易多了,因为每次只要返回一个Generator对象就表明它需要调度(当然某些时候需要特别指定不调度它),而且函数总是返回到调度器方法中。而Coroutine就比较麻烦一些,需要非常清楚当前执行在哪个Coroutine中,还有它的退出处理。。

解决了并发问题,我认为并行问题本身并不复杂。Erlang做了个通用的解决方案,避免了生手很容易犯错误的机会,但同时它的效率也比本地码程序低很多,虽然在动态类型语言中算是很高了。我认为为了一些好处而牺牲这么多效率在服务器编程中很不值得,当然Erlang还有一揽子优点,但不要再宣传什么多核的利用啦,很可能Erlang使用8核才能达到D语言单核的计算能力。。。
hurd 2008-04-16
Generator函数保存状态的话,是保存在堆里还是栈里呢?
qiezi 2008-04-16
堆里呀,栈里一切换被覆盖了
hurd 2008-04-16
似乎c#也支持Generator, 不知道性能怎么样。
qiezi 2008-04-16
我也想试试呢,不过太大了,不方便安装,mono性能可能会差很多。。
qiezi 2008-04-17
C#装上了, 测试了个简单的例子没通过。。。

http://en.csharp-online.net/CSharp_Coding_Solutions%E2%80%94What_Does_Yield_Keyword_Generate

这里讲了实现原理,可以看到就是把Generator转成状态机,反过来说就是Generator可以用简单的方式编写状态机程序。
qiezi 2008-04-17
原来是namespace错了。

测试了一下,在windows xp上,C#的Generator运行20亿次切换用了15秒,在虚拟机里面的ubuntu上跑,20亿次用掉7秒。当然我是用Closure模拟的,如果D实现Generator可能性能会比Closure稍低。
Global site tag (gtag.js) - Google Analytics