Двоичный файл Erlang: приведет ли это к копии?

После прочтения этого документа я не уверен, будет ли следующий код внутренне создавать двоичные копии A во время выполнения.

f(<<>>, A) ->
    A;
f(<<X:2/binary, R/binary>>, A) ->
    I = binary_to_integer(X, 16),
    f(R, <<A/binary, I>>).

Я предполагаю "нет", потому что А не отправлено и не деконструировано. Я прав или я что-то упустил?

2 ответа

Решение

Ваш код не приведет к копированию во время выполнения A двоичные файлы, поскольку совместное использование суб-двоичных файлов не выполняется. Если мы вручную развернем последовательность операций добавления, это будет выглядеть примерно так:

A0 = <<A/binary, SomeByte>>,
A1 = <<A0/binary, SomeByte1>>,
A2 = <<A1/binary, SomeByte2>>,
 .....
An = <<An-1, SomeByteN>>.

Таким образом, мы добавляем только двоичный файл, полученный в результате последней операции добавления, то есть существует одна ссылка на ProcBin, созданный для A0(как описано в документации по эффективности).

Почему бы не использовать опцию bin_opt_info?

Для вашего кода:

[root@nimbus bin_test]# erlc +bin_opt_info a.erl
a.erl:8: Warning: OPTIMIZED: creation of sub binary delayed

Для кода в https://gist.github.com/wardbekker/5673200

Выход:

[root@nimbus bin_test]# erlc +bin_opt_info test.erl 
test.erl:14: Warning: OPTIMIZED: creation of sub binary delayed
[root@nimbus bin_test]# erlc +bin_opt_info test2.erl
test2.erl:8: Warning: variable 'A' is unused
test2.erl:13: Warning: OPTIMIZED: creation of sub binary delayed
Другие вопросы по тегам