`
mryufeng
  • 浏览: 982258 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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的时候, 尽可能的利用这个特性。

分享到:
评论

相关推荐

    编译器优化技术Binary Literacy

    《编译器优化技术:Binary Literacy》 编译器优化是编程领域中至关重要的一环,它能够显著提升软件性能,降低资源消耗。本文将深入探讨编译器优化的几个关键层面,包括高、中、低级优化,以及具体的技术如死代码...

    Binary Viewer和jclasslib bytecode viewer

    总的来说,Binary Viewer和jclasslib bytecode viewer是Java开发者和JVM研究者的得力助手,它们能够增强你对字节码的理解,从而提升你在Java编程和JVM优化方面的技能。通过实践和探索,你可以更深入地理解Java运行时...

    jclsslib,binary viewer开发工具.7z

    1. **字节码解析**:它可以解析Class文件的结构,包括类信息、字段、方法、常量池等关键元素。 2. **字节码操作**:允许开发者对字节码进行编辑,例如添加、删除或修改方法、字段和属性。 3. **反编译支持**:虽然...

    x86编译器的汇编优化指南

    1. **寄存器使用**:根据特定的ABI标准(Application Binary Interface),说明了各个寄存器的功能和使用规则。 2. **数据存储**:讨论了不同数据类型(如整数、浮点数)的存储格式及布局。 3. **函数调用约定**...

    binary_tests:binary_tests

    因此,理解二进制文件的结构和格式对于调试、逆向工程以及优化软件性能至关重要。 在Assembly语言编程中,二进制文件的创建和解析是常见的任务。Assembly是一种低级语言,可以直接控制计算机的硬件,包括内存和...

    change string to binary.zip_Change_labview格式转换

    在这个VI中,"change string to binary"的输入可能是字符串常量或字符串控件,输出则是一个二进制数组。 5. **数据类型转换**: - 在LabVIEW中,理解数据类型是非常关键的。字符串到二进制的转换涉及到两种数据...

    SQL Server 2008数据库实用教程 sqlserver数据库基础教程 第5章 T-SQL语言 共68页.pptx

    - **Binary数据类型**: 用于存储二进制数据,如`BINARY`和`VARBINARY`。 - **其他数据类型**: 包括`BOOLEAN`(逻辑类型)、`UNIQUEIDENTIFIER`(全局唯一标识符)等。 了解并熟练掌握这些基本概念和语法是成为SQL...

    [Sams]C++_Footprint_And_Performance_Optimization.zip

    1. **编译器优化**:编译器在将源代码转换为可执行文件时,可以进行多种优化,例如删除未使用的代码(dead code elimination)、常量折叠(constant folding)、循环展开(loop unrolling)等。理解这些优化选项并...

    Transact-SQL语言[整理].pdf

    - 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. **字符型**...

    C语言的常用术语.pdf

    它进行语法分析、语义分析、优化和代码生成等步骤。 3. 头文件(Headerfile):头文件包含标准库函数的声明、宏定义和类型定义等信息。它们通常以.h作为文件扩展名,并通过#include预处理指令被包含在C源文件中。 ...

    jclasslib、binaryviewer、memoryanalyzer

    通过这个工具,你可以看到类文件中的常量池、字段、方法、属性等详细信息,这对于理解和调试Java应用的底层工作原理非常有帮助。同时,它还提供了颜色编码和丰富的上下文菜单,使得查看和分析变得更加直观和高效。 ...

    java编程术语java编程术语java编程术语

    首先,我们有“constant”,它指的是在程序中不可变的值,例如常量定义后不能被修改。标识符“identifier”是变量、类、方法等的名称,必须遵循特定的命名规则。引用“quote”在字符串中使用,而“double-quote”...

    gcc.zip_gcc compiler_gnu gcc

    它们对IR进行处理,执行各种优化,如死代码删除、常量折叠和循环展开等。 3. **Backends**:这是针对特定处理器架构的代码生成器,将中间表示转换为目标机器代码。GCC支持大量的处理器架构,从常见的x86和ARM到更...

    plsql用户完全手册(整理版)

    - 变量和常量:可以声明各种类型的变量,包括SQL标准类型(如NUMBER、CHAR、DATE)和PL/SQL特定类型(如BOOLEAN、BINARY_INTEGER)。变量必须先声明后使用,不可向前引用。常量一旦声明就不能改变。 - 错误处理:...

    jdk-7u1-windows-i586 32位 windows JDK 1.7

    - **Binary Literals**:允许使用二进制前缀0b或0B来表示二进制数值。 - **Underscore in Numeric Literals**:在数字常量中使用下划线(_)作为分隔符,增加可读性。 4. **编译器和工具** - **javac编译器**:...

    JavaTM 2 Platform Standard Edition 5.0 API

    枚举常用于表示一组常量,如方向、星期等,相比使用整数或字符串常量更安全、更易读。 3. **自动装箱与拆箱(Autoboxing and Unboxing)**:Java 5.0自动处理基本类型与对应的包装类之间的转换,简化了代码,如...

    Oracle® Database PL/SQL User's Guide and Reference(10.2).rar

    9. **索引和性能优化**:PL/SQL与数据库优化密切相关,理解如何创建和使用索引,以及如何编写高效的SQL语句,对提升应用性能至关重要。 10. **并发控制**:在多用户环境中,了解锁定和事务管理对于确保数据一致性至...

    PLSQL数据类型.pdf

    在PL/SQL编程中,数据类型是至关重要的概念,它定义了变量或常量能够存储的数据种类。Oracle数据库提供了一系列的预定义数据类型,这些数据类型可以分为四大类:标量类型、复合类型、引用类型和LOB(Large Object)...

Global site tag (gtag.js) - Google Analytics