对Erlang开发者的几点建议

* 确保没有任何编译警告

* Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针)。因此string速度较慢,空间占用较大

* 在Server中,总是尽力书写尾递归(tail-recursive)的函数

* 使用‘++‘时,left list会被拷贝,然后添加到right 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.

* 对于binary相关操作可以进行binary优化(bin_opt_info编译选项)代码框架:

*   f(<<
attern1,...,Rest/bits>>,...) ->

... % Rest is not used here

f(Rest,...);

f(<<
attern2,...,Rest/bits>>,...) ->

... % Rest is not used here

f(Rest,...);

...

f(<<>>, ...) ->

ReturnValue.

* 调用lists:flatten/1可以将list扁平化,这个操作代价很大,比‘++‘还要昂贵。下面这些时候我们可以避免:

将数据发送给port时

调用list_bo_binary/1和iolist_to_binary前

* 小的函数可以让您方便的找出错误的函数和代码

* 不要在同一行出现相同的符号

20    some_fun() ->

21       L = [{key1, v1}, {key2, [some_record#v21, v22]}],

22      ...

编译时,会提示line 21 ‘[‘ 语法错误, 因为21行有多个 ‘[‘ ,所以这个bug不能准确定位,你需要花时间去排查代码。

好的做法是:

20 some_fun() ->

21      L = [{key1, v1},

22            {key2, [some_record#v21, v22]}

23            ],

...

这样,编译其会提示你 line 22 ‘[‘ 语法错误,你很开就知道是那个地方错了。

* 使用 CTRL + \ 或 init:stop(), 可以退出Erlang, 使用CTRL + G 及 CTRL + C 弹出菜单选项,可以选择是否退出Erlang。

其中CTRL + G可以用来连接其他的shell, CTRL + C可以查看其他一些系统信息

Ctrl + C abort 是野蛮的退出方式

* use "open_port({fd,0,2}, [out])" make erlang program write standard error to unix system

* If you don‘t run experiments before you start designing a new system, your entire system will be an experiment!

* standard data structure desc:

Module         Description

sets         sets, i.e. a collection of unique elements.

gb_sets sets, but based on a general balanced data structure

gb_tree a general balanced tree

dict         maps, also called associative arrays

ets         hash tables and ordered sets (trees)

dets         on-disk hash tables

Suggestion:

elments count: 0 - 100 | 100 - 10000  |  10000 -

our select   :  list   |      ets     |  gb_tree

* 通过code:clash/0 检测代码中是否有module冲突现象(sticky)

* epmd -d -d 启动 epmd 可以查看erlang node之间的通讯

* 将正常的逻辑代码和错误处理代码分离,发生错误时,尽管错误。由另一个错误处理模块进行处理

* 类似于操作系统,我们的程序也可以分为kernel 和 user 两层, 对于kernel绝对不能出现错误, 对于user可以出现错误,进行恢复

* process顶层loop涉及的代码及函数,最好在一个module中实现

* process 的register name和module名称一致, 便于寻找代码

* 每个process具有一个单一的角色,比如:supervisor 用来进行错误恢复, work 工作者,可以出现错误, trusted worker 不会出现错误

* 通过函数调用可以实现的功能,就不要使用sever实现(如gen_server, 及类似的loop 实现)

* 给消息加一个tag,在发生错误的时候,可以定位到消息,同时也有利于程序的稳健

* 在消息循环中,对于unknown的消息,请调用lib:flush_receive/0 将其清除,减轻process msg queue的长度

* server中总是书写尾递归的循环

* 尽量使用record, 而不是原始的tuple来表现数据结构, 在使用record时,使用select match:

#person{name = Name, age = Age} = Person

* 对于返回值,最好也添加一个tag,用来说明返回值类型,或者执行成功与否

* 尽可能少的使用catch和try,在erlang程序中,不推荐主动捕获异常。只有当我们的逻辑特别复杂,我们可以使用throw来返回数据,使用catch来获取返回值。

* 当然程序与外界交互,外界数据不可靠时,需要使用catch和try

* 慎重使用process dictory, 当你使用get/1, put/1时,你的应用会具有很大的slide effect。可以通过加入一个新的参数来保存原本需要存储到process dictory中数据

* 如果不想使自己糊涂,请不要使用import

* 使用export时,将功能类似的接口组合在一起,并添加合理的注视,这样你的接口更清晰,别人使用起来更方便

* 不要书写嵌套太深的代码

* 不要书写太长的module

* 不要书写太长的函数

* 每行代码不能太长

* 避免使用 "_" 匿名变量,请为每个变量选择有意义的名称,如够某个变量暂时不使用,请以下划线 "_" 开始

* {error, enfile} enfile error in socket 是以为内linux系统中 ulimit 限制, 在root下修改:ulimit -n 25000

* {error, enotconn} 表示socket已经关闭

* 在erlang开发时,慎重使用macro,因为erlang的single assign的缘故,同时调用某个marco,而macro又定义了某个变量,可能导致badmatch错误。

比如:

-define(ADDLINEINFO1(F),

(

begin

Str1 = lists:concat(["[Mod:", ?MODULE, " Line:", ?LINE, "]"]),

Str1 ++ F

end

)).

-define(WARN(Log, F, D), log4erl:warn(Log, ?ADDLINEINFO(F), D)).

如果连续使用 WARN, 会出现此错误

* erlang中可以定义很多环境变量:

ERL_MAX_ETS_TABLES 设置最大的ets数目 默认1400

ERL_MAX_PORTS erlang最大的port数目 默认1024

* .app文件中的start_phases, 选项既可以用来作为include applications之间的同步启动,也可以用来对单个application进行分布启动。

顺序如下

包含included app:

application:start(prim_app)

=> prim_app_cb:start(normal, [])

=> prim_app_cb:start_phase(init, normal, [])

=> prim_app_cb:start_phase(go, normal, [])

=> incl_app_cb:start_phase(go, normal, [])

ok

无included app:

application:start(prim_app)

=> prim_app_cb:start(normal, [])

=> prim_app_cb:start_phase(init, normal, [])

=> prim_app_cb:start_phase(go, normal, [])

ok

时间: 2024-10-23 22:10:24

对Erlang开发者的几点建议的相关文章

给独立开发者的几点建议

1 不要试图做所有的事.作为独立开发人一般都具有多面手的能力或者有自己搞定所有工作的倾向.但是时间长了就会发现这样会造成很大的时间浪费,很容易在某个工作面(尤其是会但是不太擅长的方面)的小细节卡住,而最后又发现这一个小点其实对整个工作没有太大的提升.我后来的方法就是把跨专业的工作(比如你专长是开发,但是也会用ps做点界面)控制在1-2个小时可以完成的范围,当做是工作之余的休息.而超过这个层面的工作就全部外包. 2 控制期望.独立产品本身就是自己理想化的实现,所以很容易纠缠于一些过于理想的东西.就

成为优秀Swift开发者的10条建议

在这里给大家分享一些帮助大家成为更优秀的Swift开发者的建议,让你的代码,写的更少,性能更优,轻松玩转swift开发. 1. Extension 扩展 举例:平方 // Okay Versionfunc square(x: Int) -> Int { return x * x }var squaredOFFive = square(x: 5) square(x:squaredOFFive) // 625 创建无效变量,将5平方后再平方 -- 毕竟我们不喜欢打字. // Better Versi

fantasai对新一代CSS开发者的三点建议

原文链接:@siusinng小倩 大家好!欢迎来到上海CSS开发者大会! Welcome to the Shanghai CSS Developers Conference! 我叫fantasai,姓名是Elika Etemad. I am fantasai, also known as Elika Etemad. 我是W3C CSS委员会的一个spec editor:也就是说我编写CSS的技术标准,如CSS Flexbox Level 1和CSS Writing Modes Level 3.

iOS开发者一些建设性的建议

想在移动开发大餐中分一杯羹,体验最火最炫的技术?小伙子,很有眼光嘛 毫无疑问,移动开发在目前和未来几年内都会盛极一时.无数开发职位虚位以待.各大公司都在寻找各种层次的程序员——新手级.入门级.中级.老手.专家. 本文是写给新手们的——我会帮你们找到第一份iOS开发工作. “我干嘛听你的?”, 你可能会这么说.是个问题——如果是菜鸟乱给建议,那倒是不听最好.我也不是什么大神,甚至也不算是特别有经验的iOS开发者——但我足够了解市场,因此可以对你有些帮助. 最初我是一个独立开发者,拥有几个收入不高(

给孤军奋战独立手游开发者的5条建议

爱盈利推荐: 随着手游市场的迅速增长,越来越多的独立开发者开始从事独立研发,这其中就包括很多一个人独自在家做项目的独立开发者们,最近,一名海外独立手游开发者总结了自己几个月的独立研发生活经验,并且提出了5条建议给同样孤军奋战的独立开发者们,希望能够有所帮助: 三个月之前,我辞掉了正式的工作,为的是可以专注于<TheLastTime>的研发,这是一款叙事性的冒险游戏.在这段时间里,我意识到自己形成了一些坏习惯,不仅影响了我自己,还让周围的人感觉很不好.在业内,已经有了很多文章写独立开发者如何做到

10年老程序员给3年开发者的10点建议

Java程序员有许多应遵循的守则或最佳实践方式.本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果. 1.为代码添加注释(Add comments to your code). – 每个人都知道这一点,但不是每个人都会这么做.你有多少次"忘记"添加注释了?确实,注释不会为你的程序增加任何函数功能.但是,有多少次,看到2周前写的代码,你都记不起它是干什么的?你很幸运,那些未注释的代码是你自己写的,你脑海中还会有残存的印象.非常不幸,大多时候,代码是别人写

Erlang 开发者的福音:IntelliJ IDEA 的 Erlang 插件

IntelliJ IDEA 的 Erlang 插件,主要特性: 智能编辑器:  Erlang 代码补全.语法和错误高亮.代码检查 代码导航:项目和文件结构视图.在文件.模型.函数和用例之间快速跳转 工具和框架集成 :支持  Eunit 和  Rebar 版本控制系统:支持 Subversion.Git 和 Mercurial 跨平台:支持 Windows,.Mac OS X 和 Linux 如何安装? 下载 并安装最新的 IntelliJ IDEA: 配置最新的 Erlang 插件:Config

给iOS开发者的Android开发建议

本人从事iOS应用开发已经5年有余,直到现在还总是刻意回避Andriod应用的开发.但是不管你信不信,安卓开发还是很有意思的,从iOS转向Android应用开发的跨度并没有你想象的那么大. 现在我把在开发7分钟训练这款Android应用中所学到的一些东西与大家分享,希望能对你们有所帮助.需要指出的是,我稍后所比较的每个项目并不是完全匹配的,并且这篇文章并不是一个完整的Android应用开发概述,但是它包涵了我从开发这个简单应用所学到的点点滴滴. 开发环境 开发环境我选择了Android Stud

Archive for the ‘Erlang’ Category 《Erlang编程指南》读后感

http://timyang.net/category/erlang/ 在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注. 按:此为客座文章,投稿人为新浪微博基础研发工程师赵鹏城(http://weibo.com/iamzpc),以下为原文.在对一个分布式KV存储系统的研究过程中,我有幸遇到了Erlang语言.因此,我研究工作的第一目标就是快速入门Erlang语言并在实际研究过程中进一步深入理解Erlang的精髓.在