免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Erlang開發(fā)建議


以下是在erlang項(xiàng)目開發(fā)中的一些記錄,即包含很多通俗易懂的原則,也包含一些似是而非的建議,比較混亂,還沒有積累到一個(gè)可以分門別類的地步,各位就將就看吧..


* 確保沒有任何編譯警告

* Erlang中String采用list實(shí)現(xiàn),32位系統(tǒng)中,其1個(gè)字符用8個(gè)字節(jié)的空間(4個(gè)保存value, 4個(gè)保存指針)。因此string速度較慢,空間占用較大

* 在Server中,總是盡力書寫尾遞歸(tail-recursive)的函數(shù)

* 使用'++'時(shí),left list會(huì)被拷貝,然后添加到right list的頭部,因此最好把length較短的list放在左側(cè)

* 避免使用regexp,如果需要正則表達(dá)式,請使用re

* timer模塊的大部分函數(shù)實(shí)現(xiàn),依賴于一個(gè)process,如果過多使用timer,會(huì)導(dǎo)致這個(gè)process負(fù)載過大,影響效率。
  推薦使用erlang:send_after/3及erlang:start_timer/3

* 避免使用list_to_atom/1,因?yàn)閑rlang中atom數(shù)量最大為1048576, 且不進(jìn)行GC控制。因此如果持續(xù)性的調(diào)用list_to_atom/1
  可能很容易達(dá)到系統(tǒng)上限,從而導(dǎo)致emulator terminate。請使用list_to_existing_atom/1。

* list內(nèi)部實(shí)現(xiàn)為一個(gè)列表,因此length(List), 需要遍歷整個(gè)list比較耗時(shí)

* 對于不同的數(shù)據(jù)類型,使用不同的size函數(shù):tuple_size/1, byte_size/1, bit_size/1

* 使用binary match來進(jìn)行binary的分割,而不使用split_binary/2

* 如果兩個(gè)list都擁有很多數(shù)據(jù),那么請不要使用'--',而是將數(shù)據(jù)轉(zhuǎn)化到ordsets,然后調(diào)用ordsets:substract/2.

* 對于binary相關(guān)操作可以進(jìn)行binary優(yōu)化(bin_opt_info編譯選項(xiàng))代碼框架:

*   f(<<
attern1,...,Rest/bits>>,...) ->  
       ... % Rest is not used here  
       f(Rest,...);  
    f(<<
attern2,...,Rest/bits>>,...) ->  
      ... % Rest is not used here  
      f(Rest,...);  
    ...  
    f(<<>>, ...) ->  
      ReturnValue.

* 調(diào)用lists:flatten/1可以將list扁平化,這個(gè)操作代價(jià)很大,比'++'還要昂貴。下面這些時(shí)候我們可以避免:
    將數(shù)據(jù)發(fā)送給port時(shí)
    調(diào)用list_bo_binary/1和iolist_to_binary前

* 小的函數(shù)可以讓您方便的找出錯(cuò)誤的函數(shù)和代碼

