`
liumengfan
  • 浏览: 32924 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

erlang的内联编译

阅读更多
今天再erlang inline 编译中读到erlang的函数也可以内联编译。
但是内联功能从来不会默认打开的。如果想使用的话,必须显示的在代码里使用-compile()属性。
当再代码里加上-compile(inline).时,编译器会根据自己的规则来决定哪个函数被定义成内联函数,其中有一个因素就是-compile({inline_size, Size}).,默认的size是24,这个size作为一个权重来参与决定某个函数是否被编译成内联的函数。
我们也可以使用
-compile({inline, [test/0, start/1]}).
或者
-compile({inline, [{test, 0}, {start, 1}]}).
来显示的指定哪个函数被编译成内联的函数。
我们还可以使用
-compile(inline_list_funcs).
来显示将下列的函数内联到该模块
引用

         * lists:all/2
         * lists:any/2
         * lists:foreach/2
         * lists:map/2
         * lists:flatmap/2
         * lists:filter/2
         * lists:foldl/3
         * lists:foldr/3
         * lists:mapfoldl/3
         * lists:mapfoldr/3

另外我们也可以同时指定这些选项来编译模块,例如:
-compile([inline, {inline_size, 100}, inline_list_funcs, {inline, [show/0]}]).

下面我们使用一个例子来看一下是否使用内联编译的区别:
[list]
  • 不是用内联编译
  • erlang文件
    -module(test).
    
    -export([test/0, show/0]).
    
    test() -> 
    	show(), 
    	show(), 
    	show(), 
    	show().
    
    show() ->
    	io:format("this is ~p~n", ["test"]).
    

    生成的汇编代码
    {module, test}.  %% version = 0
    
    {exports, [{module_info,0},{module_info,1},{show,0},{test,0}]}.
    
    {attributes, []}.
    
    {labels, 9}.
    
    
    {function, test, 0, 2}.
      {label,1}.
        {line,[{location,"test.erl",5}]}.
        {func_info,{atom,test},{atom,test},0}.
      {label,2}.
        {allocate,0,0}.
        {line,[{location,"test.erl",6}]}.
        {call,0,{f,4}}.
        {line,[{location,"test.erl",7}]}.
        {call,0,{f,4}}.
        {line,[{location,"test.erl",8}]}.
        {call,0,{f,4}}.
        {call_last,0,{f,4},0}.
    
    
    {function, show, 0, 4}.
      {label,3}.
        {line,[{location,"test.erl",11}]}.
        {func_info,{atom,test},{atom,show},0}.
      {label,4}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",12}]}.
        {call_ext_only,2,{extfunc,io,format,2}}.
    
    
    {function, module_info, 0, 6}.
      {label,5}.
        {line,[]}.
        {func_info,{atom,test},{atom,module_info},0}.
      {label,6}.
        {move,{atom,test},{x,0}}.
        {line,[]}.
        {call_ext_only,1,{extfunc,erlang,get_module_info,1}}.
    
    
    {function, module_info, 1, 8}.
      {label,7}.
        {line,[]}.
        {func_info,{atom,test},{atom,module_info},1}.
      {label,8}.
        {move,{x,0},{x,1}}.
        {move,{atom,test},{x,0}}.
        {line,[]}.
        {call_ext_only,2,{extfunc,erlang,get_module_info,2}}.
    
  • 使用内联编译
  • erlang代码
    -module(test).
    
    -export([test/0, show/0]).
    
    -compile([inline, {inline_size, 100}, inline_list_funcs, {inline, [show/0]}]).
    
    test() -> 
    	show(), 
    	show(), 
    	show(), 
    	show().
    
    show() ->
    	io:format("this is ~p~n", ["test"]).
    

    生成的汇编代码
    {module, test}.  %% version = 0
    
    {exports, [{module_info,0},{module_info,1},{show,0},{test,0}]}.
    
    {attributes, []}.
    
    {labels, 9}.
    
    
    {function, test, 0, 2}.
      {label,1}.
        {line,[{location,"test.erl",9}]}.
        {func_info,{atom,test},{atom,test},0}.
      {label,2}.
        {allocate,0,0}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",16}]}.
        {call_ext,2,{extfunc,io,format,2}}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",16}]}.
        {call_ext,2,{extfunc,io,format,2}}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",16}]}.
        {call_ext,2,{extfunc,io,format,2}}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",16}]}.
        {call_ext_last,2,{extfunc,io,format,2},0}.
    
    
    {function, show, 0, 4}.
      {label,3}.
        {line,[{location,"test.erl",15}]}.
        {func_info,{atom,test},{atom,show},0}.
      {label,4}.
        {move,{literal,["test"]},{x,1}}.
        {move,{literal,"this is ~p~n"},{x,0}}.
        {line,[{location,"test.erl",16}]}.
        {call_ext_only,2,{extfunc,io,format,2}}.
    
    
    {function, module_info, 0, 6}.
      {label,5}.
        {line,[]}.
        {func_info,{atom,test},{atom,module_info},0}.
      {label,6}.
        {move,{atom,test},{x,0}}.
        {line,[]}.
        {call_ext_only,1,{extfunc,erlang,get_module_info,1}}.
    
    
    {function, module_info, 1, 8}.
      {label,7}.
        {line,[]}.
        {func_info,{atom,test},{atom,module_info},1}.
      {label,8}.
        {move,{x,0},{x,1}}.
        {move,{atom,test},{x,0}}.
        {line,[]}.
        {call_ext_only,2,{extfunc,erlang,get_module_info,2}}.
    

    [/list]
    其中生成汇编代码的命令是:
    erlc -S test
    分享到:
    评论

    相关推荐

      erlang_mysql编译好了

      Erlang MySQL 编译指南 在IT领域,Erlang是一种强大的编程语言,尤其在构建高并发、分布式系统方面表现出色。而MySQL是广泛使用的开源关系型数据库管理系统。将Erlang与MySQL结合,可以实现高效的数据交互。本文将...

      erlang 24.0 龙芯 loongarch64 预编译版本

      在给定的标题“erlang 24.0 龙芯 loongarch64 预编译版本”中,我们可以看到这个软件包是为龙芯架构(LoongArch64)平台特别编译的Erlang 24.0版本。由于Erlang官方不直接提供针对龙芯处理器的二进制包,这意味着这...

      Erlang简易编译环境 EditPlus + 批处理 + 本文 实现简易编译(含erlang.stx)

      %% editplus + 批处理 + 本文 实现简易编译 %% 作者:冷志峰 %% 2009,8,3 %% email:sunbo008@126.com %% 谁给我个这个网站的邀请码 http://www.fpscript.com/bbs/forum-65-1.html %% %% 步骤1:编写批处理文件 %%...

      mmake:优化Erlang多核编译 Erlang compiler optimization of multi process

      mmaker为多进程编译,修改自otp/lib/tools/src/make.erl,可以启动多个process进行编译,从而提高编译速度。 本版本优化编译等待,一个文件编译完成后,立即进行后续文件编译,不用等待分组完成。 Usage: erl -pa ebin ...

      rabbitmq编译安装erlang的所需要的依赖rpm包

      本篇将详细介绍在ARM架构上编译安装Erlang以及其所需的依赖rpm包。 首先,Erlang是RabbitMQ的基础,它是一门强大的并行计算和分布式计算语言,以其高可用性、容错性和实时性能而闻名。在ARM系统上编译Erlang,我们...

      erlang 设计指南

      **Erlang设计指南** Erlang是一种面向并发的、函数式编程语言,它由瑞典电信设备制造商Ericsson开发,主要用于构建高度可扩展和容错性强的分布式系统。"Programming Erlang: Software for a Concurrent World"是Joe...

      二郎助手erlang开发工具、erlang编辑器

      【二郎助手:Erlang开发的利器】 在IT领域,Erlang是一种强大的编程语言,尤其在并发处理和分布式系统方面表现出色。为了更好地支持Erlang的开发,二郎助手应运而生,它是一款专为Elang语言定制的开发工具,旨在...

      sync:快速在Erlang中进行重新编译和重新加载。 代码无摩擦

      它会实时重新编译并重新加载您的Erlang代码。 有了Sync,您就可以毫无困难地进行编码。 “没有摩擦的代码”是什么意思? 这意味着在运行Sync的情况下,您不再需要担心再次运行make或c:l(Module) 。 编写代码,保存...

      Erlang_to_C

      - **编译优化**:Turbo Erlang采用了先进的编译技术,包括但不限于类型推断、循环展开、函数内联等优化手段,这些都有助于减少运行时的开销。 - **运行时优化**:通过高效的数据结构管理、内存分配策略以及垃圾...

      erlang_版本24.3.4.4

      3. **编译Erlang**:进入解压后的目录,运行`./configure`命令来配置编译选项。这一步会检测你的系统环境并生成适合的Makefile。 4. **构建和测试**:执行`make`命令开始编译Erlang。这个过程可能需要一些时间,...

      最新版 erlang安装包 otp_src_21.3.tar.gz

      - 编译成功后,使用`sudo make install`命令将Erlang OTP安装到系统路径中。 7. **验证安装**: - 安装完成后,你可以通过运行`erl`命令来启动Erlang shell,如果一切顺利,你应该看到Erlang的欢迎界面。 - 使用...

      erlang22最新下载包

      6. **编译器和工具链**:Erlang的编译器和构建工具可能也得到了改进,使得代码编译更快,调试更方便。 7. **兼容性**:Erlang22可能会改进与其他软件和硬件平台的兼容性,包括新的操作系统版本和硬件架构。 要使用`...

      erlang安装帮助包

      5. **编译源码**:使用`make`命令编译Erlang源码。 6. **安装Erlang**:执行`sudo make install`,这将把编译好的Erlang安装到系统路径中。 7. **设置环境变量**:可能需要将Erlang的bin目录添加到PATH环境变量中...

      erlang25.0 windows版本

      6. **编译器升级**:Erlang的BEAM虚拟机和编译器可能会有优化,使得编译速度更快,生成的代码更高效。 作为“源码软件”,Erlang 25.0同样提供了源代码,开发者可以深入研究其内部工作原理,进行定制化开发,或者为...

      erlang 21.3

      这意味着该压缩包是为Linux环境设计的,用户需要在Linux环境下编译和安装Erlang 21.3。 在Linux上安装Erlang 21.3的步骤通常包括以下几个关键步骤: 1. **解压**: 首先,使用`tar -zxvf otp_src_21.3.tar.gz`命令...

      erlang的小型游戏服务器

      项目包含的文件`mmake.beam`是Erlang的编译后代码,它可能是一个构建工具,用于自动化编译和管理Erlang源代码。`cfile`可能是一个处理文件操作的模块,游戏服务器通常需要读写各种配置文件或日志文件。`ctl`可能是一...

      erlang编程 Introducing Erlang

      **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

      erlang 20.3

      通常,Erlang在Unix-like系统上编译和运行更为顺畅,但对于Windows平台,官方也提供了预编译的二进制安装包,简化了安装过程。 压缩包内的文件"otp_src_20.3"是OTP 20.3的源代码,包含了Erlang虚拟机、标准库以及...

      erlang-mmake.erl

      好东西,一个erlang并行编译的源码。通过对make.erl(otp/lib/tools/src/make.erl)进行修改,提供一个支持多进程编译的mmake.erl。其接口和make.erl相似,只是第一个参数为并发编译数

      erlang中文基础教程

      "Erlang中文基础教程" Erlang 编程语言是一种功能强大且灵活的编程语言,它提供了...Erlang 编程语言是一种功能强大且灵活的编程语言,提供了一个交互式的 shell 环境,支持顺序编程、模块和函数、编译和运行等特点。

    Global site tag (gtag.js) - Google Analytics