2017-05-26 51 views
3

我寫這樣的作品,二進制分割到每個字符的功能,但我有一種感覺,還有一個更簡單的方法來做到這一點:我認爲這是二郎:在每一個字符分割二元

my_binary_to_list(<<H,T/binary>>) -> 
%slightly modified version of http://erlang.org/doc/efficiency_guide/binaryhandling.html 
    [list_to_binary([H])|my_binary_to_list(T)]; 
my_binary_to_list(<<>>) -> []. 

> my_binary_to_list(<<"ABC">>). 
[<<"A">>,<<"B">>,<<"C">>] 

可能是因爲凌亂的list_to_binary([H])因爲H應該已經是一個二進制文件。

我試圖直接使用鏈接的功能,但得到"AA"這是不是我想要的。然後,我嘗試了[H],得到了["A","B","C"]這也並不是我想要的。

回答

8

您可以創建一個字節的二進制,而無需創建一個列表和調用list_to_binary這樣的:

my_binary_to_list(<<H,T/binary>>) -> 
    [<<H>>|my_binary_to_list(T)]; 

您也可以使用二進制內涵這裏做上述同樣的邏輯在一個單一的行:

1> [<<X>> || <<X>> <= <<"ABC">>]. 
[<<"A">>,<<"B">>,<<"C">>] 

您也可以直接提取尺寸爲1的二進制文件(這可能不是比上面更快雖然):

2> [X || <<X:1/binary>> <= <<"ABC">>]. 
[<<"A">>,<<"B">>,<<"C">>] 

編輯:使用timer:tc/1的快速工作臺在大約一半的時間內運行第二個代碼,但在使用任何一個代碼之前,應該先測試一下自己的性能。也許第二個是通過創建子二進制文件共享大二進制文件?

1> Bin = binary:copy(<<"?">>, 1000000). 
<<"????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"...>> 
2> timer:tc(fun() -> [<<X>> || <<X>> <= Bin] end). 
{14345634, 
[<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<...>>|...]} 
3> timer:tc(fun() -> [X || <<X:1/binary>> <= Bin] end). 
{7374003, 
[<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>, 
    <<"?">>,<<"?">>,<<"?">>,<<"?">>,<<"?">>,<<...>>|...]} 
+0

嗯,這在我的基準測試中似乎也更快,謝謝! – Tommy

3

您可以使用列表中理解有位串發生器(<=消耗的二進制文件,而不是<-消耗名單):

> [<<A>> || <<A>> <= <<"foo">>]. 
[<<"f">>,<<"o">>,<<"o">>] 

在你的版本,list_to_binary([H])可以通過<<H>>替代 - 都會生成包含一個字節的二進制文件無論是使用列表理解而不是遞歸函數,都可以稱爲「更簡單」。