* 不要在同一行出現(xiàn)相同的符號
20    some_fun() ->
21       L = [{key1, v1}, {key2, [some_record#v21, v22]}],
22      ...
編譯時(shí),會(huì)提示line 21 '[' 語法錯(cuò)誤, 因?yàn)?1行有多個(gè) '[' ,所以這個(gè)bug不能準(zhǔn)確定位,你需要花時(shí)間去排查代碼。
好的做法是:
20 some_fun() ->
21      L = [{key1, v1},
22            {key2, [some_record#v21, v22]}
23            ],
      ...
這樣,編譯其會(huì)提示你 line 22 '[' 語法錯(cuò)誤,你很開就知道是那個(gè)地方錯(cuò)了。

* 使用 CTRL + \ 或 init:stop(), 可以退出Erlang, 使用CTRL + G 及 CTRL + C 彈出菜單選項(xiàng),可以選擇是否退出Erlang。
其中CTRL + G可以用來連接其他的shell, CTRL + C可以查看其他一些系統(tǒng)信息
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沖突現(xiàn)象(sticky)

* epmd -d -d 啟動(dòng) epmd 可以查看erlang node之間的通訊

* 將正常的邏輯代碼和錯(cuò)誤處理代碼分離,發(fā)生錯(cuò)誤時(shí),盡管錯(cuò)誤。由另一個(gè)錯(cuò)誤處理模塊進(jìn)行處理

* 類似于操作系統(tǒng),我們的程序也可以分為kernel 和 user 兩層, 對于kernel絕對不能出現(xiàn)錯(cuò)誤, 對于user可以出現(xiàn)錯(cuò)誤,進(jìn)行恢復(fù)

* process頂層loop涉及的代碼及函數(shù),最好在一個(gè)module中實(shí)現(xiàn)

* process 的register name和module名稱一致, 便于尋找代碼

* 每個(gè)process具有一個(gè)單一的角色,比如:supervisor 用來進(jìn)行錯(cuò)誤恢復(fù), work 工作者,可以出現(xiàn)錯(cuò)誤, trusted worker 不會(huì)出現(xiàn)錯(cuò)誤

* 通過函數(shù)調(diào)用可以實(shí)現(xiàn)的功能,就不要使用sever實(shí)現(xiàn)(如gen_server, 及類似的loop 實(shí)現(xiàn))

* 給消息加一個(gè)tag,在發(fā)生錯(cuò)誤的時(shí)候,可以定位到消息,同時(shí)也有利于程序的穩(wěn)健

* 在消息循環(huán)中,對于unknown的消息,請調(diào)用lib:flush_receive/0 將其清除,減輕process msg queue的長度

* server中總是書寫尾遞歸的循環(huán)

* 盡量使用record, 而不是原始的tuple來表現(xiàn)數(shù)據(jù)結(jié)構(gòu), 在使用record時(shí),使用select match:
#person{name = Name, age = Age} = Person

* 對于返回值,最好也添加一個(gè)tag,用來說明返回值類型,或者執(zhí)行成功與否

* 盡可能少的使用catch和try,在erlang程序中,不推薦主動(dòng)捕獲異常。只有當(dāng)我們的邏輯特別復(fù)雜,我們可以使用throw來返回?cái)?shù)據(jù),使用catch來獲取返回值。

* 當(dāng)然程序與外界交互,外界數(shù)據(jù)不可靠時(shí),需要使用catch和try

* 慎重使用process dictory, 當(dāng)你使用get/1, put/1時(shí),你的應(yīng)用會(huì)具有很大的slide effect。可以通過加入一個(gè)新的參數(shù)來保存原本需要存儲(chǔ)到process dictory中數(shù)據(jù)

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

* 使用export時(shí),將功能類似的接口組合在一起,并添加合理的注視,這樣你的接口更清晰,別人使用起來更方便

* 不要書寫嵌套太深的代碼

* 不要書寫太長的module

* 不要書寫太長的函數(shù)

* 每行代碼不能太長

* 避免使用 "_" 匿名變量,請為每個(gè)變量選擇有意義的名稱,如夠某個(gè)變量暫時(shí)不使用,請以下劃線 "_" 開始

* {error, enfile} enfile error in socket 是以為內(nèi)linux系統(tǒng)中 ulimit 限制, 在root下修改:ulimit -n 25000

* {error, enotconn} 表示socket已經(jīng)關(guān)閉

* 在erlang開發(fā)時(shí),慎重使用macro,因?yàn)閑rlang的single assign的緣故,同時(shí)調(diào)用某個(gè)marco,而macro又定義了某個(gè)變量,可能導(dǎo)致badmatch錯(cuò)誤。
比如:
-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)).
如果連續(xù)使用 WARN, 會(huì)出現(xiàn)此錯(cuò)誤

* erlang中可以定義很多環(huán)境變量:
ERL_MAX_ETS_TABLES 設(shè)置最大的ets數(shù)目 默認(rèn)1400
ERL_MAX_PORTS erlang最大的port數(shù)目 默認(rèn)1024

* .app文件中的start_phases, 選項(xiàng)既可以用來作為include applications之間的同步啟動(dòng),也可以用來對單個(gè)application進(jìn)行分布啟動(dòng)。
順序如下
包含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

* 任何時(shí)候,都要重視函數(shù)的返回值,通過match確保您的預(yù)期,如果發(fā)生錯(cuò)誤,那么就大膽的表達(dá)出來。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
回顧Erlang簡要
CEF3手把手入門教程
JPush iOS based APNs | 極光推送博客
VBA 調(diào)試
Go vs Erlang
VBE操作技巧
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服