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的时候, 尽可能的利用这个特性。
分享到:
相关推荐
《编译器优化技术:Binary Literacy》 编译器优化是编程领域中至关重要的一环,它能够显著提升软件性能,降低资源消耗。本文将深入探讨编译器优化的几个关键层面,包括高、中、低级优化,以及具体的技术如死代码...
总的来说,Binary Viewer和jclasslib bytecode viewer是Java开发者和JVM研究者的得力助手,它们能够增强你对字节码的理解,从而提升你在Java编程和JVM优化方面的技能。通过实践和探索,你可以更深入地理解Java运行时...
1. **字节码解析**:它可以解析Class文件的结构,包括类信息、字段、方法、常量池等关键元素。 2. **字节码操作**:允许开发者对字节码进行编辑,例如添加、删除或修改方法、字段和属性。 3. **反编译支持**:虽然...
1. **寄存器使用**:根据特定的ABI标准(Application Binary Interface),说明了各个寄存器的功能和使用规则。 2. **数据存储**:讨论了不同数据类型(如整数、浮点数)的存储格式及布局。 3. **函数调用约定**...
因此,理解二进制文件的结构和格式对于调试、逆向工程以及优化软件性能至关重要。 在Assembly语言编程中,二进制文件的创建和解析是常见的任务。Assembly是一种低级语言,可以直接控制计算机的硬件,包括内存和...
在这个VI中,"change string to binary"的输入可能是字符串常量或字符串控件,输出则是一个二进制数组。 5. **数据类型转换**: - 在LabVIEW中,理解数据类型是非常关键的。字符串到二进制的转换涉及到两种数据...
- **Binary数据类型**: 用于存储二进制数据,如`BINARY`和`VARBINARY`。 - **其他数据类型**: 包括`BOOLEAN`(逻辑类型)、`UNIQUEIDENTIFIER`(全局唯一标识符)等。 了解并熟练掌握这些基本概念和语法是成为SQL...
1. **编译器优化**:编译器在将源代码转换为可执行文件时,可以进行多种优化,例如删除未使用的代码(dead code elimination)、常量折叠(constant folding)、循环展开(loop unrolling)等。理解这些优化选项并...
- Transact-SQL支持多种数据类型,包括数值类型(如int、decimal、float)、字符类型(如varchar、nvarchar)、日期/时间类型(如datetime、time)、二进制类型(如binary、varbinary)以及特殊类型(如...
1. **数字型**:包括BINARY_INTEGER(有符号整型,范围-2^31~2^31)、NUMBER(可存储整数和浮点数,支持指定精度和刻度,如Number(9,2))以及PLS_INTEGER(与BINARY_INTEGER类似,但用于PL/SQL)。 2. **字符型**...
它进行语法分析、语义分析、优化和代码生成等步骤。 3. 头文件(Headerfile):头文件包含标准库函数的声明、宏定义和类型定义等信息。它们通常以.h作为文件扩展名,并通过#include预处理指令被包含在C源文件中。 ...
通过这个工具,你可以看到类文件中的常量池、字段、方法、属性等详细信息,这对于理解和调试Java应用的底层工作原理非常有帮助。同时,它还提供了颜色编码和丰富的上下文菜单,使得查看和分析变得更加直观和高效。 ...
首先,我们有“constant”,它指的是在程序中不可变的值,例如常量定义后不能被修改。标识符“identifier”是变量、类、方法等的名称,必须遵循特定的命名规则。引用“quote”在字符串中使用,而“double-quote”...
它们对IR进行处理,执行各种优化,如死代码删除、常量折叠和循环展开等。 3. **Backends**:这是针对特定处理器架构的代码生成器,将中间表示转换为目标机器代码。GCC支持大量的处理器架构,从常见的x86和ARM到更...
- 变量和常量:可以声明各种类型的变量,包括SQL标准类型(如NUMBER、CHAR、DATE)和PL/SQL特定类型(如BOOLEAN、BINARY_INTEGER)。变量必须先声明后使用,不可向前引用。常量一旦声明就不能改变。 - 错误处理:...
- **Binary Literals**:允许使用二进制前缀0b或0B来表示二进制数值。 - **Underscore in Numeric Literals**:在数字常量中使用下划线(_)作为分隔符,增加可读性。 4. **编译器和工具** - **javac编译器**:...
枚举常用于表示一组常量,如方向、星期等,相比使用整数或字符串常量更安全、更易读。 3. **自动装箱与拆箱(Autoboxing and Unboxing)**:Java 5.0自动处理基本类型与对应的包装类之间的转换,简化了代码,如...
9. **索引和性能优化**:PL/SQL与数据库优化密切相关,理解如何创建和使用索引,以及如何编写高效的SQL语句,对提升应用性能至关重要。 10. **并发控制**:在多用户环境中,了解锁定和事务管理对于确保数据一致性至...
在PL/SQL编程中,数据类型是至关重要的概念,它定义了变量或常量能够存储的数据种类。Oracle数据库提供了一系列的预定义数据类型,这些数据类型可以分为四大类:标量类型、复合类型、引用类型和LOB(Large Object)...