[八卦] 很希望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稍低。 |
相关讨论
相关资源推荐
- 探秘大数据结构之SAFEARRAY
- mybatis-generator自定义注释生成
- MyBatis整合Generator工具类
- Promise 与 generator函数
- idea如何配置MyBatis-generator 自动生成工具
- 基于express-generator创建TypeScript+Express+MySQL后端项目(详细版)
- 关于协程和 ES6 中的 Generator
- 【mybatis】Mybatis Generator最完整配置详解
- maven mybatis-generator 的坑我都走了一遍
- mybatis plug 只查id_mybatis generator只能生成insert和selectAll的操作