[Elang-003][OTP]Efficiency Guide User's Guide->Common Caveats

7218 ワード

    :http://www.erlang.org/doc/efficiency_guide/commoncaveats.html
(    ,        )
 
3     

                  ,        ,    。
 
3.1 timer  

 erlang:send_after/3 erlang:start_time/3      ,  timer            。timer             ,                  ,         (     SMP      )。
  timer           (  timer:tc/3,timer:sleep/1),    call timer_server  ,      。
 
3.2 list_to_atom/1

         。       ,       。          (  1048576),      。
  ,                             。                ,    list_to_existing_atom/1   “      ”。(               ,            ,        。)
  list_to_atom/1       ,           apply/3,     ,               。
 
apply(list_to_atom("some_prefix"++Var), foo, Args)
 
 
3.3 length/1

                 ,  tuple_size/1,byte_size/1 bit_size/1          。
        length/1   ,     C     。              ,            ,       length/1。
  length/1        ,    

foo(L) when length(L) >= 3 ->
    ...
 
   
foo([_,_,_|_]=L) ->
   ...
 
(        ,  L         ,length(L)   ,                。)
 
3.4 setelement/3

setelement/3          ,  ,     setelement/3              。
        ,          。                              ,  setelement/3                setelement  。

multiple_setelement(T0) ->
    T1 = setelement(9, T0, bar),
    T2 = setelement(7, T1, foobar),
    setelement(5, T2, new_value).

setelement/3 , 。 setelement/3 。
         ,           :
  • インデックス(setelement/3の最初のパラメータ)は、変数や表現ではなく整数として書かれています.
  • インデックスは、順序を逆にして与えられなければならない.
  • は、setelement/3の呼び出しの間に他の関数の呼び出しができない.
  • setelement/3から返されるタプルは、後続のsetelement/3呼び出しとしてのみ使用されなければならない.
  •  
           multiple_setlement/1      ,                   ,   ,      。
    
     
    3.5 size/1
    size/1     binary   。
     R12B         tuple_size/1 byte_size/1                   。                Dialyzer        bugs。
    
     
    3.6 split_binary/2
                    split_binary/2     ,          split_binary/2               。
    

    DO
     
     
    <<Bin1:Num/binary,Bin2/binary>> = Bin,
     
     
     
    
    DO NOT
     
     
    {Bin1,Bin2} = split_binary(Bin, Num)
     
     
     
     

    3.7 '--'
      :'--'                  ,    ,             ,     。
    DO NOT
     
      
    HugeList1 -- HugeList2
     
      

    ordsets :

    DO
    HugeSet1 = ordsets:from_list(HugeList1), HugeSet2 = ordsets:from_list(HugeList2), ordsets:subtract(HugeSet1, HugeSet2)
       ,            ,         。            ,    :
    DO
    セット=gb_sets:from_list(HugList 2),[E𞓜E]<-Huge List 1,not gb sets:is element(E,Set)]
        1:           ,      '--'    (       HugeList1    HugeList2      ;'--'       。)

    2: '==' , '--' '=:=' 。 , sets gb_sets, sets:from_list/1 gb_sets:from_list/1 。
    '--' :
    OK