`
AvinDev
  • 浏览: 113336 次
社区版块
存档分类
最新评论

Erlang R12B3 的sub binary优化似乎有Bug?

阅读更多
09.3.18更新:
随着R13A release,我也重新查了一下这个问题,首先这份代码在编译的时候,会提示
引用
Warning: NOT OPTIMIZED: different control paths use different positions in the binary

litaocheng同学提醒,只要将代码修改为
dame_shit(Bin) ->
    dame_shit(Bin, <<"\r\n">>, not_found).
dame_shit(<<Tag:2/bytes, T/binary>>, Tag, not_found) ->
    dame_shit(T, Tag, found);
dame_shit(<<B, T/binary>>, Tag, not_found) ->
    dame_shit(T, Tag, not_found);
dame_shit(<<>>, _, _) ->
    not_found;
dame_shit(Bin, _, found) ->
    {found, Bin}.

编译就正常了:
引用
Warning: OPTIMIZED: creation of sub binary delayed

然后在R12B-5/R13A上面执行,逻辑正常:
引用
Find '\r\n' result1: {found,<<"something maybe wrong!">>}
Find '\r\n' result2: {found,<<"something maybe wrong!">>}


下面是原文
===========================
在使用过程中,发现了sub binary的优化似乎有Bug,先上代码:

-module(dame_shit).
-export([main/0, dame_shit/1, dame_shit2/1]).

dame_shit(Bin) ->
    dame_shit(Bin, <<"\r\n">>, not_found).
dame_shit(Bin, _, found) ->
    {found, Bin};
dame_shit(<<Tag:2/bytes, T/binary>>, Tag, not_found) ->
    dame_shit(T, Tag, found);
dame_shit(<<B, T/binary>>, Tag, not_found) ->
    dame_shit(T, Tag, not_found);
dame_shit(<<>>, _, _) ->
    not_found.

dame_shit2(Bin) ->
    dame_shit2(Bin, <<"\r\n">>, not_found).
dame_shit2(Bin, _, found) ->
    {found, Bin};
dame_shit2(<<Tag:2/bytes, T/binary>>=UnusedBinary, Tag, not_found) ->
    dame_shit2(T, Tag, found);
dame_shit2(<<B, T/binary>>, Tag, not_found) ->
    dame_shit2(T, Tag, not_found);
dame_shit2(<<>>, _, _) ->
    not_found.

main() ->
    io:format("Find '\\r\\n' result1: ~p~n", [dame_shit(<<"oops\r\nsomething maybe wrong!">>)]),
    io:format("Find '\\r\\n' result2: ~p~n", [dame_shit2(<<"oops\r\nsomething maybe wrong!">>)]),
    ok.


dame_shit & dame_shit2 的区别在于
<<Tag:2/bytes, T/binary>>=UnusedBinary

这句,这会导致binary优化失效,查看编译输出也可以发现这点:

引用
$ erlc +bin_opt_info dame_shit.erl
./dame_shit.erl:8: Warning: OPTIMIZED: creation of sub binary delayed
./dame_shit.erl:10: Warning: OPTIMIZED: creation of sub binary delayed
./dame_shit.erl:10: Warning: variable 'B' is unused
./dame_shit.erl:19: Warning: INFO: the '=' operator will prevent delayed sub bin
ary optimization
./dame_shit.erl:19: Warning: NOT OPTIMIZED: called function dame_shit2/3 does no
t begin with a suitable binary matching instruction
./dame_shit.erl:19: Warning: variable 'UnusedBinary' is unused
./dame_shit.erl:21: Warning: NOT OPTIMIZED: called function dame_shit2/3 does no
t begin with a suitable binary matching instruction
./dame_shit.erl:21: Warning: variable 'B' is unused


运行的时候确实是结果不一样:
引用
$ erl -noshell -s dame_shit main -s init stop
Find '\r\n' result1: not_found
Find '\r\n' result2: {found,<<"something maybe wrong!">>}



Windows XP + Erlang OTP R12B3
Linux X64_86 + Erlang OTP R12B3
下都得出相同的结果。


为什么会这样?在 dame_shit(<<B, T/binary>>, Tag, not_found) -> 下面加入日志输出:
io:format("B=~c~n", [B]),
执行后,输出如下:
引用

B=p
B=

B=m
B=h
B=g
B=a
B=e
B=r
B=g
B=!
Find '\r\n' result1: not_found


可见,每次执行这个匹配函数,指针都跳过了2个字符
oops\r\nsomething maybe wrong!

跳过2个字符的原因,应该是由于前面的函数
dame_shit(<<Tag:2/bytes, T/binary>>, Tag, not_found) ->
中的2bytes引起。
分享到:
评论

相关推荐

    erlang语言实现binary_to_term完整代码

    erlang提供了binary_to_term 函数,用于把二进制数据转为原始的erlang数据。这个函数都是c实现的,这里用erlang语言实现了,很有参考价值,其他语言可以参考这个解析erlang二进制协议数据。配套文章地址...

    Erlang应用优化指南

    Erlang应用优化指南 Erlang应用优化指南

    进行binary优化的json解析模块

    在IT行业中,优化是提升软件性能的关键步骤,特别是在处理大量数据时。本话题将深入探讨一个专注于二进制(binary)优化的JSON解析模块...对于希望提升Erlang应用性能的开发者来说,理解这些概念和技术是十分有价值的。

    介绍 Erlang binary 和 bit string 数据类型的经典文章

    随着 R12B 版本的发布,Erlang 进一步优化了 binary 构造和模式匹配的过程。这些优化包括但不限于: - **Binary Construction**:当构建 binary 对象时,Erlang 现在可以更有效地合并多个 small binaries 成为一个...

    Erlang OTP 20.1 Windows 64-bit Binary File

    Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads

    <27>erlang record

    标题中的“&lt;27&gt;erlang record”可能指的是Erlang编程语言中的Record特性,它是一种数据结构,类似于结构体或者哈希表,用于组织和操作数据。在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据...

    Erlang深度分析

    Erlang深度分析所包含的内容非常广泛,涵盖了从Erlang虚拟机的工作原理、性能优化、最佳编程实践,到最新的Erlang版本中新增特性的介绍。Erlang语言因其独特的并发模型、高效的分布式计算能力和灵活的网络编程接口,...

    erlang 深度分析

    ### Erlang深度分析知识点概述 #### 1. Erlang虚拟机(VM)分析 - **概念**: Erlang VM,也称为BEAM (Bytecode for the Erlang Abstract Machine),是Erlang语言的基础运行环境。 - **特性**: - **轻量级进程**: ...

    erlang深度分析.pdf

    BEAM是Erlang的字节码解释器,模拟器可以用于开发阶段模拟运行和测试Erlang代码,有助于调试程序和优化性能。 #### 7. 内存管理 Erlang的内存管理是非常高效的,它使用了一种特殊的垃圾回收机制来确保低延迟。了解...

    erlang25.0 windows版本

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

    erlang编程 Introducing Erlang

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

    xiandiao_erlang_Erlang课后习题_

    6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的特性进行性能优化,比如避免全局状态,利用并行计算等。 综上所述,"xiandiao"文件夹中的源码是学习Erlang编程和理解其并发特性的宝贵...

    erlang22最新下载包

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。...学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式系统时。

    erlang_win64.rar

    Erlang是一种高级编程语言,特别为并发、分布式和实时系统设计,由瑞典电信设备制造商Ericsson开发。...同时,了解Erlang的错误处理机制和调试工具,如observer和debugger,将有助于提升你的开发效率和代码质量。

    erlang 24.0版本 win64 位

    这些改进有助于提高代码质量,减少bug,并提升开发者的生产力。 Erlang的并发模型是其最独特的特性之一。在24.0版本中,可能会有对进程调度或通信机制的优化,使得并发执行更加平滑,减少了上下文切换的开销。这...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 Erlang B模型,也称为无阻塞模型,主要用于计算在给定呼叫到达率和系统容量下,系统不发生阻塞的概率。它...

    erlang 23.1 - windows

    Erlang 23.1版可能包括性能优化、bug修复以及对某些特性的增强,这些改进有助于提升RabbitMQ的整体性能和稳定性。 在使用Erlang 23.1安装RabbitMQ时,你需要确保Erlang环境已正确配置,并且版本与RabbitMQ的推荐...

    erlang_版本24.3.4.4

    - **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...

    Erlang23_3.zip

    Erlang的语法简洁明了,函数式编程风格强调无副作用的纯函数,这有助于写出易于理解和维护的代码。 总的来说,Erlang23_3版本的发布为开发者提供了在Windows 64位和Linux平台上使用Erlang的新选择,包括可能的性能...

Global site tag (gtag.js) - Google Analytics