Erlang Gtalk 讨论群9月份聊天记录
9月份聊天记录,全2000多行,杀猫慎入:)
2007-09-02 00:24:58 <panxiaof> emacs和vim,netBeans,还有erlide哪个好啊,我对这些都有点陌生。。。。
2007-09-02 00:25:29 <panxiaof> 就说哪个用来写erlang最有前途吧~
2007-09-02 00:25:55 <baojing.jiao> 熟悉哪个用那个
2007-09-02 00:26:12 <panxiaof> 都是没太用过`
2007-09-02 00:26:24 <panxiaof> 一个起跑线~现在都有notebook
2007-09-02 00:26:39 <baojing.jiao> 自己比较喜欢vim
2007-09-02 00:27:03 <baojing.jiao> 可以当作notepad用,而且启动速度快。
2007-09-02 00:27:09 <panxiaof> 有没有语法提示?debug功能?
2007-09-02 00:27:21 <baojing.jiao> 有高亮提示。
2007-09-02 00:27:26 <baojing.jiao> debug貌似就没有了。
2007-09-02 00:27:55 <baojing.jiao> 错了,应该是我没用过。:)
2007-09-02 00:28:53 <panxiaof> 还是糊涂得很,不过还是谢谢你,我自个再看看。
2007-09-02 00:32:25 <baojing.jiao> 我打开vim,按i进入编辑模式就当notepad用了。常用的就那些命令。打印出来,粘到墙上。很快就会了。我也就是让erl有个语法高亮显示,至于debug,没有用过。
2007-09-03 18:00:54 <panxiaof> 早上问了一个问题,没人回答,现在很不好意思再问一下
2007-09-03 18:01:07 <panxiaof> ets的表,能不能有两个index
2007-09-03 18:01:33 <linningjie> 我是 新手 不懂啊
2007-09-03 18:01:53 <panxiaof> ![]()
2007-09-03 18:02:02 <mryufeng> 不行 没有这个参数
2007-09-03 18:02:26 <mryufeng> 他只能指定在tuple指定一个key pos
2007-09-03 18:02:41 <mryufeng> 默认是1
2007-09-03 18:03:05 <panxiaof> 哦~那如果涉及到多个index的话,只能用mnesia
2007-09-03 18:03:18 <jackyz.zhao> 你可以用mnesia,或者自己再加一个“反向查找记录”(如果你的数据可以支持的话)
2007-09-03 18:03:26 <panxiaof> (虽然听说mnesia也是在ets开发的)
2007-09-03 18:03:57 <baojing.jiao> mnesia应该是ets的一个封装版本吧?便于操作
2007-09-03 18:04:14 <mryufeng> 是的
2007-09-03 18:04:42 <mryufeng> mnesia底层的存储就是ets和dets
2007-09-03 18:04:45 <jackyz.zhao> mnesia以ets/dets作为其存储机制,但其实增加一些别的东西。
2007-09-03 18:05:37 <panxiaof> mnesia做的表,如果系统关了,我希望那些表同时自动就删除,但好像每次起来的时候还都在,是不是只能主动写语句删除?
2007-09-03 18:07:05 <baojing.jiao> mnesia可以设定存储方式的吧?难道宕机会自动dump?
2007-09-03 18:07:28 <panxiaof> 我设定了ram_copy
2007-09-03 18:08:07 <panxiaof> 再仔细看看吧~反正现在看来就没了ram_copyies的话,关了erl就会dump~
2007-09-03 18:08:07 <baojing.jiao> 人家都是希望机子挂了数据保存下来,你倒好,反过来玩:)
2007-09-03 18:08:20 <jackyz.zhao> 那你就直接用ets得了
2007-09-03 18:08:22 <panxiaof> 每个东东需求不一样了
2007-09-03 18:08:36 <panxiaof> 但ets不支持多个index啊
2007-09-03 18:08:44 <panxiaof> 问题又跑回来了:(
2007-09-03 18:09:23 <jackyz.zhao>
应该有这个设置的吧 ram_copy 和别的属性的组合啥的。
2007-09-03 18:09:45 <panxiaof> 回家试试~
2007-09-03 18:09:51 <mryufeng> index This is a list of attribute names, or integers, which specify the tuple positions on which Mnesia shall build and maintain an extra index table.
2007-09-03 18:10:20 <mryufeng> 看来是mnesia自己维护额外的index
2007-09-03 18:10:46 <panxiaof> 就是再建一个ets表什么的`
2007-09-03 18:10:59 <panxiaof> 我想
2007-09-03 18:11:13 <mryufeng> 今天仔细看下mnesia这个的实现
2007-09-03 18:11:39 <jackyz.zhao> 是地,它就是额外建表的方式来做多字段的索引地。
2007-09-03 18:11:45 <panxiaof> 已经看过了?yufeng兄就是yufeng兄
2007-09-03 18:12:01 <jackyz.zhao> 只不过你不用管,它帮你搞定了。
2007-09-03 18:12:23 <mryufeng> 俺前端主要是关注他如何分布 如何fragment
2007-09-03 18:12:25 <panxiaof> 我先下了~88
2007-09-03 18:12:36 <mryufeng> 俺对这个比较关心
2007-09-03 18:12:42 <jackyz.zhao> ![]()
2007-09-03 18:13:26 <baojing.jiao> 俺们还停留在使用上 ![]()
2007-09-03 18:14:18 <baojing.jiao> 老大啥时候领头做个项目让大家参与参与呀,不知有什么打算没
2007-09-03 18:15:43 <mryufeng> 感觉现在还不能随心所欲地操纵erlang 作起东西也是不地道的样子
2007-09-03 18:16:42 <baojing.jiao> 有进度了,随时给大家通报一下 ![]()
2007-09-03 18:16:44 <mryufeng> 还得多看看 erlang stdlib和kernel自己的实现 熟练了以后 才会有生产力的样子
2007-09-03 18:17:49 <mryufeng> 比较一些惯用法 别人不会教你 得从人家程序的行见去挖掘
2007-09-04 09:00:49 <bitcowboy> Erlang里面就没有数组这样的结构吗?
2007-09-04 09:01:14 <bitcowboy> 就是nthElement操作可以在O(1)时间内完成的。
2007-09-04 09:06:16 <xushiweizh> erlang基本的数据结构:Turples, Records, Lists, Bits
2007-09-04 09:06:37 <xushiweizh> 我觉得Bits比较接近你的需求。
2007-09-04 09:07:06 <bitcowboy> 我看下Bits
2007-09-04 09:07:36 <xushiweizh> 不过也不完全是,因为Bits就是Binary Buffer。
2007-09-04 09:07:53 <xushiweizh> 你要的是Type Array。
2007-09-04 09:10:51 <bitcowboy> Erlang中Bits也是只读的吧?
2007-09-04 09:10:58 <xushiweizh> 嗯
2007-09-04 09:11:31 <bitcowboy> 如果要交换一个Array中两个数的位置应该还是不能像C中那样高效吗?
2007-09-04 09:12:21 <xushiweizh> Bits肯定不能。
2007-09-04 09:13:11 <bitcowboy> 要写个堆排序都快写死我了。找不到高效率的实现方法。
2007-09-04 09:13:40 <bitcowboy> 除非用balanced binary tree实现。不过那就不是堆结构了。
2007-09-04 09:16:29 <xushiweizh> 可以考虑用ets,如果要高效的话。
2007-09-04 09:16:42 <bitcowboy> ets是啥?
2007-09-04 09:17:35 <xushiweizh> ets是一个表结构,可修改,而且没有gc。
2007-09-04 09:18:24 <baojing.jiao> ets相当于内存表
2007-09-04 09:18:40 <xushiweizh> TableId = ets:new(test, [Mode]),
ets:insert(TableId, {a, 1}),
ets:insert(TableId, {b, 2}),
ets:delete(TableId).
2007-09-04 09:18:52 <xushiweizh> 看起来和C语言是不是差不多?
2007-09-04 09:19:05 <xushiweizh> TableId就像个指针。
2007-09-04 09:20:02 <bitcowboy> 嗯。
2007-09-04 09:20:03 <xushiweizh> 你看看第15章。
2007-09-04 09:20:05 <bitcowboy> 我看看。
2007-09-04 09:20:13 <bitcowboy> 嗯,找到了。
2007-09-04 09:26:54 <bitcowboy> 嗯,看了一下,ets基本上就是一个大的STL map。
2007-09-04 09:27:08 <xushiweizh> 差不多。
2007-09-04 09:27:24 <bitcowboy> key的查找时间应该是O(logN).
2007-09-04 09:27:54 <xushiweizh> 这个我没有发言权,没看过实现。
2007-09-04 09:28:31 <bitcowboy> 做不到O(1)。拿来做heap还是不划算了。
2007-09-04 09:29:40 <bitcowboy> 呵呵,基于key查找是很难做到O(1)的。除非hash,但是hash函数本身也有开销。
2007-09-04 09:29:44 <xushiweizh> 嗯,要真去做堆排序不是erlang的特长。数据不可修改,这点就已经限定死了。
2007-09-04 09:30:50 <xushiweizh> 这是一个双刃剑,不过我觉得总体来讲利大于弊。
2007-09-04 09:31:47 <bitcowboy> Erlang应该搞个Priority Queue的库或者BIF。
2007-09-04 09:32:14 <bitcowboy> 或者用C实现一个,让Erlang调C的模块。
2007-09-04 09:44:43 <baojing.jiao> erlang给网络开发提供了一个很好的机制和平台,如果对效率要求高或者特别实现的地方,可以用c写,erlang去调用么。虽然这块我不是很清楚 ![]()
2007-09-04 09:45:22 <baojing.jiao> 等过段时间,希望老大们给出一个erlang最佳实践指南
2007-09-04 09:46:14 <xushiweizh> erlang + c是一个很不错的选择。两者互补性很强。
2007-09-04 09:47:34 <panxiaof> 可是调用过程本身的效率怎么样呢?
2007-09-04 09:48:45 <bitcowboy> Erlang+C 有一个问题。Erlang在调C的时候本身能保证多线程调用是互斥的吗?还是C的模块本身是要可重入的?
2007-09-04 09:49:08 <xushiweizh> 还没细看。不过既然erlang是用c写的,调用应该还是比较自然吧,大不了我们做个定制的erlang。 ![]()
2007-09-04 09:49:40 *** <ashchan> joins this room.
2007-09-04 09:49:42 <xushiweizh> C最好是可重入的。
2007-09-04 09:50:30 <baojing.jiao> c可以做成一个节点,和erlang用消息交互。
2007-09-04 09:50:31 <xushiweizh> 全局变量是可耻的。C程序员应该忘记它。 ![]()
2007-09-04 09:50:48 <bitcowboy> 如果是要C保证的话,那么其实我们把一个程序中最影响效率最可能成为瓶颈的部分又退化到“锁”的问题上。整个Erlang写的程序所有Erlang的优点都退化调了。
2007-09-04 09:50:53 <ashchan> 有全局变量这种东西吗?:)
2007-09-04 09:51:04 <baojing.jiao> 那么c就会被封装到这个进程或者节点,对erlang就不会有太大影响了吧?
2007-09-04 09:51:17 <xushiweizh> C做成节点的例子我看过了,不知道效率如何,我觉得应该还有更高效的方式。
2007-09-04 09:53:09 <panxiaof> 问一下比较傻的问题,gen_server的handle_call,handle_cast等东东,是不是一定都是一个安一个顺序执行,不会打岔是吧
2007-09-04 09:56:08 <xushiweizh> 打岔有什么问题?
2007-09-04 09:56:26 <xushiweizh> 反正函数没有什么副作用。 ![]()
2007-09-04 09:56:57 <panxiaof> 就是一个handle_cast执行到一半,另一个也开始了
2007-09-04 09:57:06 <xushiweizh> 没问题的。
2007-09-04 09:57:27 <xushiweizh> 而且完全有可能出现这种情况。
2007-09-04 09:57:38 <panxiaof> 应该是一个执行完也,才执行等二个哦~
2007-09-04 09:57:55 <bitcowboy> CPU核心越多,概率越大。
2007-09-04 09:58:09 <panxiaof> kao~gen_server不可能吧
2007-09-04 09:59:10 <panxiaof> 我就是想有一个更明确的回案,因为我觉得gen_server本身是起了一个线程,他是一个个挨着
receiver message然后处理的
2007-09-04 09:59:35 <panxiaof> 所以不可能出现一个执行一半另一个就开始执行的情况
2007-09-04 10:00:02 <panxiaof> 我就是想有一个更明确的回案,因为我觉得gen_server本身是起了一个process,他是一个个挨着
receiver message然后处理的
所以不可能出现一个执行一半另一个就开始执行的情况
2007-09-04 10:02:15 <xushiweizh> gen_server不能start多个吗?
2007-09-04 10:03:16 <mryufeng> gen_server设计的目的就是单子的好像哦
2007-09-04 10:03:33 <panxiaof> 我是说,一个start里(多个start出来的process,当然他们之间没瓜葛)
2007-09-04 10:03:37 <mryufeng> 根据名字访问的对象都是每个的
2007-09-04 10:03:50 <panxiaof> en~
2007-09-04 10:04:12 <panxiaof> yufeng在啊~
2007-09-04 10:04:28 <mryufeng> en
2007-09-04 10:04:56 <panxiaof> 请教一个问题,就是gen_server里,一个个handle_call是不是都是顺序挨个执行的》?
2007-09-04 10:05:44 <mryufeng> 是挨个的
2007-09-04 10:06:08 <mryufeng> 实现代码在gen.erl里面
2007-09-04 10:06:22 <panxiaof> 好,这样就放心使用了,就可以不用怕什么脏数据问题了
2007-09-04 10:06:26 <panxiaof> thanks
2007-09-04 10:06:54 <mryufeng> 典型的串行server 所以叫gen_server
2007-09-04 10:07:06 <mryufeng> 个人理解
2007-09-04 10:07:33 <panxiaof> 这个理解好~我也是刚这么认为的
2007-09-04 10:40:49 <baojing.jiao> 刚才那两位争论的,c如何和erlang结合使用,不知道老大有什么经验分享一下。
2007-09-04 10:41:18 <AvinDev> 有啥争论?我来迟了-_-
2007-09-04 10:41:40 <mryufeng> ei 已经很强大了 ei + rpc模式 你看下ei的实现
2007-09-04 10:42:18 <mryufeng> 典型的c/s用ei + gen_server做 真的是无比简单
2007-09-04 10:42:47 <panxiaof> ei??
2007-09-04 10:43:00 <mryufeng> erl interface
2007-09-04 10:43:13 <panxiaof> ![]()
2007-09-04 10:44:01 <mryufeng> mnesia 数据库 甚至特地用 ei 作了个表 方便ei 的hidden node 存取数据
2007-09-04 10:45:58 <mryufeng> ei 不好的一点就是 安全机制太简单 就是cookie的方式 这样被人突破以后 会影响服务器的安全
2007-09-04 10:46:14 <mryufeng> 不过在受管环境 问题也不大。
2007-09-04 10:58:52 <baojing.jiao> bitcowboy 、xushiweizh 出来吭吭声,把问题重提一下 ![]()
2007-09-04 10:59:41 <bitcowboy> 我的意思是,Erlang调用C模块我慎重。不要让C模块拖Erlang的后腿。
2007-09-04 11:00:14 <mryufeng> erlang调用c是driver c调用erlang是ei
2007-09-04 11:00:50 <bitcowboy> C代码单线程的时候效率肯定高,多线程就不一定了。
2007-09-04 11:01:04 <mryufeng> 其实erlang的driver实现也是很简单的模拟ioctl那种做法
2007-09-04 11:01:19 <mryufeng> ei本身是多线程安全的
2007-09-04 11:02:23 <mryufeng> ei 只要一把锁保护全局的 链接列表 也就是说在 connect 和 disconnect的时候 用到锁 其他的时候都是线程安全的
2007-09-04 11:02:33 <mryufeng> 这个没有什么疑问的
2007-09-04 11:02:59 <mryufeng> 有疑问的时候 代码是最好的答案
2007-09-04 11:03:01 <bitcowboy> 我是说Erlang调用C,你说的是C调用Erlang。
2007-09-04 11:03:46 <mryufeng> erlang的driver 设计的时候 已经考虑到锁的问题 2种说driver 和 port级别的
2007-09-04 11:04:20 <bitcowboy> 我不是担心线程安全。
2007-09-04 11:04:30 <mryufeng> 一般我们写driver的时候 其实很简单的调用dirver提供的lock函数 就好了
2007-09-04 11:04:36 <mryufeng> 那你担心什么
2007-09-04 11:04:43 <mryufeng> 不稳定?
2007-09-04 11:04:46 <bitcowboy> C代码的多线程效率。
2007-09-04 11:05:02 <bitcowboy> 这也是我们为什么学习Erlang的目的。
2007-09-04 11:05:41 <mryufeng> erlang的smp 里面一大堆lock condition 你认为有效率码?
2007-09-04 11:06:10 <bitcowboy> 呵呵。
2007-09-04 11:06:14 <bitcowboy> It depends.
2007-09-04 11:06:29 <mryufeng> 如何 depends
2007-09-04 11:06:54 <mryufeng> 其实erlang的lock没有任何效率 只是人家把复杂的事情 已经摆平了
2007-09-04 11:07:19 <mryufeng> 我们写driver的时候 相当于2次开发 开发效率就高了 而已
2007-09-04 11:07:30 <bitcowboy> Erlang的内存只读和独特的线程模型,已经很大程度减少了Lock的使用。当然不是完全没有Lock。
2007-09-04 11:07:42 <mryufeng> 谁说的
2007-09-04 11:07:49 <bitcowboy> 我决定不同意你的看法。
2007-09-04 11:08:01 <bitcowboy> 我绝对不同意的你看法。
2007-09-04 11:08:50 <mryufeng> 呵呵 不是同意不同意的问题 你自己可以看下代码 或者-smp 的时候strace下
2007-09-04 11:09:07 <mryufeng> 一陀的futex
2007-09-04 11:09:31 <panxiaof> 今天的问题,好像我都不太懂~不过看着讨论得不错~哈哈
2007-09-04 11:09:33 <AvinDev> 你们貌似一个在说SMP模式,一个在说非SMP?
2007-09-04 11:09:42 <bitcowboy> 不是的
2007-09-04 11:09:58 <bitcowboy> 大家看问题的角度不一样。
2007-09-04 11:10:14 <mryufeng> 其实erlang的smp的机制 和我之前作的系统的底层架构是一模一样的 我自己设计的底层 所以对smp非常熟悉
2007-09-04 11:10:25 <bitcowboy> 哈哈。
2007-09-04 11:10:29 <mryufeng> 非smp的时候 没有用到任何锁
2007-09-04 11:11:08 <bitcowboy> It’s ok. We can discuss.
2007-09-04 11:11:16 <bitcowboy> But
2007-09-04 11:12:04 <mryufeng> 俺一个月在调试各种锁的时候 快疯掉了 所以这种事情还是留给erlang那帮人慢慢把所有的细节都想好 我们做享其成
2007-09-04 11:12:19 <bitcowboy> 我觉得你很了解Erlang的实现,但是你没有理解Erlang的编程思想。
2007-09-04 11:12:45 <mryufeng> 我感觉不是
2007-09-04 11:13:02 <bitcowboy> Erlang绝对不仅仅是帮你写好了一堆锁这么简单。
2007-09-04 11:13:28 <mryufeng> 我认为function语言带来的immutable对程序员的帮助是太大了
2007-09-04 11:14:03 <bitcowboy> 理解了Erlang的编程思想,可以用C写出Erlang一样高并发能力的程序。
2007-09-04 11:14:25 <mryufeng> 但是你应该看到 任何都是不是凭空产生的 它的支撑系统都少不了的
2007-09-04 11:14:32 <bitcowboy> immutable的好处是什么?
2007-09-04 11:14:41 <mryufeng> 不是一样高并发 是高个数量级别的是程序。
2007-09-04 11:14:56 <bitcowboy> immutable好处就是多线程可以不加锁。
2007-09-04 11:15:13 <mryufeng> 这和多线程没有关系
2007-09-04 11:15:35 <mryufeng> process的设计是只有process自己才可以出来message
2007-09-04 11:16:09 <bitcowboy> MPI is a part of immutable.
2007-09-04 11:16:14 <baojing.jiao> yufeng是从实现的角度研究erlang如何实现了fp,至于fp的好处我想肯定大家都知道,要不然都不会在这里谈论了。可以就erlang的编程思想进行一下交流,越辩越明白么。
2007-09-04 11:17:29 <mryufeng> 别人只能把小心扔到他的msg queue里面 只要保证不同时扔 或者扔的时候 没有人在取消息 剩下的完全是 独占使用数据的 和多线程没有任何关系
2007-09-04 11:17:50 <erlanging> 好像错过了精彩演出?
2007-09-04 11:18:18 <mryufeng> 其实我们在设计c程序的时候 也是这样的思想 避免数据交叉使用 尽量让数据的owner来处理数据
2007-09-04 11:18:28 <bitcowboy> In a immutable enviroment, MPI is a good way of ipc.
2007-09-04 11:19:32 <mryufeng> 这个俺不是很懂 但是有一点就是erlang的设计是很中庸的 很务实的
2007-09-04 11:19:38 <baojing.jiao> 这个queue是不是得需要锁了
2007-09-04 11:19:52 <mryufeng> queue有锁呀
2007-09-04 11:20:11 <mryufeng> 但是锁的智能点
2007-09-04 11:20:21 <baojing.jiao> 嘿嘿,看来从你们的谈论中我还是学到点东西了么。哈哈
2007-09-04 11:20:52 <bitcowboy> No matter we talk about one assiment varibales or MPI, we’re talking about immutable. Why immutable so important? Because that’s lock free.
2007-09-04 11:20:53 <baojing.jiao> 自己对c没有经验,不过在了解erlang的过程中,发现erlang的实现确实是比较中庸的。
2007-09-04 11:20:57 <baojing.jiao> 符合我的口味。
2007-09-04 11:21:21 <panxiaof> 以前那一个即时通信的jvava写服务器wildfire的时候,上面写数拷贝使这个服务器的性能影响很大,他们经过优化,把从每秒转2000个包,变成了4000个包;
前天几看好erlang写的同样的服务器,不知道那个狗日的测试结果上写得,每秒2000包以上
感觉性能还是不太好,对erlang第一次产生了不太好的感觉
2007-09-04 11:21:33 <baojing.jiao> 把复杂的东西,在一个地方做掉。其他就方便多了。
2007-09-04 11:22:21 <mryufeng> bitcowboy我明白你的意思 我也明白immtuable 但是我感觉还是不要太停留在别人告诉你 这样那样 最好自己挖潜
2007-09-04 11:23:48 <mryufeng> 其实jabber 这样的文本协议处理是erlang的效率弱像来着
2007-09-04 11:24:16 <bitcowboy> You can’t see Erlang’s value when CPU is single core or dual core. But when CPU have tens or hundreds cores, you’ll see that.
2007-09-04 11:24:33 <cpunion> 2000个包?什么样的包?
2007-09-04 11:24:37 <mryufeng> erlang再出来binary效率就很高 因为他底层实现了很复杂的binary 和 bit操作
2007-09-04 11:25:07 <AvinDev> 啥时候Erlang能在GPU上面跑那才叫NB,GPU上好多核啊:)
2007-09-04 11:25:09 <panxiaof> 就是几百个字符,算是一包
2007-09-04 11:25:41 <mryufeng> erlang在出来文本协议的时候是这样的 binary->list->list操作 ->bianry
2007-09-04 11:25:53 <mryufeng> 而binary自己处理
2007-09-04 11:26:01 <erlanging> list好慢
2007-09-04 11:26:02 <mryufeng> 直接
2007-09-04 11:26:17 <cpunion> 不会吧,我测试短连接256字节一个包,每秒至少有8000个包,长连接都能达到4万的,用C++写的一个更高,长连接7万以上,4CPU
2007-09-04 11:26:27 <bitcowboy> GPUs use flow-computing modle, that’s quite diffrent.
2007-09-04 11:26:27 <mryufeng> list的实现是很慢
2007-09-04 11:27:43 <panxiaof> 我也觉得那个erlang写的ejabberd有很多不太好的地方,但这个2000个每秒的数据,还是有点不接收
2007-09-04 11:27:48 <panxiaof> 接受
2007-09-04 11:27:56 <mryufeng> 2000多差不多了
2007-09-04 11:28:06 <mryufeng> 俺我的理解
2007-09-04 11:28:25 <mryufeng> jabber的xml解释权 公司一个报文 封装一个报文
2007-09-04 11:28:50 <mryufeng> 你用c做个xml 解开 再 封装 你看下 多少时间
2007-09-04 11:29:12 <erlanging> ejabberd我记得可以用expat去解析xml
2007-09-04 11:29:26 <cpunion> XML是很慢。。
2007-09-04 11:29:37 <mryufeng> 100-200us 少了 + io 100us 加其他的 400-500us不是正常码
2007-09-04 11:30:14 <cpunion> 我们现在都是自己的协议格式
2007-09-04 11:30:48 <bitcowboy> Erlang现在的效率是满一点。我已经说了。当CPU有数十个核心是,Erlang的价值才能体现出来。
2007-09-04 11:30:51 <mryufeng> 之前我们用sip作协议的时候 买个$30000 radvision协议stack enocode和decode 用掉了70us 我们没有办法自己写了一个才70us
2007-09-04 11:31:30 <mryufeng> 有10个cpu的时候 我的程序不是也很块
2007-09-04 11:31:43 <erlanging> erlang最nb的是分布式
2007-09-04 11:31:51 <mryufeng> 其实erlang的很大核心不是smp 而是分布式
2007-09-04 11:31:54 <erlanging> smp才刚刚支持来着,估计有很大的空间
2007-09-04 11:32:26 <mryufeng> erlang的实现中我估计有30%是为分布设计的 而smp不到5%
2007-09-04 11:33:08 <mryufeng> 所以smp不是erlang的优势 而分布才是 我是这么理解的
2007-09-04 11:33:45 <bitcowboy> It depands.
2007-09-04 11:33:48 <erlanging> 顶
2007-09-04 11:34:32 <mryufeng> 过去erlang是没有smp的
2007-09-04 11:34:42 <mryufeng> 最近的版本才加进去的
2007-09-04 11:34:43 <erlanging> smp是MPI, PVM的强项
2007-09-04 11:35:15 <mryufeng> sctp smp 和 epoll 都是前2个版本加的功能
2007-09-04 11:35:34 <mryufeng> 而分布的时间应该是 erlang吃奶的时候就有了
2007-09-04 11:35:59 <mryufeng> 难度不能说明问题码
2007-09-04 11:36:16 <bitcowboy> 那个时候没有多核CPU。
2007-09-04 11:36:32 <bitcowboy> 要用发展的眼光看问题。
2007-09-04 11:36:44 <bitcowboy> 过去不代表未来。
2007-09-04 11:36:45 <mryufeng> 没有码?sun的多核都什么时候的东西了
2007-09-04 11:36:49 <bitcowboy> 要看到潜力。
2007-09-04 11:37:13 <mryufeng> 问题我认为 他的潜力 我们可以简单的获取到
2007-09-04 11:37:17 <bitcowboy> Sun的多核,没出几年。
2007-09-04 11:37:42 <mryufeng> ok 我们暂时不讨论这个问题
2007-09-04 11:37:59 <erlanging> erlang的计算能力是fortran的1/50, smp的加速比,再除以个50,也难受哦
2007-09-04 11:38:03 <bitcowboy> 大型机内部本质上是分布式结构的。
2007-09-04 11:38:22 <bitcowboy> Erlang是虚拟机跑的。
2007-09-04 11:38:35 <bitcowboy> Erlang可以不停机换模块的代码。
2007-09-04 11:38:40 <erlanging> 俺就是研究虚拟机的啦~~
2007-09-04 11:38:43 <mryufeng> 虚拟机180多条指令
2007-09-04 11:38:46 <bitcowboy> 这个对服务器是很高的。
2007-09-04 11:39:11 <bitcowboy> 可以不停机维护代码,对服务器程序而言是很有价值的。
2007-09-04 11:39:12 <mryufeng> 呵呵 俺们顺便还研究complier 研究vm 哦
2007-09-04 11:39:43 <mryufeng> 他是如何做到的不停机维护?
2007-09-04 11:40:06 <mryufeng> 这个erlang在设计和实现上 花了很多心思的
2007-09-04 11:40:16 <mryufeng> 从代码可以看出来
2007-09-04 11:42:23 <mryufeng> hot replace erlang在erlang module 级别 和 底层的dll driver 都做了很多努力
2007-09-04 11:43:24 <baojing.jiao> erlang的优势在于分布式,不在于并行,至少目前是这样是么?
2007-09-04 11:43:31 <mryufeng> 成打的工具 这个不是一般人能作出来的 需要很多花费精力
2007-09-04 11:43:57 <mryufeng> 并行科学计算 就不行
2007-09-04 11:44:26 <mryufeng> 但是并行作写计算 如 半io半计算的还是不错的选择
2007-09-04 11:44:51 <erlanging> 非数值的
2007-09-04 11:45:12 <mryufeng> 比如象goolge 那样的 给他些数据 让他找写什么呀 这个好像还挺现实的
2007-09-04 11:49:48 <bitcowboy> So, I said, it depands.
2007-09-04 11:54:30 <erlanging> It’s ur depands means depends?
2007-09-04 11:55:09 <bitcowboy> Sorry, typo.
2007-09-04 11:55:50 <erlanging> I get it
2007-09-05 13:29:00 <coderplay> 我想问问一般大家开发erlang,有哪些测试手段?
2007-09-05 13:29:11 <mjollnir.ray> eunit
2007-09-05 13:29:43 <coderplay> 跟踪呢?
2007-09-05 13:30:07 <mjollnir.ray> http://svn.process-one.net/contribs/trunk/eunit/doc/index.html
2007-09-05 13:30:26 <mjollnir.ray> http://news.csdn.net/n/20070905/108317.html
2007-09-05 13:32:00 <coderplay> 晕,打错了.不是测试,是调试
2007-09-05 13:32:56 <baojing.jiao> 调试用眼睛看。用笔推导。哈哈
2007-09-05 13:34:37 <coderplay> 感觉debugger不是很好用
2007-09-05 15:30:25 <mryufeng> http://mryufeng.javaeye.com/blog/120666
2007-09-06 10:10:51 <AvinDev> Erlang China 的 comments 那里有人在发 Erlang 的 offer,有兴趣的不妨试试:)
2007-09-06 10:11:07 <AvinDev> # mjchen Says:
September 5th, 2007 at 3:59 pm edit
Hi, May I know how to contact you, because our company opened several server / client engineer (erlang) positions recently. If you are interested in them, please do not hesitate to contact me.
I am staffing officer of Ubisoft Shanghai Studio, If you are interested in these positions, please contact me: ming-jian.chen@ubisoft.com
2007-09-06 10:11:47 <renfengxing> 来挖墙角的啊
2007-09-06 10:12:07 <xushiweizh> 哈哈,我这里也招erlang高手。
2007-09-06 10:12:12 <panxiaof> 哦,我技术还差了点,
2007-09-06 10:12:30 <panxiaof> 也不在上海
2007-09-06 10:12:40 <panxiaof> 看来没机会了
2007-09-06 10:14:04 <yuxh312> UBi, sigh
2007-09-06 10:14:28 <rory.cn> UBI怎么了?
2007-09-06 10:14:37 <renfengxing> 呵呵
2007-09-06 10:14:42 <yuxh312> 搞游戏的吧
2007-09-06 10:14:54 <rory.cn> 怎么叹气呢?
2007-09-06 10:14:59 <renfengxing> 小公司,不过貌似89年就成立了
2007-09-06 10:15:07 <yuxh312> Ubi不小啊
2007-09-06 10:15:15 <renfengxing> 多打?
2007-09-06 10:15:17 <renfengxing> 大?
2007-09-06 10:15:18 <yuxh312> 因为我不会玩游戏
2007-09-06 10:15:28 <bitcowboy> Ubi招Erlang程序员?
2007-09-06 10:15:38 <renfengxing> http://www.ubi.com/US/
2007-09-06 10:15:59 <bitcowboy> 待遇如何?
2007-09-06 10:16:05 <yuxh312> 上海只是ubi china
2007-09-06 10:16:22 <bitcowboy> 上海是一个研发中心。
2007-09-06 10:16:57 <yuxh312> zybx是不是被ubi offer过
2007-09-06 10:17:05 <bitcowboy> 是的。
2007-09-06 10:17:11 <bitcowboy> 不过他看不上。
2007-09-06 10:17:18 <yuxh312> 可惜ubi还是挖不动他
2007-09-06 10:17:51 <yuxh312> 貌似2kgame ,”是不是这么写的” 也试过offer他
2007-09-06 10:19:07 <bitcowboy> 2k games吧?
2007-09-06 10:19:23 <yuxh312> *_* , 一下忘了怎么写
2007-09-06 10:19:40 <baojing.jiao> what?
2007-09-06 10:19:50 <bitcowboy> 呵呵,不过Ubi好像不做网游的吧?
2007-09-06 10:20:00 <bitcowboy> 他们招Erlang程序干啥?
2007-09-06 10:20:22 <yuxh312> 多核时代了
2007-09-06 10:20:36 <yuxh312> 单机也跑并行嘛
2007-09-06 10:21:14 <baojing.jiao> 我错过了什么?由公司招erlang程序员了?
2007-09-06 10:21:18 <bitcowboy> Erlang写3D Engine还是不是很成熟吧?
2007-09-06 10:21:44 <xushiweizh> 说不定他们想做网游了。
2007-09-06 10:21:49 <AvinDev> baojing.jiao,看 http://erlang-china.org/ 第一个post的comments ![]()
2007-09-06 10:22:00 <jackyz.zhao> 上海育碧,游戏界的知名大拿,恐怕不是写clientside的code。
2007-09-06 10:23:31 <baojing.jiao> 育碧是做游戏的。
2007-09-06 10:23:50 <baojing.jiao> 我认识一个哥们是育碧的讲师。估计他们招erlang是去做server端吧
2007-09-06 10:24:24 <AvinDev> “opened several server / client engineer (erlang) positions recently”
估计两方都用Erlang
2007-09-06 10:24:59 <panxiaof> 。。。。
2007-09-06 10:25:19 <baojing.jiao> 客户端怎么用erlang?
2007-09-06 10:25:30 <baojing.jiao> 客户端基本上就是3d渲染了
2007-09-06 10:25:44 <coderplay> 把erts封装
2007-09-06 10:25:44 <baojing.jiao> erlang这块不是强项。
2007-09-06 10:25:50 <AvinDev> 呵呵,他们也没有说一定是游戏客户端:)
2007-09-06 10:26:06 <baojing.jiao> 他们不做游戏做什么? ![]()
2007-09-06 10:26:16 <coderplay> 他们是指?
2007-09-06 10:26:18 <coderplay> 来晚啦
2007-09-06 10:26:24 <yuxh312> UBi
2007-09-06 10:26:38 <baojing.jiao> 我找朋友帮我问问不就知道了。
2007-09-06 10:28:36 <coderplay> 育碧,呵呵
2007-09-06 10:28:50 <coderplay> 看样子是做服务器咯
2007-09-06 10:29:00 <renfengxing> 这么多人嘲笑UBI啊
2007-09-06 10:30:07 <baojing.jiao> who?
2007-09-06 10:31:19 <renfengxing> 你看看前面,都说的“ubi,呵呵,sigh”之类,俺不玩游戏,还没听过这公司…俺也 sigh一个
2007-09-06 10:31:47 <bitcowboy> 我也不玩游戏,不过Ubi还是听说过的。
2007-09-06 10:31:59 <renfengxing> …
2007-09-06 10:32:49 <yuxh312> 嗯,听说Ubi还是当年被WT熏陶的
2007-09-06 10:33:30 <bitcowboy> 有钱的公司我都听说过,哈哈哈
2007-09-06 10:59:28 <panxiaof> 再问一下一个问题,一般的台式机2G cpu 2G RAM 1秒能起多少process?? process有上限吗?
2007-09-06 11:00:04 <panxiaof> 能稳定空跑多少process
2007-09-06 11:00:08 <bitcowboy> 这个没试郭。
2007-09-06 11:00:22 <AvinDev> 上限是跟内存相关的哦,可以设每个process的堆大小
2007-09-06 11:00:25 <bitcowboy> 不过据说Erlang处理几万个process没问题。
2007-09-06 11:00:43 <AvinDev> 100W也是没问题滴
2007-09-06 11:01:19 <panxiaof> 那5秒内能起100W吗?
2007-09-06 11:01:28 <bitcowboy> 。。。。。
2007-09-06 11:01:35 <bitcowboy> 估计可以的。
2007-09-06 11:01:39 <AvinDev> 要看各人的机器的啊,你试试咧
2007-09-06 11:02:01 <panxiaof> 我希望能到那个级别~hehhe
2007-09-06 11:40:07 <coderplay> 处理io很容易占掉内存,process占很少啦
2007-09-06 11:40:43 <baojing.jiao> 怎么又突然冒出一句
2007-09-06 11:40:51 <AvinDev> yufeng在那64位机器上跑了多少个进程?
2007-09-06 11:41:47 <coderplay> 没跑多,102400
2007-09-06 11:43:25 <AvinDev> 以前做过试验,设小了进程的堆大小,CPU占用更加高,应该是GC次数变多的原因,不能过分追求进程数啊~
2007-09-06 11:43:43 <coderplay> 对
The bot is started! 2007-09-06 11:51:10
2007-09-06 11:53:23 <baojing.jiao> 是不是我老掉线,怎么看你们的话都没有上下文呢?
2007-09-06 11:53:57 <coderplay> 进程中
ErlMessageQueue msg; /* Message queue */
ErlOffHeap off_heap; /* Off-heap data updated by copy_struct(). */
Eterm* arith_heap; /* Current heap pointer. */
这些会增大
2007-09-06 11:54:15 <coderplay> 但这与能跑多少进程无关
2007-09-06 11:54:25 <coderplay> 是你的其它业务
2007-09-07 00:01:04 <panxiaof> 刚才看了一下那个erlang的书,上面说celeon 2.4G每秒可以产生280000Process,512M可以起300000Process
2007-09-07 00:04:01 <panxiaof> 对了,wall-clock time是什么东东啊
2007-09-07 00:06:08 <panxiaof> 说错了,好像每秒是8W Process, 如果算这个wall-clock time的话
2007-09-07 00:15:44 <cpunion> google 什么是wallclock time
2007-09-07 00:17:30 <panxiaof> 找了一下还是不太明白。。。
2007-09-07 00:17:55 <cpunion> 我也跑过那个测试,测试结果告诉我的成绩和实际运行相差比较多,可能就是进程运行的总时间。
2007-09-07 00:23:52 <cpunion> http://read.cdbook.cn/11642/viewspace-1827.html
2007-09-07 00:26:13 <panxiaof> 哈:)
2007-09-07 08:56:03 <bitcowboy> 我想看lists的源码,在哪里找?
2007-09-07 10:54:20 <mryufeng> wallclock time 就是挂钟时间 也就是电脑当前的time 给人看的
2007-09-07 10:56:31 <panxiaof> 我昨天问的问题,起一个procss有人测试过在ceolon 2.4G上要花10 个微秒wallclock time
2007-09-07 10:56:49 <mryufeng> 差不多是这个数字
2007-09-07 10:58:18 <mryufeng> process实际上就是初始化一个erl_process这样的数据结构
2007-09-07 10:59:35 <mryufeng> 熟悉vm的人都知道 就是一些stack 和 heap 已经vm运行期需要的一些辅助结构 用到的内存资源都是从池中去的 所以速度飞快 几个us差不多
2007-09-07 11:00:49 <mryufeng> 你可以看下 erl_process.[ch]
2007-09-07 11:01:14 <panxiaof> 我想问一个问题,也是比较傻的~我有几万条记录,读取特别频繁,用ets每秒是读个100W还差一点,我想知道如果自个用C++实现一个hash,速度上会不会可以快上一个数量级别
2007-09-07 11:01:33 <bitcowboy> 可以。
2007-09-07 11:01:46 <mryufeng> 不会 ets本来就是hash结构的
2007-09-07 11:02:07 <bitcowboy> ets应该是O(logN)的时间,hash可以接近O(1).
2007-09-07 11:02:16 <bitcowboy> ets
2007-09-07 11:02:27 <bitcowboy> ets 本来就是hash的?
2007-09-07 11:02:34 <bitcowboy> 没看过实现。
2007-09-07 11:02:37 <mryufeng> 你读取数据的时候 除了hash查找的时间 还涉及到参数的变形
2007-09-07 11:02:52 <panxiaof> 好像ets就是hash的,所以我在想用ets就可以了,
2007-09-07 11:02:54 <mryufeng> ets 2种实现 hash和tree
2007-09-07 11:03:27 <mryufeng> 人家细节作的非常完善 你自己写的hash还是免了把
The bot is started! 2007-09-07 11:07:08
2007-09-07 11:07:22 <AvinDev> ets可以设用那种类型的哦。。。
Type = set | ordered_set | bag | duplicate_bag
默认是set,也就是gb_sets吧?那是O(logN)的
2007-09-07 11:07:57 <panxiaof> bag呢?
2007-09-07 11:08:05 <bitcowboy> 100W感觉是logN的能力。
2007-09-07 11:08:16 <mryufeng> 不是gb_set是自己c实现的set
2007-09-07 11:08:52 <mryufeng> 100w 已经是1us一个了 你认为不够快码?
2007-09-07 11:09:03 <davies.liu> 看 programing erlang
2007-09-07 11:09:12 <davies.liu> 上面讲得很清楚
2007-09-07 11:09:23 <AvinDev>
好
2007-09-07 11:09:31 <mryufeng> 因为你去数据的时候 ets是把数据拷贝 这个也包含在1us里面
2007-09-07 11:09:50 <panxiaof> 不过,我从300W读一个数据100W次,与30W里同读一个数据100
2007-09-07 11:09:58 <panxiaof> 次,花的时间差不多
2007-09-07 11:10:53 <bitcowboy> 那估计是hash了。
2007-09-07 11:11:04 <mryufeng> 这就说明了hash时间非常短 实际的时间在copy数据
2007-09-07 11:11:27 <bitcowboy> 如果涉及数据copy的吧,看数据有多大了。
2007-09-07 11:11:49 <mryufeng> 数据多大 除了binary都要拷贝的
2007-09-07 11:12:15 <bitcowboy> 数据大的话copy就要多话时间啊。
2007-09-07 11:12:35 <bitcowboy> 同样100W次就会差很多了。
2007-09-07 11:12:51 <panxiaof> 我昨天测试的是mnesia,ets的测试我忘记了~你去读一个空的数据100W次与读一个20字符的数据100W次,时间相差1倍多一点点
2007-09-07 11:12:55 <mryufeng> 正常情况下 erlang的hash是 根据数据类型作优化的 速度上肯定非常快的
2007-09-07 11:13:38 <mryufeng> 那就说明 hash操作时间 == copy20bytes的时间
2007-09-07 11:14:00 <AvinDev> 嗯,找到了
Internally, ETS tables are represented by hash tables (except ordered
sets, which are represented by balanced binary trees).
2007-09-07 11:14:25 <jackyz.zhao> programming erlang 第 15 章讲得很明白,ets 中 set 是 o(1) tree 是 o(logN) ,一般来说,数据都是 copy 的,例外的情况是 binary ,binary 不做 copy 而是从单独的 binary heap 做 ref ,所以,比其他数据类型更快。
2007-09-07 11:14:43 <mryufeng> 和你说了 ets的实现只要2种 tree 和 hash
2007-09-07 11:15:10 <mryufeng> 但是binary不参与gc 浪费内存
2007-09-07 11:15:38 <jackyz.zhao> 上面的 tree 说错了,是 order set
2007-09-07 11:15:46 <davies.liu> joe 建议用binary,而不是string
2007-09-07 11:16:02 <AvinDev> 那binary没有引用指向的时候也不会gc?你说的不参与gc是啥意思
2007-09-07 11:16:12 <mryufeng> binary肯定快 但是你得有多内存
2007-09-07 11:16:15 <jackyz.zhao> binary会gc的,由 erlang 自己维护引用计数
2007-09-07 11:16:42 <jackyz.zhao> 反而是 ets 中的东西不会 gc
2007-09-07 11:16:53 <mryufeng> 就是ets用到的binary ref +1 你delte的时候才-1
2007-09-07 11:16:55 <davies.liu> ets 还不参与gc呢,
2007-09-07 11:17:25 <mryufeng> 所以ets容易把binary给霸住了
2007-09-07 11:17:53 <davies.liu> 霸住?要用的数据,当然不能给回收了
2007-09-07 11:18:00 <jackyz.zhao> 会不会霸住,要看你怎么用了
2007-09-07 11:18:13 <AvinDev> ets的数据要存着用的啊,当然不能gc。。。。删了的是要gc的。。
2007-09-07 11:18:27 <mryufeng> 我说的是注意事项
2007-09-07 11:19:38 <mryufeng> ets还是蛮好用的 erlang自己的lib里面大量用到了
2007-09-07 11:19:50 <bitcowboy> ETS is highly efficient - using ETS, you can store colossal amounts of data (if you have enough memory) and perform lookups in constant (or in some cases logarithmic) time.
2007-09-07 11:20:34 <jackyz.zhao> 嗯,这个注意事项倒是不错,用完释放,总是错不了的。
2007-09-07 11:20:36 <bitcowboy> 看样子,默认是hash的。
2007-09-07 11:20:58 <mryufeng> 默认是hash来着
2007-09-07 11:21:12 <mryufeng> hash对一般的用途都够用了
2007-09-07 11:21:14 <jackyz.zhao> 除了 order set ,其他的好像都是 hash
2007-09-07 11:21:22 <panxiaof> 但1微秒对2.4G的CPU来说,是2400时间周期~都说人心不足,我也是想着ets的性能会不会更好一些
2007-09-07 11:21:26 <bitcowboy> hash就是费内存。
2007-09-07 11:21:49 <mryufeng> hash如何浪费内存
2007-09-07 11:21:49 <mryufeng> ?
2007-09-07 11:22:19 <mryufeng> hash 是最紧凑的数据结构
2007-09-07 11:22:27 <bitcowboy> hash算法不可能吧每一块内存都利用上的。
2007-09-07 11:22:48 <bitcowboy> 那样的hash算法开销是很大的。
2007-09-07 11:22:55 <mryufeng> linux内核里面70%以上的数据 结构是hash
2007-09-07 11:23:11 <bitcowboy> 我没说hash不好。
2007-09-07 11:23:20 <mryufeng> bitcowboy 还是仔细看下hash的实现
2007-09-07 11:23:24 <xushiweizh> hash据我的测试,在大数据量的时候性能不如tree。
2007-09-07 11:23:33 <xushiweizh> 主要是rehash过程比较慢。
2007-09-07 11:23:37 <mryufeng> hash是最省内存的结构
2007-09-07 11:23:50 <xushiweizh> 除非你事先知道hash table的size。
2007-09-07 11:23:53 <mryufeng> 你的bucket搞大些
2007-09-07 11:24:21 <mryufeng> erlang就是比较遗憾 没有参数让你调整hash bucket的大小
2007-09-07 11:25:01 <mryufeng> linux 内核 就考虑的更细 关键的hash都给你预先设置bucket的机会
2007-09-07 11:25:09 <bitcowboy> 呵呵,hash最省内存,好像每人这么说过。
2007-09-07 11:25:17 <mryufeng> rehash的时候就麻烦
2007-09-07 11:25:21 <bitcowboy> 没人
2007-09-07 11:25:36 <mryufeng> hash就是一个数组 一个list
2007-09-07 11:25:39 <bitcowboy> 数据量不是很大的时候,hash是好的。
2007-09-07 11:26:26 <bitcowboy> hash为了避免冲突,通常会占用比实际需求更大的内存。
2007-09-07 11:26:28 <mryufeng> 数组的大小 就是bucket的大小 10240 个桶才40k内存
2007-09-07 11:26:41 <mryufeng> 你说省不省
2007-09-07 11:27:06 <mryufeng> hash为了避免冲突,通常会占用比实际需求更大的内存。 —》不知道你是哪里看来的?
2007-09-07 11:27:21 <xushiweizh> 从这个意义上说,hash 比 tree省多了。
2007-09-07 11:27:35 <zhuzhaoyuan> hash的性能和hash函数的设计是息息相关的。我觉得你们在争论的时候,是不是该考虑一下你们用的hash算法是不是一样的先?
2007-09-07 11:27:43 <xushiweizh> 因为 c++ 的 rb tree 每个node很费内存。
2007-09-07 11:28:26 <mryufeng> 每个桶是list来着 需要的时候才分配项 一般来讲就是2个pointer位置 8bytes 你说不省
2007-09-07 11:28:44 <mryufeng> 唯一麻烦的就是 hash rehash的时间很长
2007-09-07 11:29:03 <xushiweizh> 是的,不是一般的长。
2007-09-07 11:29:07 <zhuzhaoyuan> 老许的红黑树之所以性能比hash高,是因为那个hash设计的不好吧? ![]()
2007-09-07 11:29:21 <mryufeng> 所以就是预留大的bucket
2007-09-07 11:29:30 <xushiweizh> 不是,是hash本身的缺陷决定的。
2007-09-07 11:29:37 <xushiweizh> 所有的hash都这样。
2007-09-07 11:29:53 <mryufeng> 内核我调bucket都把bucket搞的非常大 避免碰撞
2007-09-07 11:30:03 <xushiweizh> 除非hash table的size可预计,否则只要有rehash,性能急剧下降。
2007-09-07 11:30:07 <mryufeng> 反正bucket也占用不了多少内存
2007-09-07 11:30:30 <panxiaof> 可是erlang可以调这个bucket吗?
2007-09-07 11:30:40 <mryufeng> epoll_wait的那个 table 也有这个问题
2007-09-07 11:31:33 <xushiweizh> 我做过大量的io,这方面有不少经验。其实sgi stl的hash已经做的很好了。但是数据不确定的时候,我还是推荐用 rb tree。
2007-09-07 11:31:37 <mryufeng> 默认好像是 256 但是我们运行的时候handle可能几w 所以就不停地扩大
2007-09-07 11:32:30 <mryufeng> 这个变成可调 其实就是1-2行代码的问题 但是erlang没有做
2007-09-07 11:36:38 <bitcowboy> STL的rb_tree一个节点16个字节。
2007-09-07 11:38:18 <bitcowboy> 10240 40k,只够记一个指针的。
2007-09-07 11:39:08 <bitcowboy> 这10240个节点都用慢的话,rehash的代价将非常大。
2007-09-07 11:39:30 <bitcowboy> 这样的hash的平均新能并不好的。
2007-09-07 11:40:10 <bitcowboy> hash速度要快,浪费一点内存是可以接受的。
2007-09-07 11:40:47 <NetSnail> erlang ets的bucket是多少?
2007-09-07 11:42:02 <mryufeng> #define SZEXP 8
#define SEGSZ (1 << SZEXP)
2007-09-07 11:42:08 <mryufeng> 256来着
2007-09-07 11:43:24 <xushiweizh> 256的bucket size少了点。
2007-09-07 11:43:54 <bitcowboy> 难道不会动态增长的?
2007-09-07 11:44:02 <xushiweizh> 不过初始多少都没有用,最重要还是size可估计。
2007-09-07 11:44:09 <xushiweizh> 可以动态增长。
2007-09-07 11:44:31 <xushiweizh> 但是增长(rehash)麻烦。
2007-09-07 11:44:39 <zhuzhaoyuan> size可估计那就性能不会很差呀
2007-09-07 11:44:53 <xushiweizh> 是的。
2007-09-07 11:46:15 <panxiaof> 那size你估计到了,在erlang里又有什么用?
2007-09-07 11:46:50 <mryufeng> 有用呀 那就不用rehash
2007-09-07 11:46:53 <xushiweizh> erlang中确实没用。给joe个建议。
2007-09-07 11:47:19 <xushiweizh> panxiaof的意思,erlang没有这样的接口。
2007-09-07 11:47:28 <AvinDev> me, yufeng, aol, xushiwei,还有who?
2007-09-07 11:47:42 <mryufeng> 呵呵 让他们把桶都可以用env变量调整
2007-09-07 15:21:41 <bitcowboy> 嗯,发现上午关于hash费内存的问题,我错了。
2007-09-07 15:22:07 <xushiweizh> ![]()
2007-09-07 15:22:49 <panxiaof> oh~
2007-09-07 15:23:18 <AvinDev> 讲解一下如何发现错的:)
2007-09-07 15:23:23 <xushiweizh> bitcowboy明天的聚会去吗?
2007-09-07 15:25:09 <bitcowboy> 其实我的意思是,想避免rehash,就要把bucket开得大一点,所以有点费。但是其实和rb tree比,可能还是会省一点的。
2007-09-07 15:25:30 <xushiweizh> 确实是这样。
2007-09-07 15:25:50 <xushiweizh> rb tree费得惊人。
2007-09-07 15:26:14 <xushiweizh> 但是它的好处是性能很稳定。
2007-09-07 15:26:23 <mryufeng> 呵呵 erlang 运行起来动辄大几百M 不怕这点浪费了
2007-09-07 15:27:06 <xushiweizh> 我曾经向hash table和rb tree中加入1亿个int,hash table运行了一天没有完成,rb tree不到1小时完成了。
2007-09-07 15:27:35 <bitcowboy> rb tree其实如果节点要存的东西很大,16字节的开销也就无所谓了。不过在rb tree里面只存一个DWORD的话,那就……
2007-09-07 15:28:52 <bitcowboy> 其实,hash table的特点是,保证了查找时间接近O(1),从来没说过插入性能很好。
2007-09-07 15:29:05 <xushiweizh> 嗯。
2007-09-07 15:29:50 <bitcowboy> rb tree的特点是,插入和查找的性能都是差不多的,而且是可以估计的,O(logN)的速度,很多时候也够用了。
2007-09-07 15:30:48 *** mryufeng is being a moron trying to flood the channel
2007-09-07 15:30:50 <xushiweizh> 其实插入和查找理论上来说时间是差不多的。如果没有rehash,插入也是O(1)。
2007-09-07 15:31:14 <bitcowboy> 哈哈,就是有rehash啊。
2007-09-07 15:32:15 <panxiaof> 我问一下哦,如果是字符串做索引,我看那啊ets也很快,比那个int的索引的好像也就慢个一倍。感觉应该相差很大,所以有点不解
2007-09-07 15:32:16 <mryufeng> hash_grow的时候是以128 为单位叠加上去的
2007-09-07 15:32:30 <mryufeng> 不行就hack下代码 把这些数字搞大
2007-09-07 15:32:37 <xushiweizh> yufeng是说erlang?
2007-09-07 15:32:47 <mryufeng> 是呀
2007-09-07 15:33:00 <xushiweizh> 如果是这样的话,比sgi stl的hash糟糕。
2007-09-07 15:33:12 <mryufeng>
if (tb->nsegs == 1)
sz = SEG_LEN;
else
sz = tb->nsegs + SEG_INCREAMENT;
new_seg = (HashDbTerm***)
erts_db_realloc(ERTS_ALC_T_DB_SEG_TAB,
(DbTable *) tb,
(void *) tb->seg,
sizeof(HashDbTerm**)*tb->nsegs,
sizeof(HashDbTerm**)*sz);
2007-09-07 15:33:18 <xushiweizh> 和mfc的hash差不多。
2007-09-07 15:33:27 <mryufeng> 不过他的数据是分SEG的
2007-09-07 15:33:51 <mryufeng> 但是它估计没有预期你们搞那么大的数据量
2007-09-07 15:34:21 <xushiweizh> sgi stl的hash bucket增长比较合理。
2007-09-07 15:34:51 <xushiweizh> 如果是等差序列增长,那么大数据量肯定受不了。
2007-09-07 15:34:57 <bitcowboy> 我去看下ets的源码再发言。
2007-09-07 15:35:26 <mryufeng> 它就是这么干的
2007-09-07 15:36:11 <mryufeng> 看错了
2007-09-07 15:36:14 <xushiweizh> 分segment可以减少bucket本身的挪动。但是data搬移还是有的。
2007-09-07 15:36:51 <mryufeng> 是以256为单位增加的 segment是以128为单位增加的
2007-09-07 15:37:47 <mryufeng> 所以你大量的数据的话 就会有大量的segment
2007-09-07 15:39:02 <bitcowboy> bucket变大了,能不能不rehash的?
2007-09-07 15:40:04 <xushiweizh> 不能。只能减少rehash次数来加速。预测最终的bucket大小,就成了关键。
2007-09-07 15:41:04 <bitcowboy> 比如,其实不改变bucket。但是增加bucket的数量。hash值出来后到多个bucket的相同位置去查找。
2007-09-07 15:42:19 <xushiweizh> 这样和没有增加bucket大小差不多。
2007-09-07 15:42:21 <bitcowboy> 不过bucket多了的时候效率就下降了。
2007-09-07 15:42:50 <xushiweizh> 失去了bucket扩容的意义。
2007-09-07 15:42:55 <bitcowboy> 嗯。好像没用。
2007-09-07 15:45:07 <mryufeng> 好像没有rehash过程
2007-09-07 15:45:31 <xushiweizh> erlang? 这么强?
2007-09-07 15:46:06 <xushiweizh> 什么算法解决冲突?
2007-09-07 15:46:14 <xushiweizh> bucket size = ?
2007-09-07 15:47:58 <mryufeng> 一般的hash是bucket+list
2007-09-07 15:48:15 <mryufeng> 他是bucket + list 数组
2007-09-07 15:49:12 <mryufeng> 也就是说 碰撞的时候 就简单的加到list去 list容量不够的时候 再生成一个list
2007-09-07 15:49:51 <xushiweizh> 哦,是数组的list吧?
2007-09-07 15:50:20 <xushiweizh> 那么数据大了的时候,岂不是冲突 很多?
2007-09-07 15:50:26 <mryufeng> right
2007-09-07 15:50:32 <mryufeng> 是冲突很多
2007-09-07 15:51:34 <mryufeng> get 的时候就是 定位到bucket的时候 狂遍历list 的 list
2007-09-07 15:51:35 <xushiweizh> 这样,到最后时间性能可能会不如rb tree。
2007-09-07 15:51:51 <xushiweizh> 当然空间性能是很不错了。
2007-09-07 15:51:59 <mryufeng> 这样 数据量大 肯定不行
2007-09-07 15:52:07 <mryufeng> 空间利用率很好
2007-09-07 15:52:23 <mryufeng>
hval = MAKE_HASH(key);
HASH(tb, hval, ix);
b1 = BUCKET(tb, ix);
while(b1 != 0) {
if ((b1->hvalue == hval) && EQ(key, GETKEY(tb, b1->dbterm.tpl))) {
HashDbTerm* b2 = b1->next;
Eterm copy;
if ((tb->common.status & DB_BAG) ||
(tb->common.status & DB_DUPLICATE_BAG)) {
while((b2 != 0) && ((b2->hvalue == hval) ||
(b2->hvalue == INVALID_HASH)) &&
EQ(key, GETKEY(tb, b2->dbterm.tpl)))
b2 = b2->next;
}
copy = put_term_list(p, b1, b2);
CHECK_TABLES();
*ret = copy;
return DB_ERROR_NONE;
}
b1 = b1->next;
2007-09-07 15:52:49 <AvinDev> yufeng说过,R12的时候会用Judy Array来取代hash?
2007-09-07 15:53:08 <cooljiwen> 我的屁股疼啊。
2007-09-07 15:53:09 <mryufeng> 我说那帮人有这个打算
2007-09-07 15:53:23 <mryufeng> 号称judy array性能会好很多
2007-09-07 15:53:49 <xushiweizh> 这样的“内幕”消息在哪发布的一般。:)
2007-09-07 15:53:51 <mryufeng> 是list的list
2007-09-07 15:53:58 <bitcowboy> 就是说,不管数据量多大,冲突的概率都是1/256?
2007-09-07 15:53:58 <mryufeng> maillist
2007-09-07 15:54:34 <xushiweizh> 哦,我订了,不过一般没时间细看。
2007-09-07 15:55:57 <mryufeng> #define BUCKET(tb, i) (tb)->seg[(i) >> SZEXP][(i) & SZMASK]
2007-09-07 15:56:09 <mryufeng> 他这bucket的函数很人 不一样
2007-09-07 15:56:22 <mryufeng> 看来要好好研究下 hash的实现
2007-09-07 15:56:36 <mryufeng> 本来以为是简单的hash看来 不是这样的
2007-09-07 15:56:53 <mryufeng> 先不下结论 等研究明白了 再说
2007-09-07 15:57:13 <xushiweizh> 这是分段,如此看来,它的bucket应该会比较大才对。
2007-09-07 15:57:26 <xushiweizh> 不然分段就没有意义了。
2007-09-07 15:57:36 <baojing.jiao> yufeng是不是在公司做技术选型的,或者属于实验室探索性的
2007-09-07 15:57:52 <xushiweizh> stl只有deque才是这种分段结构的。
2007-09-07 15:59:36 <NetSnail> 这样说来,他的bucket很大呀
2007-09-07 17:37:10 <baojing.jiao> erlang对字符串的处理是不是弱项呀。只能映射到asiic 码,中文怎么处理?
2007-09-07 17:39:48 <AvinDev> 中文也是用数字方式存列表里头啊,只是GBK到UTF8这样的编码转换麻烦点而已:)
2007-09-07 17:41:41 <baojing.jiao> 比如我是utf-8编码的,存的是数字,但是我解码的时候怎么晓得他是utf-8编码的呢
2007-09-07 17:42:07 <NetSnail> 猜.
2007-09-07 17:42:44 <AvinDev> 要确定好传输的编码啊,来的是 binary,不知道是啥编码也没辙。。
2007-09-07 17:43:10 <baojing.jiao> 我明白你的意思了。
2007-09-07 17:44:05 <baojing.jiao> 不过说回来erlang对字符的操作还是不那么轻松,容易
2007-09-07 17:44:14 <AvinDev> 是的
2007-09-07 17:44:28 <baojing.jiao> http://beerriot.com/ 是用erl开发的web项目,当然比较小。
2007-09-07 17:45:23 <baojing.jiao> erlang的一些库还是太少,search这块erlang有没有lib可用?
2007-09-07 17:45:50 <baojing.jiao> 用erlang开发出一个search引擎的话,是不是可以提高erlang的关注度呀。
2007-09-07 17:47:18 <NetSnail> 不好搞呀,erlang搞密集计算感觉不行.
2007-09-07 17:47:54 <panxiaof> 适合分布~哈
2007-09-07 17:48:09 <NetSnail> 特别是字符串。我们做过实验,解析文本协议,差别在50倍左右
2007-09-07 17:48:11 <AvinDev> 感觉不够Java的Lucene+Hadoop竞争,密集计算实在有点慢
2007-09-07 17:48:57 <cpunion> 不会吧?这么慢?用HiPE了吗
2007-09-07 17:50:53 <cpunion> 我测试它比C++慢5倍左右,比python快2-3倍。字符串操作没比较过,测试的是fibonacci
2007-09-07 17:51:05 <panxiaof> 上次我就看到有人测试那个erlang写的IM服务器ejabberd,他一秒是转2000个包,yufeng解释问题可能就出在文本协议解析上
2007-09-07 17:51:14 <NetSnail> 不是的,我们只是单纯的处理把协议包解析了下,不涉及io的
2007-09-07 17:51:50 <mryufeng> erlang 的字符解释是用函数递归来作的
2007-09-07 17:52:08 <baojing.jiao> erlang可能更适合做分布式应用的胶水部分,其他的比如密集计算还得c上吧。
2007-09-07 17:52:20 <mryufeng> 你看下 c移动一个指针位 而erlang的vm要做多少事情
2007-09-07 17:52:33 <mryufeng> 速度当然不能比较了
2007-09-07 17:52:53 <baojing.jiao> 或者那位告知一下erlang到底适合做什么,在目前。适合在那个点切入?
2007-09-07 17:53:01 <mryufeng> 估计这些密集行的操作 要通过driver或者port解决
2007-09-07 17:53:25 <NetSnail> 我们是用了一个cnode,绕过了一些问题
2007-09-07 17:53:38 <mryufeng> erlang 的 port很强大 就好容易作这个事情
2007-09-07 17:55:27 <cpunion> Herb:我认为你说的是对的。但是,我不同意你提出的理由,说我们必须在各自的语言中加点什么特性吸引用户,从而使他们不去使用其他的微软的语言。为什么呢?比如我吧,我更加关心使用C++或者C#的用户到底需要什么,我怎样才能帮助他们把工作完成得更好。也许某处有某种很牛的特性的语言,但我的工作是 ——怎样才能使客户的工作更成功?我必须要考虑客户会如何集成,我怎样做才能使客户工作得更好,这也是CLR的核心所在,因为目前已经不是靠一种语言就能做完整个项目的时代了。我怀疑在稍有点规模的实际项目中,是否还有人仅仅依靠一种开发语言。
2007-09-07 17:56:01 <mryufeng> to NetSnail: 如何用cnode来解决这个问题
2007-09-07 17:57:07 <mryufeng> 每个语言和系统都有擅长和不擅长的东西 最好取其长 所以hybrid的系统现在很流行哦
2007-09-07 17:57:14 <NetSnail> 主要是要重用我们原来的c++代码
2007-09-07 17:57:49 <mryufeng> 就是部份用c++作 部份通过rpc来让erlang作?
2007-09-07 17:57:49 <NetSnail> 先对收到的包做一些处理,弄成message发到erlang上来
2007-09-07 17:58:05 <mryufeng> 哦 这样 有点意思
2007-09-07 17:58:31 <NetSnail> 是的,还在研究中,上层应用打算全用erlang做
2007-09-07 17:59:12 <AvinDev> 是的,hybrid的系统有个问题就是不太好维护,现在很多公司都是只用一门语言的,这个是事实
2007-09-07 18:14:23 <baojing.jiao> 希望各位在实际工作中有用到erlang,或者对erlang的最佳时间有所了解的,适时的分享一下erlang的最佳实践。很有知道意义哟
2007-09-09 22:26:55 <panxiaof> case [R || R <- Rs, node(R#route.pid) == node()] of
2007-09-09 22:27:14 <panxiaof> 当中那个是什么表达式啊,看不懂,heheh
2007-09-09 22:28:26 <panxiaof> 哦~
2007-09-09 22:29:18 <mryufeng> list comprehension呀
2007-09-09 22:30:15 <panxiaof> R||R<-RS 这是什么啊
2007-09-09 22:30:39 <coderplay> list comprehension
2007-09-09 22:30:46 <mryufeng> 也就是从RS中选出node(pid) == node()的节点
2007-09-09 22:31:32 <mryufeng> R <- Rs是遍历 node(R#route.pid) == node()是条件
2007-09-09 22:31:38 <panxiaof> 哦~~ 我怎么 都没看到过这种表达式,看来还是看得不够多啊
2007-09-09 22:31:59 <mryufeng> 这个erlang代码里面大把
2007-09-09 22:32:19 <panxiaof> 见笑了~hehe
2007-09-09 22:32:21 <davies.liu> list compreshension
2007-09-09 22:36:28 <panxiaof> google了一下,找到了。^_^
2007-09-09 22:42:38 <rory.cn> 刚才打算下载这个的时候出现的。
2007-09-09 22:42:39 <rory.cn> http://media.pragprog.com/titles/jaerlang/code/shop1.erl
2007-09-09 22:54:03 <cpunion> 我对pmap有点疑问,现在看的是这篇文章:http://anonymouse.org/cgi-bin/anon-www.cgi/http://montsamu.blogspot.com/2007/02/erlang-parallel-map-and-parallel.html
2007-09-09 22:54:13 <cpunion> 代理过去的..
2007-09-09 22:54:43 <cpunion> pmap_gather方法是不是按顺序匹配Pids?这样如果结果不是按顺序发回的会怎么样?
2007-09-09 22:56:30 <mryufeng> 不俺顺序也没有事呀 msg match的时候会遍历msg queue来匹配
2007-09-09 22:56:39 <mryufeng> 不过有点土而以
2007-09-09 22:57:10 <cpunion> 哦..还有这一手.
2007-09-09 22:57:10 <mryufeng> 最好是用ets自己来 匹配结果哦
2007-09-09 22:57:16 <mryufeng> y
2007-09-09 22:57:46 <cpunion> 没有match到的,后面再receive时还会接收?是不是一直在队列里
2007-09-09 22:57:53 <yuxh312> 貌似mryufeng嘴边总是挂着ets的,好痴迷啊
2007-09-09 22:58:42 <mryufeng> 不是哦 ets在erlang库里面用到了很多地方
2007-09-09 22:58:49 <mryufeng> 确实有好用的地方
2007-09-09 22:58:54 <yuxh312> 哈哈
2007-09-09 22:59:01 <mryufeng> 要不什么东西 都fp都好麻烦
2007-09-09 22:59:40 <mryufeng> receive的时候重新匹配过
2007-09-09 23:00:15 <mryufeng> 今天还是昨天的erlang的maillist 刚好有一篇文章 大家可以看下 就是说这个问题的
2007-09-09 23:01:05 <mryufeng> title: [erlang-questions] Message-sending performance
2007-09-09 23:02:02 <panxiaof> 好啊,大家知道的都聊聊,我过看看电视10分种后看聊天记录,哈哈
2007-09-09 23:02:50 <cpunion> 一直以为是没match的就丢掉了
2007-09-09 23:02:57 <cpunion> 在看..
2007-09-09 23:03:37 <yuxh312> This is one of the problems one must be keeping an eye on: beware the
size of the mailbox. In your problem you will see that if you replace
receive by
receive {msg, _} -> ok end
the program will execute extremely fast, as with 1 process.
2007-09-09 23:03:41 <yuxh312> 汗
2007-09-09 23:04:21 <mryufeng> 然后再用ets 查找下 是什么结果
2007-09-09 23:04:26 <mryufeng> 就快非常多
2007-09-09 23:04:49 <mryufeng> 这个属于erlang的一种惯用法
2007-09-09 23:08:34 <yuxh312> msg queue是lock-free的吗
2007-09-09 23:09:12 <mryufeng> 在单smp当然是lock free
2007-09-09 23:10:12 <mryufeng> 在多smp下 在往msg queue put msg的时候是要lock的 但是会做些优化 尽可能少lock
2007-09-09 23:10:28 <cpunion> 多CPU上receive应该也是lock free的吧,send应该不是
2007-09-09 23:10:55 <yuxh312> 嗯,我刚才看到一个帖子:Another useful application of SMP-safe lock-free FIFO queues could be
inside the emulator. Correct me if I am wrong but in the emulator with
SMP support different schedulers use mutex synchronization in order to
get the next process descriptor off of a shared linked list of all
processes waiting to be dispatched. Also when copying a message sent by
some Erlang process to a mailbox of another Erlang process the emulator
with SMP support uses POSIX locking to ensure thread safety (if I
remember it correctly).
2007-09-09 23:11:05 <yuxh312> by Serge Aleynikov-2 Aug 08, 2007
2007-09-09 23:12:39 <mryufeng> 就是这个样子的哦
2007-09-09 23:15:22 <mryufeng> emulator的smp感觉做的还是比较细致 周道 但是好像可以再细一点
2007-09-09 23:16:06 <yuxh312> 呵呵,这句话跟你这句差不多:We will definitely consider using lock-free data structure in future releases
of the SMP emulator. Thanks for the references. Now that the SMP emulator
seem to be stable, most of our future work on it will be to improve its
performance.
/Bjorn
2007-09-09 23:17:02 <mryufeng> 呵呵 俺作作类似的工作 所以对这lock是体会比较省的
2007-09-09 23:17:43 <mryufeng> 俺学多线程编程的时候 看一本书上讲 1. 不要多线程 2.还是不要多线程 3. 千万不要多线程
2007-09-09 23:17:57 <mryufeng> 但是不理解 现在俺理解了 怕怕
2007-09-09 23:18:40 <yuxh312> 呃, 有过类似这样用排比的警告
2007-09-09 23:18:56 <yuxh312> 不要goto,真的不要goto,千万不要goto.
2007-09-09 23:19:20 <mryufeng> goto 还好 我老了 反而狂goto
2007-09-09 23:19:38 <yuxh312> 哈哈,我也喜欢goto,
2007-09-09 23:20:00 <mryufeng> 对性能比较care的时候 goto很方便
2007-09-09 23:20:05 <mryufeng> 就是代码难看下
2007-09-09 23:20:17 <yuxh312> goto特别适合从深层直接套出来
2007-09-09 23:20:18 <coderplay> FSM用goto很好,很强大
2007-09-09 23:20:20 <yuxh312> 逃出来
2007-09-09 23:20:24 <mryufeng> glibc 自己还狂goto
2007-09-09 23:22:01 <yuxh312> 单向的(不要往回跳)goto还是比较清晰的,大多的时候写到错误处理宏里保证唯一出口也很好用
2007-09-09 23:22:38 <mryufeng> 内核里面的 代码都很遵守你刚才提的原则 感觉很舒服
2007-09-09 23:22:39 <coderplay> for (msgp = p->msg.first; msgp; msgp = msgp->next) 果然都是这样
2007-09-09 23:23:03 <mryufeng> coderplay果然有考证精神
2007-09-09 23:23:14 <yuxh312> orz
2007-09-09 23:23:22 <mryufeng> 想想下 他都要这样作 否者不符合 logic
2007-09-09 23:31:39 <mryufeng> ragel 编译从来的atoi fsm 比他妈的glibc 的人写的还快20-30% 到处是goto
2007-09-09 23:32:02 <yuxh312> 好彪悍
2007-09-09 23:32:51 <mryufeng> 人肉都开始不值钱了
2007-09-09 23:33:27 <yuxh312> -_-!
2007-09-09 23:33:30 <davies.liu> ragel是什么?
2007-09-09 23:33:54 <mryufeng> http://www.cs.queensu.ca/~thurston/ragel/
2007-09-09 23:34:01 <yuxh312> 一个状态机编译器
2007-09-09 23:34:03 <mryufeng> 很cool
2007-09-09 23:34:35 <mryufeng> 俺准备作个 sql文法分析器
2007-09-09 23:35:11 <coderplay> 很好,很强大
2007-09-09 23:35:36 <coderplay> 特别是Visualize output with Graphviz
2007-09-09 23:36:05 <davies.liu> 编译速度比较慢吧
2007-09-09 23:36:34 <coderplay> 找不到比这更快的了
2007-09-09 23:36:49 <mryufeng> 编译速度就是 就是 闪电
2007-09-09 23:37:04 <mryufeng> 确实是个好工具
2007-09-09 23:37:29 <davies.liu> cool
2007-09-09 23:37:56 <davies.liu> mnesia有非key字段的索引么?
2007-09-09 23:38:09 <davies.liu> 否则按其他字段查询就很慢了
2007-09-09 23:38:23 <mryufeng> 可以支持多个key
2007-09-09 23:39:14 <mryufeng> 但是实现比较土 复制ets, 以指定的key为 index 然后发现你用什么key 就查那个ets
2007-09-09 23:39:22 <coderplay> 只要你的内存多 嘿嘿
2007-09-09 23:39:24 <mryufeng> 比较土!!!
2007-09-09 23:39:58 <mryufeng> 这混照 那帮人也敢想 看来老外还是比较猛
2007-09-09 23:40:19 <mryufeng> 混照 == 昏招
2007-09-09 23:40:45 <coderplay> 先做出来,再优化… 内存便宜嘞~~
2007-09-09 23:41:27 <mryufeng> 内核便宜 但是32 位机器 有4g的限制 linux下 准确讲是 3G
2007-09-12 11:23:37 <bitcowboy> 问个SB问题,什么样才算尾递归?
2007-09-12 11:24:17 <zhuzhaoyuan> 呼唤albert lee把例子贴出来
2007-09-12 11:24:34 <bitcowboy> hanoi(0) ->
0;
hanoi(N) ->
2 * hanoi(N - 1) + 1.
2007-09-12 11:24:36 <AvinDev> 递归函数下面不会有其他递归完需要执行的语句,就算是了
2007-09-12 11:24:39 <bitcowboy> 这样算不算?
2007-09-12 11:24:45 <NetSnail> 不算
2007-09-12 11:24:47 <AvinDev> 你这个不算
2007-09-12 11:24:49 <zhuzhaoyuan> 不是
2007-09-12 11:25:03 <bitcowboy> 好的。明白了。
2007-09-12 11:25:25 <jackyz.zhao> http://erlang-china.org/study/the-right-tail-recursive.html
2007-09-12 11:25:31 <AvinDev> hanoi(N-1) 执行完之后还要 * 2,会造成压栈。
2007-09-12 11:25:35 <jackyz.zhao> 刚好有一篇
2007-09-12 11:25:43 <NetSnail> sum([],N)->N;
sum([H|T],N)->sum(T,H+N).
2007-09-12 11:26:14 <baojing.jiao> 递归函数下面不会有其他递归完需要执行的语句,这个怎么理解?
2007-09-12 11:26:49 <AvinDev> 比如上面的 2 * hanoi(N - 1) + 1.
2007-09-12 11:27:01 <NetSnail> 囧rz…这句话其实有点不通顺呢.
2007-09-12 11:27:13 <zhuzhaoyuan> 尾递归可被编译器优化为非递归
2007-09-12 11:27:20 <AvinDev> 嘿嘿,表达能力比较差,召唤达人
2007-09-12 11:28:20 <jackyz.zhao> The important thing to note about tail-recursive functions is that they can run in loops without consuming stack space. Such function are oden called “iterative functions.”
2007-09-12 11:28:52 <zhuzhaoyuan> 传统语言里面,如C语言,递归造成的函数压栈及弹栈过程的消耗是很恐怖的
2007-09-12 11:28:55 <coderplay> 迭代 ![]()
2007-09-12 11:29:31 <NetSnail> 恩恩,sicp里就是直接说迭代的
2007-09-12 11:30:04 <AvinDev> 嗯,因为FP追求变量一次绑定,因此只能用尾递归取代命令式语言里面的迭代
2007-09-12 11:32:41 <bitcowboy> 再问一下,erlang的位移操作是不是像C一样快的?
2007-09-12 11:33:11 <mryufeng> bit操作是在emulator里面c实现的
2007-09-12 11:33:54 <bitcowboy> 我发现我把1 << 64位都可以。
2007-09-12 11:34:12 <bitcowboy> Erlang直接支持大数运算。
2007-09-12 11:34:22 <mryufeng> bigint
2007-09-12 11:34:25 <coderplay> yup
2007-09-12 11:35:25 <bitcowboy> 那样的话,就不能直接用CPU算移位了吧?
2007-09-12 11:37:02 <mryufeng> 为什么不能
2007-09-12 11:37:26 <mryufeng> erlang有位移运算的关字呀
2007-09-12 11:37:43 <bitcowboy> CPU的移位操作是直接差一张硬件表的,只有位数限制的。
2007-09-12 11:38:02 <bitcowboy> 32位,或者64位。
2007-09-12 11:38:11 <mryufeng> 超过呢?
2007-09-12 11:38:36 <bitcowboy> 超过是会异常的。
2007-09-12 11:38:46 <bitcowboy> 不信是可以在C里面试试。
2007-09-12 11:38:47 <mryufeng> 位移运算是硬件实现最简单的事情 还要查表
2007-09-12 11:39:14 <bitcowboy> 查表比较快。
2007-09-12 11:39:20 <mryufeng> erlang的bit操作是很复杂的
2007-09-12 11:39:24 <mryufeng> 快什么呀
2007-09-12 11:39:52 <mryufeng> memory access是 几十个ns级别的
2007-09-12 11:40:01 <NetSnail> 硬件实现就是查表呀.
2007-09-12 11:40:03 <bitcowboy> 查表可以做到不论移动几位都是一个时钟周期完成的。
2007-09-12 11:40:13 <NetSnail> 硬件查表…不用内存的…
2007-09-12 11:40:18 <NetSnail> 就是堆电路
2007-09-12 11:40:22 <bitcowboy> 不是查内存里的表。
2007-09-12 11:40:33 <bitcowboy> 是CPU里面的一个硬件表。
2007-09-12 11:40:36 <mryufeng> 硬件就搞不清楚如何实现的了
2007-09-12 11:40:39 <baojing.jiao> 扯回尾递归,尾递归就是不要保存中间状态,一般采取的措施是把中间状态当作参数传来传去。ok,你们继续。
2007-09-12 11:41:12 <mryufeng> 反正你看成 一个cycle可以完成bit运算就好了 管他如何实现
2007-09-12 11:41:30 <bitcowboy> 我是说位数限制。
2007-09-12 11:41:37 <NetSnail> 至少我们数字电路课的实现是查表,不查表还真想不出怎么实现 =.=
2007-09-12 11:41:40 <baojing.jiao> 我没有设置busy呀。。。
2007-09-12 11:42:02 <AvinDev> 其他客户端有点不太兼容,不要理会:)
2007-09-12 11:42:03 <bitcowboy> 不查表要用循环实现。
2007-09-12 11:42:24 <NetSnail> 循环 @.@ 那样没法并行呀…
2007-09-12 11:42:50 <baojing.jiao> 测试一下…
2007-09-12 11:43:04 <baojing.jiao> 不提示了 ![]()
2007-09-12 11:43:42 <bitcowboy> 我想问的是,C里面的位移运算基本上就是一条硬件指令,所以很快,但是Erlang支持大数运算应该就没有这么简单了。想问问有没有人知道Erlang大概是怎么实现的。
2007-09-12 11:43:54 <mryufeng> 普通机器的bogomips都是4000左右 也就是说执行一个指令0.25ns 左右 考虑那么多干吗
2007-09-12 11:46:17 <bitcowboy> mryufeng,你没理解我的意思。
2007-09-12 11:46:25 <mryufeng> bits操作也是c的移位作的 只是支持很长的bit 作的比较复杂而已
2007-09-12 11:46:53 <bitcowboy> 我就是想知道这个复杂有什么代价。
2007-09-12 11:47:06 <mryufeng> 你看下 erts\emulator\beam\erl_bits.c
2007-09-12 11:47:42 <mryufeng> 就是加些 判断 循环 有什么大的代价?
2007-09-12 11:47:53 <bitcowboy> 循环就是代价么。
2007-09-12 11:48:15 <mryufeng> 呵呵 你自己看下代码把
2007-09-12 12:54:57 <bitcowboy> hanoi(0) ->
0;
hanoi(N) ->
2 * hanoi(N - 1) + 1.
2007-09-12 12:55:12 <bitcowboy> 好像没有办法改成尾递归?
2007-09-12 12:55:25 <mryufeng> 怎么没有办法
2007-09-12 12:55:33 <bitcowboy> 怎么改?
2007-09-12 12:55:36 <bitcowboy> 求教
2007-09-12 12:55:42 <bitcowboy> 请教
2007-09-12 12:55:48 <AvinDev> 汉诺塔貌似有个迭代算法的,将它改成尾递归就可以
2007-09-12 12:56:23 <mryufeng> 用迭代呀
2007-09-12 12:56:30 <bitcowboy> 不用迭代算法。汉诺塔的解=2^n - 1。
2007-09-12 12:57:40 <panxiaof> # fac(N) ->
# % 内部调用尾递归的实现,X=1是初始值
# fac_i(N, 0).
#
# % 尾递归的终结器
# fac_i(0, X) ->
# X;
# % 尾递归的循环器
# fac_i(N, X) ->
# fac_i(N - 1, 2* X).
2007-09-12 12:58:09 <panxiaof> # fac_i(N - 1, 2* X+1).
2007-09-12 12:58:09 <bitcowboy> 我是问,应该不是所有的递归都能写成尾递归的吧?
2007-09-12 12:58:25 <mryufeng> 那是
2007-09-12 12:58:34 <bitcowboy> fac可以写成尾递归。fac本质是个线性问题。
2007-09-12 12:59:00 <panxiaof> 哦~
2007-09-12 13:00:26 <bitcowboy> hanoi的递归解法不是线性的。所以我想不出尾递归写法。用迭代法,或者直接用公式算,那是另外一回事了。
2007-09-12 13:11:22 <bitcowboy> hanoi(N, Iterator, Result) when N == Iterator ->
Result;
hanoi(N, Iterator, ResultSoFar) ->
hanoi(N, Iterator + 1, 2 * ResultSoFar + 1).
2007-09-12 13:11:38 <bitcowboy> 迭代法可以写成尾递归。
2007-09-12 13:11:47 <bitcowboy> 因为迭代是线性的。
2007-09-12 13:12:05 <coderplay> 说反了 ![]()
2007-09-12 13:12:11 <panxiaof> 哦~
2007-09-12 13:12:24 <bitcowboy> 啊?啥说反了?
2007-09-12 13:12:26 <coderplay> 尾递归可以消除成迭代 ![]()
The bot is started! 2007-09-12 13:12:54
2007-09-12 13:12:59 <bitcowboy> 用for循环也可以算是迭代么,本质上是一样的。
2007-09-12 13:13:23 <bitcowboy> 编译器把递归编译成了循环了。
2007-09-12 13:13:23 <coderplay> 在ocaml里面就有这个 如果加上rec 关键字, 编译器就会帮助消除尾递归
2007-09-12 13:13:45 <coderplay> 有的编译器不会的啦
2007-09-12 13:13:54 <bitcowboy> 嗯。不过对hanoi而言,最快的应该是:
2007-09-12 13:13:59 <bitcowboy> fast_hanoi(N) ->
1 bsl N - 1.
2007-09-12 13:14:25 <bitcowboy> 也就是 2^n - 1
2007-09-12 13:15:29 <coderplay> 2^n …
2007-09-12 13:16:51 <bitcowboy> 嗯,你把 2^n - 1 代入到原始公式里替换掉 f(n),你就能证明,这是对的。
2007-09-12 13:17:16 <bitcowboy> f(n) = 2×f(n - 1) + 1
2007-09-12 13:18:01 <bitcowboy> 2^n - 1 = 2×(2^(n - 1) - 1) + 1
2007-09-12 14:50:13 <panxiaof> 我不想用mnesia,想用ets,因为mnesia与ets在同样数据下读的速度上会差上10倍多,同时我的数据也不需要保存,都是些运行时的数据。
可是有个问题解决不了,我需要两个关键字,不知道ets怎么样才能做到
2007-09-12 14:50:49 <bitcowboy> 有没有类似STL的pair这样的东西?
2007-09-12 14:50:57 <davies.liu> 用两个ets,mnesia就是这么做的
2007-09-12 14:51:03 <bitcowboy> {Key1, Key2}?
2007-09-12 14:51:05 <davies.liu> {}
2007-09-12 14:51:12 <panxiaof> 两个ets也不行啊~
2007-09-12 14:51:19 <NetSnail> 支持两个ets ^_^
2007-09-12 14:51:44 <panxiaof> 我不知道你是怎么做的,因为ets没有{key1,key2}这样的结构
2007-09-12 14:52:16 <bitcowboy> 哦,我只是猜一下。还没用过ets。
2007-09-12 14:52:31 <panxiaof> 你删除的时候,你根据一个关键字删除了一个ets的某些数据,然后另一个ets怎么删除?
2007-09-12 14:54:24 <NetSnail> {key1,key2,data…} 存一个ets
{key2,key1,data…} 存一个.
删除时取出一个…用里面的key去另一个删?
2007-09-12 14:58:27 <panxiaof> 好像这样可以,不过这样一来,也存在一些编历成份,好像速度上又降下来了~。。
2007-09-12 14:58:41 <panxiaof> 看来是没有两全其美的方法
2007-09-12 14:59:11 <NetSnail> 恩恩,当你完成了全部增加删除修改操作后,你就实现了一个小的mnesia =.=
2007-09-12 15:00:27 <panxiaof> (我用mnesia 的acitve读数据,1秒35W,而ets同样的数据集,1秒500W,相差太大了)
2007-09-12 15:00:29 <NetSnail> 其实这样的东西,跟语言的关系不是很大呢,用C来写多index的数据结构,也差不多…
2007-09-12 15:01:21 <mryufeng> 35w不够用码?
2007-09-12 15:01:51 <panxiaof> 有点不够~
2007-09-12 15:02:23 <mryufeng> 把表分布 到节点去 就快了
2007-09-12 15:04:40 <panxiaof> 你是说把表分成几个小表是吧?
2007-09-12 15:05:43 <mryufeng> 分成小表 散到其他节点去 让其他的cpu帮你计算
2007-09-12 15:07:44 <panxiaof> en..不过我是很希望,如果ets能支持双key,速度又能达到每秒500W,那太爽了,就没有这么烦的事了
2007-09-12 15:08:07 <panxiaof> 人心不足啊~hehe
2007-09-12 15:08:32 <mryufeng> 双key对库的作者是个挑战哦
2007-09-12 15:10:13 <bitcowboy> Erlang的Eterm是什么东西?
2007-09-12 15:10:30 <bitcowboy> 看Erlang的bigint实现的时候看到的。
2007-09-12 15:10:59 <panxiaof> 商业的oracle,sql好像这个方面做得很到位是吧~(没有测试过oracle表在已经载入内存情况下的多个key的速度)
2007-09-12 15:11:39 <panxiaof> (但他们key的功能真是很强大)
2007-09-12 15:11:56 <mryufeng> 用过商业的extremedb 内存数据库
2007-09-12 15:12:25 <panxiaof> 感觉与mnesia比起来如何?
2007-09-12 15:12:48 <mryufeng> 百万数据量 和ets速度相当 支持多index
2007-09-12 15:13:12 <mryufeng> 会慢一些 但是没有到数量级
2007-09-12 15:14:04 <mryufeng> 比bereklydb快上百倍
2007-09-12 15:14:30 <panxiaof> bereklydb也是开源的,还是商业的?还是free的?
2007-09-12 15:14:40 <baojing.jiao> 是么,我们的cache 框架就是基于bereklydb做的。哈哈
2007-09-12 15:14:54 <panxiaof> 那还不如不做了,哈哈
2007-09-12 15:14:59 <bitcowboy> bereklydb好像是比较慢的。
2007-09-12 15:15:10 <mryufeng> bereklydb 是双重授权
2007-09-12 15:15:20 <mryufeng> 和mysql 差不多
2007-09-12 15:15:25 <bitcowboy> bereklydb比mysql好在哪里?
2007-09-12 15:15:36 <mryufeng> 商业的要求 研究的 个人不要
2007-09-12 15:16:25 <baojing.jiao> bereklydb不是关系数据库,没有sql。用起来根map一样。
2007-09-12 15:16:31 <NetSnail> bereklydb 能多index? 不是个大哈希表么?
2007-09-12 15:16:38 <baojing.jiao> 粗浅理解,嘿嘿
2007-09-12 15:16:50 <mryufeng> 我说 extremedb可以多index
2007-09-12 15:17:04 <mryufeng> bereklydb 不行哦
2007-09-12 15:17:07 <bitcowboy> 啊,原来这年头还有不支持SQL的数据库啊。我火星了。
2007-09-12 15:17:25 <NetSnail> 很多呀 =.=
2007-09-12 15:17:28 <mryufeng> 呵呵 不支持sql的多的去了
2007-09-12 15:17:35 <mryufeng> mnesia不是也不支持
2007-09-12 15:17:47 <bitcowboy> 我以为不只是SQL的都淘汰了。
2007-09-12 15:18:11 <mryufeng> 你要sql查询 就自己作一个哦
2007-09-12 15:18:19 <NetSnail> 并不是每个模型都适合sql的。。。比如ldap…没看出为什么要支持sql。。。
2007-09-12 15:18:33 <mryufeng> en
2007-09-12 15:18:35 <bitcowboy> 哦。
2007-09-12 15:19:12 <bitcowboy> 嗯,typedef unsigned long Eterm;
2007-09-12 15:19:26 <baojing.jiao> 用berekelydb做cache简单,效果么?多上机子,多上内存。应该还不错。哈哈
2007-09-12 15:19:38 <mryufeng> 你对eterm理解的太肤浅了
2007-09-12 15:20:00 <mryufeng> berekelydb 反正不要钱
2007-09-12 15:20:09 <bitcowboy> 我不知道什么叫Eterm,我只是在看代码。
2007-09-12 15:21:22 <davies.liu> 做cache为什么不用memcached?
2007-09-12 15:21:43 <mryufeng> memcache就是一个大的hash表
2007-09-12 15:21:59 <mryufeng> 加多一个网络接口
2007-09-12 15:21:59 <baojing.jiao> 做的时间长了估计。
2007-09-12 15:22:23 <mryufeng> ets随便搞搞也不比memecache差
2007-09-12 15:22:25 <baojing.jiao> 当时选型的时候要么就是没有memechaced,要不就是觉得不适用。
2007-09-12 15:22:46 <panxiaof> milliseconds 是1/1000秒吗?(不好意思,脑袋卡住了)
2007-09-12 15:22:49 <mryufeng> 主要是用的人多了 而且memcache协议和概念简单 容易上手
2007-09-12 15:23:01 <coderplay> bitcowboy貌似对数据库不是很熟 ![]()
2007-09-12 15:23:05 <baojing.jiao> 那意思是erlang可以开发一个分布式的cache
2007-09-12 15:23:32 <bitcowboy> 嗯,我只用过关系型数据库。
2007-09-12 15:23:33 <mryufeng> millisecond
[5mili7sekEnd]
n.
毫秒
2007-09-12 15:23:55 <bitcowboy> ms = 1/1000秒
2007-09-12 15:23:59 <mryufeng> 本来就是这样的 erlang的mnesia就是一个分布式的cache
2007-09-12 15:24:02 <AvinDev> 有篇paper就是说Erlang做的concurrency cache
2007-09-12 15:24:21 <coderplay> sql基于关系演算和关系代数的一种
2007-09-12 15:24:21 <baojing.jiao> cache是少计算,大内存的应用。可以分布式的部署在多计算,少内存的web服务器上。是不是就可以省点硬件投入了?哈哈
2007-09-12 15:24:24 <mryufeng> 分布+并发
2007-09-12 15:25:22 <baojing.jiao> memecached 可以分布式的不是在多台机子上么?没有用过
2007-09-12 15:25:37 <mryufeng> 可以多台分布
2007-09-12 15:25:37 <baojing.jiao> 还是说是单台
2007-09-12 15:25:47 <AvinDev> 客户端来实现分布
2007-09-12 15:26:01 <mryufeng> 要在libmemecahce里面支持
2007-09-12 15:26:09 <AvinDev> 根据key哈希到不同的memcached server
2007-09-12 15:26:17 <mryufeng> right
2007-09-12 15:26:17 <bitcowboy> HEADER representation:
aaaaaaaaaaaaaaaaaaaaaaaaaatttt00 arity:26, tag:4
2007-09-12 15:26:38 <panxiaof> extreme:
Insert ………………………100000 objects: 315 milliseconds,(3 microsecs/object)
Creating tree………………100000 objects: 271 milliseconds (2 microsecs/object)
Hash search………………100000 searches: 63 milliseconds (0 microsecs/search)
Tree search…………………100000 searches: 271 milliseconds (2 microsecs/search)
Sequential…………………100000 searches: 30 milliseconds (0 microsecs/search)
这个数据却实还比ets好像慢一点点,不过ets不支持双key啊
2007-09-12 15:27:16 <davies.liu> 分布式的cache应该是DHT,而不是erlang这种分布是,不需要集中的出口,也不需要节点间的通讯
2007-09-12 15:27:23 <mryufeng> 人家extremedb 支持 sql
2007-09-12 15:27:35 <baojing.jiao> 那意思是memecached如果分布式的话,对应用不是透明的喽?
2007-09-12 15:27:53 <baojing.jiao> 要自己去根据key去命中到不同的cache服务器上去?
2007-09-12 15:28:13 <mryufeng> 对应用透明
2007-09-12 15:28:21 <baojing.jiao> 还是这块已经做好了,应用不用操心
2007-09-12 15:28:22 <davies.liu> 在库里实现DHT,
2007-09-12 15:28:26 <mryufeng> 是memcahche client里面作的
2007-09-12 15:28:31 <baojing.jiao> 哦,明白了。
2007-09-12 15:28:39 <mryufeng> 应用不用担心
2007-09-12 15:29:07 <davies.liu> 做应用的还是尽量少发明轮子比较好,出发实在满足不了需求
2007-09-12 15:29:14 <AvinDev> davies.liu 对 DHT有什么研究?以前看过一把paper,没有搞懂
2007-09-12 15:29:37 <mryufeng> dht俺2004年就用过存p2p的数据
2007-09-12 15:29:56 <mryufeng> dht实际上就是一个好的hash算法
2007-09-12 15:30:17 <mryufeng> 加上网络的实现
2007-09-12 15:30:22 <baojing.jiao> 前者发明私家轮子,后来的人不会修呀。造成了很大的学习障碍。
2007-09-12 15:30:34 <mryufeng> dht本身没有作存储系统
2007-09-12 15:30:41 <AvinDev> 可以在增加和减少机器的情况下,不会导致大量的hash值失效和冲突吧?
2007-09-12 15:31:04 <bitcowboy> 不会
2007-09-12 15:31:07 <mryufeng> 不会 他一般一份数据存好几个地方
2007-09-12 15:31:33 <mryufeng> 在节点预备失效的 自动转存到其他节点去
2007-09-12 15:31:55 <davies.liu> 以我的粗浅理解,DHT就是用节点信息来做hash,比如IP,端口等,尽量能分别均匀
2007-09-12 15:32:01 <mryufeng> 他就是赌 不会所有的相关节点都失效这个概率
2007-09-12 15:32:02 <NetSnail> 节点可以动态增加删除,不需要中心处理器做调度是dht和普通用hash做符合均衡的区别 @.@
2007-09-12 15:32:47 <mryufeng> 是这样的 所以的细节都是节点见自己商量
2007-09-12 15:32:47 <bitcowboy> 你们都是牛人。
2007-09-12 15:33:11 <coderplay> yufeng GG是牛人
2007-09-12 15:33:14 <AvinDev> 看过emule那dht的文章,是一组文件信息都会存储到一组IP相近的机器上,那一组机器总会有几个在线
2007-09-12 15:33:37 <mryufeng> 俺就是 重新编码emule的dht实现的
2007-09-12 15:33:38 <AvinDev> 是不是dht一般有个tracker这样的东东来记录入口?
2007-09-12 15:33:54 <NetSnail> 没,那个是bt…
2007-09-12 15:33:56 <bitcowboy> Erlang的C源码中好多的宏啊,看起来真累。
2007-09-12 15:33:59 <mryufeng> 2004年p2p火的时候 想做个分布的系统
2007-09-12 15:34:26 <mryufeng> 后来 bt的那个比emule 的dht要简单些
2007-09-12 15:34:43 <davies.liu> memcached好像没有用DHT,因为cache是暂时性的,不需要备份
2007-09-12 15:34:52 <NetSnail> emule 的dht,是指kad?
2007-09-12 15:35:00 <bitcowboy> 嗯
2007-09-12 15:35:01 <AvinDev> 现在bt也要用dht来存储peer信息了,防止tracker被封
2007-09-12 15:35:15 <mryufeng> memcache就是简单的hash没有dht
2007-09-12 15:35:20 <NetSnail> kad确实不错的 @.@
2007-09-12 15:35:21 <davies.liu> 不过现在如果有节点down了,会比较域名,hash全边了
2007-09-12 15:35:22 <mryufeng> emule dht ==kad
2007-09-12 15:36:12 <NetSnail> 那本 programming erlang 不也提到,可以用erlang来做dht实现集群么?
虽然只是一句话 …
2007-09-12 15:36:44 <mryufeng> erlang来做就更简单了
2007-09-12 15:36:46 <davies.liu> 可不可以用DHT来缓存wikipedia的数据,解决在国内访问不了的问题
2007-09-12 15:36:52 <mryufeng> 网络部份不用作了
2007-09-12 15:37:03 <mryufeng> 存贮不用作了
2007-09-12 15:37:14 <mryufeng> 只要专心写个hash算法
2007-09-12 15:37:21 <davies.liu> 哪一章提到了?没印象
2007-09-12 15:37:23 <NetSnail> 恩恩…
2007-09-12 15:37:42 <AvinDev> 锋爷来写个dht算法吧,open source
2007-09-12 15:37:54 <AvinDev> 这里研究分布式的牛人也挺多
2007-09-12 15:38:25 <NetSnail> 把成熟的kad之类的写写,基本就够用了 @.@
关键是看做什么应用
2007-09-12 15:38:29 <mryufeng> dht鸟算法 我看了半个月 没有太明白 精髓
2007-09-12 15:38:35 <AvinDev> davies.liu 貌似是在清华搞分布式计算的吧:)
2007-09-12 15:38:41 <mryufeng> 和chord之类的改进版
2007-09-12 15:38:52 <NetSnail> 其实, 我熟悉的只有chord >_<
2007-09-12 15:39:11 <davies.liu> 没有,我只是对分布式计算一直很憧憬,hehe
2007-09-12 15:39:30 <mryufeng> 所以这些还得专门搞算法的GG 来搞 我们来实现
2007-09-12 15:39:50 <davies.liu> 本来有留学校做相关方面的机会,后来黄了:)
2007-09-12 15:40:06 <coderplay> 牛
2007-09-12 15:40:38 <AvinDev> coderplay,靠你了,考研男
2007-09-12 15:41:02 <mryufeng> 是猥琐男
2007-09-12 15:41:33 <NetSnail> 囧rz
2007-09-12 15:41:55 <davies.liu> …..
2007-09-12 15:42:12 <panxiaof> coderplay在考研?
2007-09-12 15:42:24 <coderplay> …
2007-09-12 15:42:26 <mryufeng> coderplay 也是搞分布计算的哦
2007-09-12 15:42:51 <AvinDev> 嗯,他在攻读分布式计算
2007-09-12 15:43:11 <panxiaof> 哦~在清华?
2007-09-12 15:43:24 <coderplay> 我在帮yufeng GG 物色极品mm
2007-09-12 15:43:48 <mryufeng> 嘘 小声点
2007-09-12 15:43:53 <coderplay> 一个校园mm,换五招绝招
2007-09-12 15:43:53 <NetSnail> 可以搭车同求么?
2007-09-12 15:44:54 <bitcowboy> Kad的思想很简单,所以Kad的论文也很简单。但是Kad是建立在Chord的基础上的,如果光看Kad那篇论文,而不看后面的参考文献,是不太容易理解的。
2007-09-12 15:45:39 <bitcowboy> Kad,只是用XOR作为距离运算,其他的都没说,都是集成别人的。
2007-09-12 15:45:47 <bitcowboy> 继承
2007-09-12 15:46:42 <AvinDev> 这个距离是指IP间的逻辑距离?
2007-09-12 15:46:48 <bitcowboy> 不是。
2007-09-12 15:46:56 <NetSnail> 是key的距离
2007-09-12 15:47:00 <bitcowboy> 只是一个抽象的距离。
2007-09-12 15:47:05 <bitcowboy> 嗯。
2007-09-12 15:47:12 <mryufeng> 是key的距离
2007-09-12 15:47:58 <bitcowboy> 这个距离其实用什么都可以,只是Kad发现了用XOR做距离的一系列好处。
2007-09-12 15:50:39 <bitcowboy> #define BIG_SIGN(xp) (!!bignum_header_is_neg(*xp))
2007-09-12 15:50:50 <bitcowboy> 这句话为什么要加两个!
2007-09-12 15:50:53 <bitcowboy> not
2007-09-12 15:52:32 <mryufeng> 2个的意思是 把 bignum_header_is_neg(*xp) 从 非0 数值 转成 bool的 true false
2007-09-12 15:52:44 <mryufeng> 俺也经常这么写
2007-09-12 15:52:53 <bitcowboy> 嗯,明白了。
2007-09-12 15:54:46 <bitcowboy> 看到这样一个注释:/* FIXME: */ 有点寒。
2007-09-12 15:55:48 <NetSnail> 多了…不过我常写的是/* TODO */
2007-09-12 15:55:49 <AvinDev> 呵呵,看过Erlang源码的各位老大可以考虑写本《Erlang Hack Guide》
2007-09-12 15:55:50 <mryufeng> 寒什么 大型的系统多的去 这样的case 好多时候是没有想好 更好的方法来解决 先凑合用
2007-09-12 15:56:18 <mryufeng> 一本500块 你看不
2007-09-12 15:56:19 <coderplay> 还有工具可以方便看FIXME, TODO标记
2007-09-12 15:56:21 <NetSnail> 而且,vi之类的编辑器还会高亮这种注视.
2007-09-12 15:56:32 <NetSnail> 注释
2007-09-12 15:56:33 <AvinDev> Eclipse里面提供三种: TODO FIXME XXX
2007-09-12 15:57:12 <bitcowboy> 数值计算算是基础系统吧。这些地方有这样的注释,让人看了不敢用。
2007-09-12 15:57:46 <mryufeng> 人家诚实才写 不写你不是也不知道
2007-09-12 15:57:57 <bitcowboy> 那倒也是哦
2007-09-12 15:58:23 <mryufeng> 写了 反而亲切 不写出事就麻烦了
2007-09-12 15:59:04 <coderplay> 说不定patch一下,就立功啦~~
2007-09-12 15:59:33 <bitcowboy> patch也要先看懂啊。现在是看不懂啊。
2007-09-12 15:59:54 <mryufeng> 感觉作程序还得象老外那样 比较诚实 早暴露问题 才好
2007-09-12 16:04:19 <nbvghost> 最近要做flash flv播放器..
2007-09-12 16:04:33 <nbvghost> 有没有人感趣的.
2007-09-12 16:04:48 <mryufeng> 具体点
2007-09-12 16:06:55 <nbvghost> 像土豆网那个视频播放器
2007-09-12 16:07:38 <mryufeng> 和erlang什么关系
2007-09-12 16:07:41 <AvinDev> 感觉到as的讨论组会比较好,这里都是讨论erlang的
2007-09-12 16:07:56 <AvinDev> yufeng给他个qq群号码:)
2007-09-12 16:08:09 <NetSnail> 囧rz …
2007-09-12 16:08:27 <coderplay> 讨论rtmp?
2007-09-12 16:08:47 <mryufeng> 说不定erlang可以帮他的忙
2007-09-12 16:08:50 <hczworld> 问一下erlang搞基于web的大型应用有前途吗
2007-09-12 16:08:53 <bitcowboy> rtmp是啥?
2007-09-12 16:09:02 <davies.liu> 有没有开源的任务调度的软件?就是可以调度给不同的机器执行,比如下载
2007-09-12 16:09:13 <AvinDev> rtmp,flash media server的通信协议
2007-09-12 16:09:18 <bitcowboy> 哦
2007-09-12 16:09:43 <coderplay> 俺很熟哦, 谁要知道些啥?
2007-09-12 16:09:58 <nbvghost> 群号多少.
2007-09-12 16:10:03 <AvinDev> erlang搞web,如果不是基础设施,感觉没有前途。。。不看好那个erlyweb项目
2007-09-12 16:10:31 <nbvghost> 想了解一下播放头功能.
2007-09-12 16:10:45 <AvinDev> twitter这个站点用了一些Erlang的基础设施来解决扩展性问题
2007-09-12 16:11:21 <hczworld> web应用的话,可能跟erlang对字符串支持还不好有关?
2007-09-12 16:11:47 <bitcowboy> 感觉今天这里人好多。
2007-09-12 16:12:02 <AvinDev> 每天都那么多人,只是潜水
2007-09-12 16:12:11 <coderplay> 播放头功能??
2007-09-12 16:12:33 <mryufeng> flash qq 26623753
2007-09-12 16:12:45 <coderplay> 我也加~~
2007-09-12 16:12:47 <yuxh312> flash俺不懂
2007-09-12 16:12:54 <yuxh312> 这么多人,貌似我迟到了
2007-09-12 16:13:00 <bitcowboy> 潜水的都上来了。
2007-09-12 16:13:03 <coderplay> flash seer, 不加
2007-09-12 16:13:22 <hczworld> flash搞多人在线视频聊天?
2007-09-12 16:13:27 <zhuzhaoyuan> 冒个泡
2007-09-12 16:13:57 <AvinDev> 说到视频,maillist上面有人问,有没有人用Erlang做fms
2007-09-12 16:14:42 <AvinDev> 锋爷觉得Erlang搞这些流媒体应用,编码解码会不会成瓶颈?
2007-09-12 16:14:54 <coderplay> 不会.
2007-09-12 16:15:29 <bitcowboy> 编码解码可以写个C模块去算。
2007-09-12 16:15:44 <coderplay> c+汇编做了, port一个就可以.或者直接调用bin
2007-09-12 16:15:48 <mryufeng> rtmp是binary协议 erlang处理应该没有效率的问题
2007-09-12 16:16:02 <AvinDev> 那就是要用到c了,我想讨论下纯Erlang的可能性
2007-09-12 16:16:04 <mryufeng> 最差的情况写个driver
2007-09-12 16:16:11 <coderplay> rtmp没有涉及解码
2007-09-12 16:16:22 <mryufeng> 个人感觉应该效率很高
2007-09-12 16:16:24 <coderplay> 只有做录制的时候,会有编码
2007-09-12 16:16:28 <AvinDev> 应该是属于解包
2007-09-12 16:16:38 <mryufeng> 因为erlang的binary和bit运算处理的还不错
2007-09-12 16:17:02 <AvinDev> 我以前也看过一下,录制,一般是在客户端录制然后传到服务器的
2007-09-12 16:17:11 <mryufeng> binary分析起来很简单 也很高效
2007-09-12 16:17:22 <coderplay> 可以录制在服务端
2007-09-12 16:18:11 <AvinDev> 感觉流量控制是个难点,red5做得不是太好
2007-09-12 16:18:36 <mryufeng> 流量控制 确实是media server的难点
2007-09-12 16:19:08 <mryufeng> 不过这个linux kernel的 traffic control里面有好多算法 可以抄下
2007-09-12 19:56:22 <bitcowboy> 嗯,吧Erlang的bit shift left看明白了。
2007-09-12 19:56:55 <bitcowboy> 和我想象的差不多。
2007-09-14 15:45:19 <baojing.jiao> 大家看看这篇文章(可能很多人都看过了
) -> http://ocaml.cn/node/343
2007-09-14 15:45:46 <baojing.jiao> 在邮件列表中看到: lock-free datastructure, STM 等等, 在高并发的程序里面优点很多, Intel 开始考虑硬件直接支持这些东西了.
2007-09-14 15:45:57 <baojing.jiao> 就搜回到这个文章。
2007-09-14 15:46:22 <baojing.jiao> 大家发表一下对stm,并发模型的看法。。。
2007-09-14 15:46:53 <panxiaof> 我不懂~我听~
2007-09-14 15:47:28 <baojing.jiao> 我投个引子,让老大们给大家科普科普
2007-09-14 15:48:12 <panxiaof> 哈~每次这个时候,我的耳朵都坚着的~
2007-09-14 15:48:49 <bitcowboy> 现在的 Lock free 都是依靠CPU的硬件指令完成的。
2007-09-14 15:49:05 <bitcowboy> 这个早就有了。
2007-09-14 15:49:13 <satyendra.iiml> how to use it
2007-09-14 15:49:20 <bitcowboy> ASM
2007-09-14 15:49:25 <bitcowboy> 汇编指令。
2007-09-14 15:49:38 <bitcowboy> cmpxchg 之类的。
2007-09-14 15:49:54 <satyendra.iiml> cmpxchg
2007-09-14 15:52:12 <baojing.jiao> cpu貌似还没有支持吧?
2007-09-14 15:52:30 <baojing.jiao> 我看那个maillist上inter才开始考虑呀
2007-09-14 15:52:46 <bitcowboy> compare exchange 早就有了。我们项目里都用了很久了。
2007-09-14 15:53:02 <bitcowboy> Windows 2000开始就有内置的API支持了。
2007-09-14 15:53:29 <bitcowboy> InterlockedSingleList
2007-09-14 15:53:38 <panxiaof> 对了,双核的与单核的,在解析xml,通过关键字读取ets,相差会大吗?
2007-09-14 15:53:55 <bitcowboy> 反汇编,看一下微软的源码就知道怎么实现的了。
2007-09-14 15:54:23 <mryufeng> 这个差别大 因为解释xml 和读取ets是cpu密集的
2007-09-14 15:54:39 <panxiaof> 哦`收到~
2007-09-14 15:55:11 <bitcowboy> Maillist 里的意思可能是Intel会支持更多的类似原子操作吧?
2007-09-14 15:55:53 <bitcowboy> 不过这些所谓的Lock free也不是完全的不锁。只是CPU内部锁内存总线了。
2007-09-14 15:56:24 <baojing.jiao> 就是硬件实现了锁,程序就不用考虑了。
2007-09-14 15:56:28 <baojing.jiao> 是吧?
2007-09-14 15:56:42 <bitcowboy> CPU锁总线的开销很小,而操作系统锁通常要切换内核,开销很大。
2007-09-14 15:57:29 <bitcowboy> 嗯,硬件锁,目前的应用范围还是比较受限制的。不想操作系统锁那么通用。
2007-09-14 15:57:43 <bitcowboy> 不像
2007-09-14 15:57:55 <linningjie> ??
2007-09-14 15:59:14 <bitcowboy> 但是,其实锁内存总线,对多核CPU的影响也很大的。因为只要一个核心锁定了总线,其他核心都不能访问内存了,只能在使用寄存器里的数据。
2007-09-14 15:59:52 <bitcowboy> 不过,这个可能会通过改进CPU Cache一致性算法得到改善,不过这个是Intel的事情了。
2007-09-14 16:05:49 <baojing.jiao> 如果这块inter做好了的话,那既有的编程方式就可以不用改变,享受多核的好处了。
2007-09-14 16:06:24 <baojing.jiao> 性能不行就加核,做到类似于主频提升性能提升的甜头。
2007-09-14 16:06:48 <baojing.jiao> 不过,在硬件层屏蔽多核的问题,能够简单彻底么?
2007-09-14 16:12:05 <bitcowboy> 那也是不可能的。
2007-09-14 16:12:26 <bitcowboy> 天下没有免费的午餐。
2007-09-14 16:12:43 <jackyz.zhao> 内存锁总线和对同一块内存区域的加锁,不是同一个概念。
2007-09-14 16:13:58 <bitcowboy> 嗯。Cache一致性算法弱的情况下,就只能把内存总线锁定。那样就不可能会出问题了。
2007-09-14 16:15:19 <jackyz.zhao> 这么说吧,多个cpu,仍然要共享一块ram吧,这样的话,不管你锁不锁总线,两个cpu上的进程还不是一样要解决共享冲突的问题?和cache一致性算法的关系又在哪里了?
2007-09-14 16:17:06 <bitcowboy> CPU是访问Cache的。虽然内存是同一块,但是这块内存可能同事在多个Cache里(比如每个核心有自己独立的Cache)。那样的话,就有Cache一致性问题了。
2007-09-14 16:17:58 <bitcowboy> 因为每个核心在向各自的Cache写数据的时候,可能不知道有其他的CPU在向同一块内存地址写数据。
2007-09-14 16:18:18 <bitcowboy> 这个就要Cache一致性算法解决了。
2007-09-14 16:19:39 <bitcowboy> 因为Cache不可能每次CPU写了数据之后都提交到内存里,再通知所有的Cache更新数据。那样效率太低,还不如没有Cache呢,÷
2007-09-14 16:20:42 <bitcowboy> 锁内存总线是个通俗的说法,意思是:锁定当前内存的状态。具体怎么实现,那要看CPU了。
2007-09-14 16:21:22 <jackyz.zhao> 引入cache,就把问题搞得更复杂了,比如:我有两个process跑在两个cpu上,各自有一个cache,它们都cache了同一块内存,那一个数据就有可能出现三个不同的版本。抛开cache,这个问题的症结,在我看来,就是前面说的,允许两个cpu上的process访问同一块内存(共享),这个不解决,有没有cache都是一样。
2007-09-14 16:22:35 <jackyz.zhao> 而,按照share nothing的原则来设计process,避免两个进程对同一块内存的访问这种情况,那么,就不存在这样的共享问题,也就没有必要搞锁。
2007-09-14 16:23:30 <bitcowboy> 哈哈,看样子我又把问题复杂话了。我映入Cache,只是想说明,Lock Free不是没有成本的,好的架构设计是必不可少的。不能在思想上依赖CPU的硬件锁。
2007-09-14 16:24:15 <jackyz.zhao> 嗯,cpu的总线锁是为了解决多个cpu对一个总线的硬件共享冲突,和内存锁没关系的。
2007-09-14 16:28:17 <baojing.jiao> 那就是要充分返回多核的计算能力,必须在编程模型上有所改变了?
2007-09-14 16:28:44 <baojing.jiao> 不能依靠硬件商来把这层做掉。
2007-09-14 16:30:09 <bitcowboy> 曾经,我的BOSS跟我说过一句话:“貌似是有函数式语言才能在多核时代发挥出多核的性能。”
2007-09-14 16:30:26 <mryufeng> 一旦你的数据结构涉及共享 可能会一发不可收拾 到处加锁
2007-09-14 16:30:48 <bitcowboy> 其实,他的意思是。我们要面临编程思想上的意思大革新。
2007-09-14 16:31:06 <bitcowboy> 我们要面临编程思想上的一次大革新。
2007-09-14 16:31:18 <satyendra.iiml> i m not understanding …u
2007-09-14 16:31:20 <bitcowboy> 这也是我们学习Erlang的原因和目的。
2007-09-14 16:31:34 <jackyz.zhao> 是的,这就是我的理解。虽说,目前还有一些别的研究方向正在探索共享内存方式下“优雅简单”的解决方案,比如,内存Transact啥的,不过我不是很看好这几个方向。
2007-09-14 16:32:41 <jackyz.zhao> 也许我理解得不够深刻,但在我看来,那有点类似“用一个大锁来替代N多小锁”。
2007-09-14 16:33:30 <mryufeng> 看下FMS服务器 http://mryufeng.javaeye.com/blog/105086
2007-09-14 16:33:33 <bitcowboy> 嗯,不过我都不抵制。哪个好用,我就用哪个。
2007-09-14 16:33:58 <jackyz.zhao> 呵呵。
2007-09-14 16:34:06 <jackyz.zhao> yufeng又博了啊?
2007-09-14 16:34:20 <baojing.jiao> 我的意思是,程序还可以按照传统的方式去写。至于多核的影响让inter这些硬件上和编译器的大牛屏蔽掉。我们可以象以前享受增加主频来增加性能的甜头。还是,多核的时候,必然伴随这开发思想上的革新。比如用好erlang。或者对传统编程语言进行整形。
2007-09-14 16:34:34 <baojing.jiao> 会出现那种情况?
2007-09-14 16:34:41 <jackyz.zhao> 这个fms是不是类似于red5之类的flash stream server?
2007-09-14 16:34:49 <baojing.jiao> 第二种,还是第一种也有可能?
2007-09-14 16:34:55 <bitcowboy> 貌似,周末可以一睹大牛的风采了。
2007-09-14 16:35:09 <mryufeng> 其实是很自然的 C++程序员 习惯了就会作出这样的蠢事
2007-09-14 16:35:33 <mryufeng> 反正加锁就一条一句 到处加
2007-09-14 16:35:50 <bitcowboy> 我觉得,多核的时候,必然伴随着开发思想上的革新。
2007-09-14 16:35:58 <mryufeng> fms是adobe的商业版本 每个copy 几十wus$
2007-09-14 16:36:05 <mryufeng> 还这样的性能
2007-09-14 16:36:14 <jackyz.zhao> 我是说,是不是干相同的事?
2007-09-14 16:36:38 <mryufeng> 害得我们到处 内核打patch hack fms的系统调用 来提高性能
2007-09-14 16:36:39 <jackyz.zhao> erlang社区有个家伙已经在对这个领域下手了
2007-09-14 16:37:00 <jackyz.zhao> 要搞一个erlang的red5
2007-09-14 16:37:06 <mryufeng> 但是如果是免锁的设计的话 就不会出现这样的情况
2007-09-14 16:37:12 <jackyz.zhao> 要不你们等一等?哈哈。
2007-09-14 16:37:21 <bitcowboy> 等啥?
2007-09-14 16:37:51 <mryufeng> 呵呵 其实我们也在关注erlang的fms实现
2007-09-14 16:38:31 <mryufeng> 而且比那个家伙应该作的工作多
2007-09-14 16:38:33 <jackyz.zhao> 嗯,他的代码已经可以svn了,你搞一份来,做个测试给大家看看啊
2007-09-14 16:38:47 <jackyz.zhao> hoho,
2007-09-14 16:40:26 <mryufeng> 呵呵 你要我耐心等候。。。
2007-09-14 16:41:50 <baojing.jiao> yufeng兄估计已经先人一步自己搞了吧。
2007-09-14 16:42:12 <baojing.jiao> 自己动手丰衣足食
2007-09-14 16:42:13 <jackyz.zhao> 估计自己已经秘密进行中了,哈哈,商业机密啊。
2007-09-14 16:42:45 <baojing.jiao> 只有牛人才能从轮子做起呀。哈哈
2007-09-14 16:43:18 <mryufeng> 呵呵 俺之前做过stream server的
2007-09-14 16:44:35 <mryufeng> xunlei的mms,rtsp下载就是俺们搞的哦
2007-09-14 16:44:49 <jackyz.zhao> @baojing.jiao 我认为,如果没有找到更好的共享内存下替代锁的解决方案,就是必须要变革思维的时候了,现有的主流语言,小到 x = x + 1 这样的语句,都是构建在共享内存的思维模式下的。要用语法糖,或者什么简便易行的方式来全面替换语言的底层设计思路,似乎是个不可能的任务。
2007-09-14 16:45:19 <bitcowboy> 嗯
2007-09-14 16:45:31 <jackyz.zhao> 我靠,牛叉啊。嘿嘿。yufeng匿名opensource一下嘛。
2007-09-14 16:46:50 <baojing.jiao> 我要几个下电影的ftp用户名,密码就行了。
2007-09-14 16:46:50 <mryufeng> 主要是思维变换过来 俺很欣赏lua的实现 作的太好了 几乎没有共享 极少需要锁。
2007-09-14 16:47:25 <bitcowboy> Lua貌似不是线程安全的。
2007-09-14 16:47:42 <baojing.jiao> 哈哈,研究了这么多东西,要写文章分享的呀。
2007-09-14 16:47:46 <jackyz.zhao> lua不了解,你说的是虚拟机吧,lua语言本身是不是构建在共享内存概念上的?
2007-09-14 16:47:56 <mryufeng> 呵呵 俺把lua的代码 作教材经常温习
2007-09-14 16:48:02 <baojing.jiao> 独乐不如众乐么
2007-09-14 16:48:20 <mryufeng> 他的设计思路就是 所有的东西不共享
2007-09-14 16:48:46 <mryufeng> 思路贯穿所有的API
2007-09-14 16:49:13 <mryufeng> 所以lua就非常适合多多线程环境 效率也高
2007-09-14 16:49:19 <jackyz.zhao> lua 不运行 x = x + 1 ?难怪n多游戏拿它做脚本了。
2007-09-14 16:50:01 <bitcowboy> 为什么我们这里说Lua不是线程安全的?可能是说Lua的C接口吧?
2007-09-14 16:50:20 <mryufeng> 运行 但是他的vm 相当于erlang的process
2007-09-14 16:50:39 <mryufeng> 你可以一个thread一个vm vm间互相没有任何关联
2007-09-14 16:51:06 <mryufeng> 这样你就不需要保护数据 就不需要lock了
2007-09-14 16:51:18 <jackyz.zhao> 哦,那它的 vm 也很轻量级?可以并发跑多少个?
2007-09-14 16:51:40 <bitcowboy> 哦,是的。不同的vm之间就是线程安全的。
2007-09-14 16:51:42 <mryufeng> 之前俺研究python的时候就被python搞死了 python有个全局的lock
2007-09-14 16:51:57 <mryufeng> 和erlang的process差不多轻量
2007-09-14 16:52:16 <bitcowboy> 是的,Lua的特点就是简洁。
2007-09-14 16:52:29 <jackyz.zhao> 嗯,那么,java或者javascript之类的语言,有没有可能按照这个思路来做呢?
2007-09-14 16:52:46 <mryufeng> 而且vm没有用到其他os resource, 除了ram, 而ram是大白菜的价格
2007-09-14 16:52:54 <bitcowboy> 游戏都喜欢用Lua做脚本是因为Lua执行速度快。
2007-09-14 16:52:58 <mryufeng> lua 4.0以后才这么设计的
2007-09-14 16:53:11 <mryufeng> 之前也是很差的
2007-09-14 16:53:37 <jackyz.zhao> 每个虚拟机都搞得极轻量,然后,动不动就搞几百上千个虚拟机来玩。
2007-09-14 16:53:45 <mryufeng> 建议大家有空读读lua代码 真的非常经典
2007-09-14 16:54:02 <mryufeng> 3个人花了1x年作了16000行代码
2007-09-14 16:54:06 <bitcowboy> Lua的代码据说还是比较短的。
2007-09-14 16:54:13 <mryufeng> 你说能不经典码
2007-09-14 16:55:07 <mryufeng> 而且简单易懂 用的数据结构非常简单 基本上就是array
2007-09-14 16:55:31 <bitcowboy> Erlang的代码好像就难度一些。
2007-09-14 16:55:42 <bitcowboy> 难读
2007-09-14 16:55:47 <mryufeng> 个人感觉l熟读ua对设计和编码的影响非常大
2007-09-14 16:55:59 <mryufeng> erlang的代码作的也是比较清晰的
2007-09-14 16:56:17 <bitcowboy> Erlang的数据结构比较复杂。
2007-09-14 16:56:25 <mryufeng> 而且所有的运行状态是可见的
2007-09-14 16:56:37 <mryufeng> 数据结构也不会太复杂
2007-09-14 16:56:43 <bitcowboy> 相对Lua而言。
2007-09-14 16:57:02 <jackyz.zhao> yufeng同学是c大拿级的,大家在家不要轻易模仿啊。读吐血不负责啊。 ![]()
2007-09-14 16:58:11 <mryufeng> erlang估计有20%的代码在作这个事情 所以性能优化 什么的就有依据
2007-09-14 16:58:22 <baojing.jiao> 我们学西语言是看文档,yufeng兄是直接看代码,看实现。功力之深厚,唯虚竹堪比呀。
2007-09-14 16:59:04 <mryufeng> 俺也看文档 但是细节还的看代码 代码最准确
2007-09-14 17:00:00 <jackyz.zhao> 说回 lua,这个语言的footprint怎么样?工业成熟度如何?比方什么框架啊,类库啊之类的。
2007-09-14 17:00:38 <mryufeng> 之前俺们的系统都是用ACE开发的 ACE的文档非常落后 俺就花了一年多的时间把他2xw行的代码读了好几遍 现在看其他的系统感觉都是很熟悉 套路好像都见过的那种。
2007-09-14 17:00:52 <mryufeng> footprint非常小
2007-09-14 17:01:05 <mryufeng> 代码的成熟度非常搞
2007-09-14 17:01:07 <mryufeng> 高
2007-09-14 17:01:18 <mryufeng> 唯一不足的就是 库太少
2007-09-14 17:01:38 <mryufeng> 还有就是没有 开发 调试的 工具
2007-09-14 17:01:48 <mryufeng> 就是配套的东西比较少
2007-09-14 17:02:35 <mryufeng> 所以lua没有进入大众
2007-09-14 17:03:48 <jackyz.zhao> 嗯,有意思,有时间了研究下。
2007-09-14 17:03:50 <mryufeng> 不过最近 luaforge.net 上面开始慢慢有成熟的库了
2007-09-14 17:04:06 <bitcowboy> Lua的用法,一般都是嵌入C中用,而不是单独用。所以其实库不用很多。
2007-09-14 17:04:56 <jackyz.zhao> 我感觉,lua的方式,如果能够给java借鉴,也许能够“以简单的方式”为主流语言带来“多核运算”的好处
2007-09-14 17:04:58 <mryufeng> 库不多 作大型的application的时候 开发效率就受影响 什么东西都要自己实现
2007-09-14 17:05:23 <jackyz.zhao> 象 hotcode replace 这样的特性 lua 有办法实现么?
2007-09-14 17:05:36 <bitcowboy> Lua暴露的调试接口,真的整合好的游戏引擎会自己整合一个Lua调时器进去。
2007-09-14 17:06:07 <mryufeng> lua的重心不在这里
2007-09-14 17:06:34 <bitcowboy> 真的有复杂的东西,一般都是在C里面实现好了给个Lua接口。没必要全在Lua里做。
2007-09-14 17:06:39 <jackyz.zhao> 那它的重心在哪里?
2007-09-14 17:07:09 <mryufeng> 它基本上是这样组成的 lexer + parser + opcode generator + vm + basic lib + api
2007-09-14 17:07:10 <bitcowboy> Lua的重心是简单、容易整合到C里面去。
2007-09-14 17:07:39 <bitcowboy> 这也是Lua目前主要的应用方式。
2007-09-14 17:07:42 <mryufeng> 他要解决的问题是 作一个高效的脚本语言
2007-09-14 17:07:56 <jackyz.zhao> 哦,作为一个c的脚本引擎,那和rhino之于java的关系是一样的咯?
2007-09-14 17:08:18 <mryufeng> rhino之于java的关系 俺不了解
2007-09-14 17:08:46 <bitcowboy> rhino,没听说过,java不熟。火星了啊。
2007-09-14 17:08:59 <jackyz.zhao> rhino是javascript引擎,它的目的是为了方便在java中加入javascript的脚本支持
2007-09-14 17:09:02 <mryufeng> 俺害怕 java
2007-09-14 17:09:22 <bitcowboy> 我有点抵制 java
2007-09-14 17:09:25 <jackyz.zhao> 哈哈。可以理解。yufeng同学看到这么低效的代码,还不抓狂?
2007-09-14 17:09:26 <mryufeng> java的库太大 变化太快 俺跟不上
2007-09-14 17:10:03 <bitcowboy> 我比较喜欢写C代码,java的异常机制我受不了。
2007-09-14 17:11:45 <jackyz.zhao> 这就是流派不同了,好比你们两个是少林的,俺是无名小派。哈哈。
2007-09-14 17:12:49 <baojing.jiao> 我是隔壁老王教的三脚猫,没门派呢还 ![]()
2007-09-14 17:13:04 <bitcowboy> 少林应该对武当吧 ![]()
2007-09-14 17:13:05 <hczworld> lua开发大型网站好搞吗
2007-09-14 17:13:24 <mryufeng> lua不是搞网站的
2007-09-14 17:13:27 <mryufeng> 不适合
2007-09-14 17:13:30 <bitcowboy> lua好像没有web开发框架吧。
2007-09-14 17:13:37 <mryufeng> 有
2007-09-14 17:13:42 <NetSnail> 只有个简单的server吧
2007-09-14 17:13:43 <mryufeng> kelper
2007-09-14 17:13:45 <bitcowboy> 居然有……
2007-09-14 17:13:58 <bitcowboy> 我觉得Lua搞这个没啥前途。
2007-09-14 17:14:04 <mryufeng> lua实现的web server功能很power
2007-09-14 17:14:22 <mryufeng> 但是 lua的长处不在这里
2007-09-14 17:14:40 <baojing.jiao> web开发就是从页面上搞定参数,组合起来,然后操作数据库。剩下的都是业务逻辑。没什么