日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对Erlang开发者的几点建议

發布時間:2025/7/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对Erlang开发者的几点建议 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

* 確保沒有任何編譯警告

* 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

轉載于:https://my.oschina.net/zhangjie830621/blog/340814

總結

以上是生活随笔為你收集整理的对Erlang开发者的几点建议的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本黄色片在线播放 | 国产成人啪精品午夜在线观看 | 亚洲激情另类 | 久久久久亚洲av无码网站 | 亚洲琪琪 | 国产熟妇搡bbbb搡bbbb | 成人h网站 | 欧美一级做a爰片免费视频 成人激情在线观看 | 亚洲一区高清 | 国产伦精品一区二区三区视频网站 | 国产一卡在线 | 人人爽人人爱 | 日韩中文字幕亚洲精品欧美 | 天天射视频 | 色屁屁一区二区三区视频 | 日韩人妻一区二区三区 | 日韩美女视频网站 | 国产日韩av一区二区 | 国产精一区 | 久久久久无码国产精品一区 | 肉色超薄丝袜脚交一区二区 | 久久夜色精品国产欧美乱 | 亚洲精品久久久狠狠狠爱 | 欧美日韩国产高清视频 | 暖暖av在线| 女性裸体不遮胸图片 | 成人免费va视频 | 日本一区高清 | 中文字幕中文字幕 | 日日日操| 91美女视频 | 伊人网综合在线 | 国产成人精品亚洲线观看 | 亚洲精品网站在线播放gif | 四虎免费在线观看 | 五月天伊人网 | 91在线成人| 玖玖爱国产 | 人妻一区二区三区在线 | 中文字幕一区二区三区不卡 | 一区二区三区四区亚洲 | 欧美一区二区三区国产 | 黄网站免费视频 | 男男gay做受xx| 国产主播一区 | www.色视频| 欧美日韩一区二区三区四区五区六区 | 99国产精品人妻噜啊噜 | 女人张开腿让男人桶爽 | 欧洲黄色网 | 美女av免费在线观看 | 欧美v日韩 | 波多野结衣简介 | 熟女高潮一区二区三区视频 | 免费av免费看 | 天堂成人在线观看 | 91艹 | 欧美黄色网 | 性欧美在线观看 | 青草视频网| 黄色激情在线 | 欧美自拍亚洲 | 国产精品久久久久久亚洲毛片 | 日本xx视频 | 黄色三级在线 | 精品久久在线观看 | 我要操婊 | 久久人人艹 | 成人理论影院 | 亚洲性一区 | а√天堂8资源中文在线 | 韩国一二三区 | 国产福利91精品一区二区三区 | 人人草网| 最新日韩av在线 | 成人在线电影网站 | 丰满人妻一区二区三区精品高清 | 欧美丰满少妇人妻精品 | 日本不卡视频一区 | 打屁股视频网站 | 男人资源网站 | 亚洲一区二区三区观看 | xxxxav| 91视频在线免费观看 | 超碰97观看| 天天人人 | 91精品国产综合久久福利软件 | 2014亚洲天堂| 69超碰| 综合精品一区 | 毛片福利 | 亚洲综合欧美日韩 | 国产又粗又猛又爽又黄视频 | 精品国产va久久久久久久 | 爱情岛论坛亚洲自拍 | 精品国产乱码一区二 | 落日余晖图片 | 亚洲在线观看视频 | 在线视频观看免费 |