Двоичный файл 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