2017-05-26 7 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">>] 

私はこれがあると思いますHはすでにバイナリであるはずなので、おそらくlist_to_binary([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のバイナリを抽出することができます。

編集:クイックベンチtimer:tc/1を使用するクイックベンチは、第1のコードに比べて約半分の時間で第2のコードを実行しますが、パフォーマンスの理由からどちらかを使用する前にベンチマークを行う必要があります。おそらく、2番目のサブバイナリを作成して大きなバイナリを共有しているのでしょうか?

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

hmmmこれは私のベンチマークでも速いと思われます。ありがとうございます! – Tommy

3

:お使いのバージョンで

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

list_to_binary([H])<<H>>に置き換えることができます - どちらも1バイトを含むバイナリを生成します。再帰関数の代わりにリストの理解を使用するかどうかは、「より簡単なもの」が味の問題かもしれないという条件を満たすかどうか。

関連する問題