binary concatenation

27 views
Skip to first unread message

Taras J. Honcharuk

unread,
Jun 21, 2017, 5:57:45 AM6/21/17
to Erlang в Україні
Привет всем
недавно озадачился таким вопросом
если нужно обьединить два binary то делаю так
Bin1 = <<"qwerty">>.
Bin2 = <<"uiop[]">>.
Bin = <<Bin1/binary, Bin2/binary>>.

но в книге встретил такой трюк

Bin = list_to_binary([Bin1, Bin2]).

и задумался почему именно так?

какой способ более оптимально использовать?

Alexey Kishkin

unread,
Jun 21, 2017, 8:47:16 AM6/21/17
to Erlang в Україні
Разница будет в выделяемой памяти и размещении бинарника.

Для вашего примера Bin1 И Bin2 это heapbinary, то есть бинарники в памяти процесса.

А Bin =  <<Bin1/binary, Bin2/binary>> уже создаст refc binary. То есть бинарник в binary heap, не в памяти процесса, и размер выделяемой памяти будет не меньше 256 байт. 
Такая вот оптимизация, на тот случай если позже вы решите например добавить туда что то еще. 
Типа BinA = <<Bin/binary, 1>>.

А list_to_binary это bif, который создаст (для вашего примера) бинарник точно по размеру iolist, и разместит его в памяти процесса. То есть heapbinary.

На мой взгляд в практическом смысле не стоит заморачиваться list_to_binary. Ну за исключением специфического случая, когда бинарники маленькие, процессы короткоживущие, памяти мало, а таких операций много.




среда, 21 июня 2017 г., 12:57:45 UTC+3 пользователь Taras J. Honcharuk написал:

Alexey Kishkin

unread,
Jun 21, 2017, 8:47:53 AM6/21/17
to Erlang в Україні
Я вам сейчас найду ссылку где вся эта механика описана


Alexey Kishkin

unread,
Jun 21, 2017, 8:48:24 AM6/21/17
to Erlang в Україні

http://erlang.org/doc/efficiency_guide/binaryhandling.html

среда, 21 июня 2017 г., 15:47:53 UTC+3 пользователь Alexey Kishkin написал:

Taras J. Honcharuk

unread,
Jun 22, 2017, 4:56:21 AM6/22/17
to Erlang в Україні
Спасибо
грубо говоря для генерации Reply (короткая строка до 64 байт, которая больше изменяться не будет) вполне подойдет list_to_binary

среда, 21 июня 2017 г., 15:48:24 UTC+3 пользователь Alexey Kishkin написал:
Reply all
Reply to author
Forward
0 new messages