binary的常量优化

erlang的binary在这个网络程序里面占着非常重要的地位,所以otp团队采用了非常多的优化手段包括:

1. binary操作对应着 opcode
2. 根据生命期和作用,有4种类型的binary
3. hipe优化,把bs_操作直接翻译成asm指令
4. 编译器层面消除无必须的操作。


下面的例子就是演示4的特性:

yu-fengdemacbook-2:~ yufeng$ cat bin.erl
-module(bin).
-export([start/1]).

start(A)->
B1= <<12>>,
B2 = <<B1/binary, 5.0/float>>,
B3= <<B2/binary, "yes">>,
% B3的值是预先可以知道的, 无需一步步的构造

<<"abcd", 3:32,B3:128/binary,_/binary>> = <<"abcd1234",A/binary,2:32, 8773:64, "a", 5.0/float>>.

% 2:32, 8773:64, "a", 5.0/float 这些都是预先知道的 直接翻译成二进制流。

yu-fengdemacbook-2:~ yufeng$ erlc +"'S'" bin.erl
yu-fengdemacbook-2:~ yufeng$ cat bin.S
{module, bin}. %% version = 0

{exports, [{module_info,0},{module_info,1},{start,1}]}.

{attributes, []}.

{labels, 8}.


{function, start, 1, 2}.
{label,1}.
{func_info,{atom,bin},{atom,start},1}.
{label,2}.
{move,{integer,0},{x,1}}.
{gc_bif,byte_size,{f,0},2,[{x,0}],{x,2}}.
{bs_add,{f,0},[{x,1},{x,2},1],{x,1}}.
{bs_add,{f,0},[{x,1},{integer,29},1],{x,1}}.
{bs_init2,{f,0},{x,1},0,1,{field_flags,[]},{x,1}}.
{bs_put_string,8,{string,"abcd1234"}}.
{bs_put_binary,{f,0},{atom,all},8,{field_flags,[unsigned,big]},{x,0}}.

%% 一步到位
{bs_put_string,21,
{string,[0,0,0,2,0,0,0,0,0,0,34,69,97,64,20,0,0,0,0,0,0]}}.

{test,bs_start_match2,{f,3},[{x,1},2,0,{x,0}]}.
{test,bs_match_string,{f,3},[{x,0},64,{string,[97,98,99,100,0,0,0,3]}]}.
%% 一步到位

{test,bs_get_binary2,
{f,3},
[{x,0},
2,
{integer,128},
8,
{field_flags,[{anno,[8,{file,"./bin.erl"}]},unsigned,big]},
{x,2}]}.
{test,bs_skip_bits2,
{f,3},
[{x,0},
{atom,all},
8,
{field_flags,[{anno,[8,{file,"./bin.erl"}]},unsigned,big]}]}.
{test,is_eq_exact,
{f,3},
[{x,2},{literal,<<12,64,20,0,0,0,0,0,0,121,101,115>>}]}.
%% 一步到位

{move,{x,1},{x,0}}.
return.
{label,3}.
{badmatch,{x,1}}.


{function, module_info, 0, 5}.
{label,4}.
{func_info,{atom,bin},{atom,module_info},0}.
{label,5}.
{move,{atom,bin},{x,0}}.
{call_ext_only,1,{extfunc,erlang,get_module_info,1}}.


{function, module_info, 1, 7}.
{label,6}.
{func_info,{atom,bin},{atom,module_info},1}.
{label,7}.
{move,{x,0},{x,1}}.
{move,{atom,bin},{x,0}}.
{call_ext_only,2,{extfunc,erlang,get_module_info,2}}.

所以我们在使用binary的时候, 尽可能的利用这个特性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值