笔记一

  • 在erlang代码中,尽可能使用尾递归函数
  • 使用’++’时,左边list会被拷贝,然后添加到有右边list的头部,因此最好把length较短的list放在左侧
  • 避免使用regexp,如果需要正则表达式,请使用re 
  • timer模块的大部分函数实现,依赖于一个process,如果过多使用timer,会导致这个process负载过大,影响效率。推荐使用erlang:send_after/3及erlang:start_timer/3 
  • 避免使用list_to_atom/1,因为erlang中atom数量最大为1048576, 且不进行GC控制。因此如果持续性的调用list_to_atom/1 可能会达到系统上限,从而导致emulator terminate。建议使用list_to_existing_atom/1
  • list内部实现为一个列表,因此length(List), 需要遍历整个list比较耗时
  • 对于不同的数据类型,使用不同的size函数:tuple_size/1,byte_size/1,bit_size/1 
  • 使用binary match来进行binary的分割,而不使用split_binary/2 
  • 如果两个list都拥有很多数据,那么请不要使用’–’,而是将数据转化到ordsets,然后调用ordsets:substract/2
  • 通过code:clash/0 检测代码中是否有module冲突现象 
  • 在消息循环中,对于unknown的消息,可以调用lib:flush_receive/0 将其清除,减轻process msg queue的长度
  • 尽可能使用record, 而不是原始的tuple
  • 尽可能少的使用catch和try,在erlang程序中,不推荐主动捕获异常。只有当我们的逻辑特别复杂,我们可以使用throw来返回数据,使用catch来获取返回值
  • {error, enfile} enfile error in socket 是因为linux系统中 ulimit 限制, 在root下修改:ulimit -n 25000 即可
  • erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大
  • 调用lists:flatten/1可以将list扁平化,这个操作代价很大,比’++’还要昂贵  
  • epmd -d -d 启动 epmd 可以查看erlang node之间的通讯 
  • {error, enotconn} 表示socket已经关闭
  • 不要在handle_call/3 内部调用另一个 gen_server:call 相关的函数,避免出现死锁