erlang list:delete不建議使用


  成長就是一個不斷積累的過程,記錄點點游戲項目中的一些吹毛求疵的優化。菜鳥己見,歡迎不認同者,批評指教!!!

  首先我們看erlang自帶的lists:delete源碼

  delete(Item,[Item|Rest]) ->Rest;

  delete(Item,[H|Rest]) ->

    [H|delete(Item,Rest)];

  delete(_,[]) ->[].

  此段代碼首先不是尾遞歸,不用尾遞歸的弊處在這里我就不多說了,這個函數有點誤導,不看介紹,以為是刪除所有符合的元素,其實只是刪除第一個符合要求的元素,之所以不用尾遞歸,而且只刪第一個元素,我想有它特定的用處吧,它這種做法,能保證被處理過后的list順序不會發生變化,而且只刪一個。

  我個人寫了個尾遞歸的如下(刪除所有符合要求元素,得到的列表順序反了)

  delete(Item,List) ->

    delete1(Item,List,[]).

  delete1(_,[],L)->

    L;

  delete1(Item,[Temp|List],L) ->

    case Item =:= Temp of

        true ->

          delete1(Item,List,L);

        false ->

          delete1(Item,List,[Temp|L])

  end.

   PS:我這種只是為了寫成尾遞歸,它的時間效率和源碼中的lists:delete效率差不多 ,缺點順序反了,我自己寫了測試100萬元素的情況下,效率差不多,當然高手是不會寫這種的,高手一般都用列表解析,它的效率一般是源碼lists:delete的兩倍以上,[Temp||Temp<-List,Temp=/=Item],如果你是刪除列表中所有Item,極力推薦使用前面所說的列表解析方法。

  當然如果你的列表長度不長,又不會出現重復的,lists:delete和列表解析差不多,幾乎沒啥影響,而且如果你確實也只需要刪除一個元素,那還是用lists:delete吧。

  總而言之,我只是說出了幾種不同方式,如何在游戲代碼中高效合理應用,還需個人斟酌。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM