青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

教父的告白
一切都是紙老虎
posts - 82,  comments - 7,  trackbacks - 0
以下是在erlang項目開發(fā)中的一些記錄,即包含很多通俗易懂的原則,也包含一些似是而非的建議,比較混亂,還沒有積累到一個可以分門別類的地步,各位就將就看吧..
:)

* 確保沒有任何編譯警告

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

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

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

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

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

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

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

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

* 使用binary match來進行binary的分割,而不使用split_binary/2

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

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

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

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

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

* 不要在同一行出現(xiàn)相同的符號
20    some_fun() ->
21       L = [{key1, v1}, {key2, [some_record#v21, v22]}],
22      ...
編譯時,會提示line 21 '[' 語法錯誤, 因為21行有多個 '[' ,所以這個bug不能準(zhǔn)確定位,你需要花時間去排查代碼。
好的做法是:
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可以查看其他一些系統(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 啟動 epmd 可以查看erlang node之間的通訊

* 將正常的邏輯代碼和錯誤處理代碼分離,發(fā)生錯誤時,盡管錯誤。由另一個錯誤處理模塊進行處理

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

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

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

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

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

* 給消息加一個tag,在發(fā)生錯誤的時候,可以定位到消息,同時也有利于程序的穩(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時,使用select match:
#person{name = Name, age = Age} = Person

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

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

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

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

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

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

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

* 不要書寫太長的module

* 不要書寫太長的函數(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ā)時,慎重使用macro,因為erlang的single assign的緣故,同時調(diào)用某個marco,而macro又定義了某個變量,可能導(dǎo)致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)).
如果連續(xù)使用 WARN, 會出現(xiàn)此錯誤

* 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, 選項既可以用來作為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

* 任何時候,都要重視函數(shù)的返回值,通過match確保您的預(yù)期,如果發(fā)生錯誤,那么就大膽的表達出來。
posted on 2009-09-24 01:00 暗夜教父 閱讀(627) 評論(0)  編輯 收藏 引用 所屬分類: erlang

<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章分類

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            中日韩高清电影网| 中文一区二区在线观看| 亚洲大胆人体在线| 欧美精品日韩一本| 亚洲第一精品福利| 久久五月激情| 久久亚洲一区二区| 亚洲高清精品中出| 日韩午夜在线播放| 欧美午夜精品| 久久久国产一区二区| 久久国产精品久久精品国产| 亚洲午夜日本在线观看| 欧美一区二区三区四区高清| 香蕉成人啪国产精品视频综合网| 亚洲无毛电影| 国产精品色在线| 亚洲欧美一区二区视频| 久久久久久一区| 在线观看一区视频| 老司机午夜精品视频| 欧美激情小视频| 久久不射中文字幕| 欧美成人官网二区| 久久精品盗摄| 欧美1区3d| 老鸭窝亚洲一区二区三区| 夜夜爽99久久国产综合精品女不卡| 亚洲欧洲日韩女同| 国产日韩在线一区| 亚洲精品在线免费观看视频| 国产区日韩欧美| 亚洲精品视频在线播放| 国产农村妇女精品一区二区| 免费成人黄色| 国产亚洲精品7777| 亚洲九九精品| 亚洲高清视频一区| 黄色日韩网站| 亚洲永久免费观看| 久久精品最新地址| 亚洲国产视频a| 欧美日韩一区二区在线| 中文在线一区| 久久久91精品国产一区二区三区 | 欧美高清在线一区二区| 亚洲国产日本| 欧美日韩国产在线播放| 亚洲欧美韩国| 欧美激情一区二区三区蜜桃视频 | 欧美大香线蕉线伊人久久国产精品| 国产精品视频导航| 久久精品一区四区| 亚洲高清资源| 欧美一区二区三区免费视| 国内欧美视频一区二区| 久久久久久国产精品一区| 极品少妇一区二区三区| 国产精品jvid在线观看蜜臀| 性欧美大战久久久久久久免费观看 | 99精品热视频只有精品10| 国产日韩欧美视频在线| 国产欧美精品在线观看| 国产日韩欧美在线播放| 韩国v欧美v日本v亚洲v| 亚洲国内自拍| 午夜精品免费在线| 亚洲视频免费在线观看| 亚洲激情影视| 亚洲欧洲综合另类| 亚洲美女免费视频| 亚洲欧洲三级| 亚洲激情视频在线观看| 狠狠干狠狠久久| 国模私拍视频一区| 欧美日韩国产一区精品一区 | 亚洲美女91| 亚洲美女精品成人在线视频| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美午夜精品| 国产精品毛片一区二区三区 | 欧美性久久久| 欧美国产三区| 国产精品国产三级国产专播精品人 | 午夜精品电影| 国产精品99久久久久久久女警 | 亚洲精品乱码久久久久久黑人 | 国产精品乱人伦中文| 欧美日韩午夜剧场| 国产精品嫩草影院av蜜臀| 欧美视频免费看| 欧美色道久久88综合亚洲精品| 久久亚洲精品视频| 久久国产精品亚洲77777| 亚洲免费视频观看| 亚洲午夜av电影| 欧美一级视频精品观看| 亚洲欧美日韩精品| 久久精品国产免费| 久久精品夜色噜噜亚洲a∨| 久久精品一区二区三区不卡| 国产精品免费福利| 亚洲二区在线| 99在线精品观看| 羞羞视频在线观看欧美| 欧美一级久久| 久久躁日日躁aaaaxxxx| 免费国产自线拍一欧美视频| 欧美超级免费视 在线| 亚洲毛片在线看| 亚洲女ⅴideoshd黑人| 久久这里只有精品视频首页| 国产精品成人午夜| 日韩一级黄色大片| 久久久亚洲国产天美传媒修理工 | 久久福利资源站| 久久欧美肥婆一二区| 欧美一区二区视频在线观看| 欧美日韩一区二区三区在线| 国产一区二区三区久久久久久久久| 亚洲欧美电影院| 久久国产加勒比精品无码| 亚洲国产成人精品视频| 久久精品国产清自在天天线| 欧美日韩成人| 亚洲欧美色婷婷| 国产精品美女诱惑| 这里只有视频精品| 亚洲高清资源| 欧美日韩国产成人在线免费| 欧美高清视频一区二区三区在线观看| 国产一区导航| 午夜久久久久久| 一区二区精品在线观看| 欧美视频久久| 久久国产精品一区二区| 亚洲一区二区在线免费观看| 国产精品分类| 久久精品国产在热久久| 欧美国产精品日韩| 欧美高清视频| 日韩一区二区精品| 一区二区精品国产| 国产美女精品人人做人人爽| 欧美在线日韩| 欧美国产一区视频在线观看 | 欧美国产精品v| 一本色道久久综合| 野花国产精品入口| 国语自产精品视频在线看一大j8| 欧美激情视频一区二区三区在线播放 | 欧美亚洲综合网| 亚洲欧美日本另类| 91久久线看在观草草青青| 国产精品99久久不卡二区| 国产亚洲在线观看| 亚洲乱码日产精品bd| 国产精品日韩久久久| 欧美喷潮久久久xxxxx| 国产有码一区二区| 欧美亚洲综合在线| 亚洲香蕉成视频在线观看 | 欧美久久婷婷综合色| 欧美亚洲日本国产| 中文国产一区| 亚洲综合国产| 欧美色精品天天在线观看视频 | 欧美成人午夜激情| 国产精品视频xxxx| 久热re这里精品视频在线6| 欧美日韩国产综合网| 免费观看成人网| 国产色爱av资源综合区| 99re8这里有精品热视频免费| 亚洲成人在线| 久久久久久夜精品精品免费| 亚洲综合色激情五月| 欧美激情在线免费观看| 久久免费视频这里只有精品| 久久国产精品久久久久久久久久 | 欧美三级视频在线| 亚洲国产精品免费| 性做久久久久久免费观看欧美| 国产亚洲aⅴaaaaaa毛片| 亚洲欧美日韩国产综合精品二区 | 亚洲日本中文字幕区| 欧美一区二区三区在线| 中文日韩欧美| 亚洲图片你懂的| 亚洲精品国产精品国产自| 欧美激情精品久久久久久免费印度| 亚洲高清激情| 免费视频亚洲| 亚洲欧美成人一区二区三区| 欧美日韩一区二区三区视频| 午夜久久久久久| 国产欧美日韩精品专区| 性视频1819p久久| 国产精品综合久久久| 欧美一区二区在线播放|