成長就是一個不斷積累的過程,記錄點點游戲項目中的一些吹毛求疵的優化。菜鳥己見,歡迎不認同者,批評指教!!!
首先我們看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吧。
總而言之,我只是說出了幾種不同方式,如何在游戲代碼中高效合理應用,還需個人斟酌。