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个字符
oo
ps\r
\nso
met
hin
g m
ayb
e w
ron
g!
跳过2个字符的原因,应该是由于前面的函数
dame_shit(<<Tag:
2/bytes, T/binary>>, Tag, not_found) ->
中的2bytes引起。
分享到:
相关推荐
erlang提供了binary_to_term 函数,用于把二进制数据转为原始的erlang数据。这个函数都是c实现的,这里用erlang语言实现了,很有参考价值,其他语言可以参考这个解析erlang二进制协议数据。配套文章地址...
Erlang应用优化指南 Erlang应用优化指南
在IT行业中,优化是提升软件性能的关键步骤,特别是在处理大量数据时。本话题将深入探讨一个专注于二进制(binary)优化的JSON解析模块...对于希望提升Erlang应用性能的开发者来说,理解这些概念和技术是十分有价值的。
随着 R12B 版本的发布,Erlang 进一步优化了 binary 构造和模式匹配的过程。这些优化包括但不限于: - **Binary Construction**:当构建 binary 对象时,Erlang 现在可以更有效地合并多个 small binaries 成为一个...
Erlang OTP 20.1 Windows 64-bit Binary File 下载地址:http://www.erlang.org/downloads
标题中的“<27>erlang record”可能指的是Erlang编程语言中的Record特性,它是一种数据结构,类似于结构体或者哈希表,用于组织和操作数据。在Erlang中,Record提供了一种方便的方式来定义和访问具有固定字段的数据...
Erlang深度分析所包含的内容非常广泛,涵盖了从Erlang虚拟机的工作原理、性能优化、最佳编程实践,到最新的Erlang版本中新增特性的介绍。Erlang语言因其独特的并发模型、高效的分布式计算能力和灵活的网络编程接口,...
### Erlang深度分析知识点概述 #### 1. Erlang虚拟机(VM)分析 - **概念**: Erlang VM,也称为BEAM (Bytecode for the Erlang Abstract Machine),是Erlang语言的基础运行环境。 - **特性**: - **轻量级进程**: ...
BEAM是Erlang的字节码解释器,模拟器可以用于开发阶段模拟运行和测试Erlang代码,有助于调试程序和优化性能。 #### 7. 内存管理 Erlang的内存管理是非常高效的,它使用了一种特殊的垃圾回收机制来确保低延迟。了解...
6. **编译器升级**:Erlang的BEAM虚拟机和编译器可能会有优化,使得编译速度更快,生成的代码更高效。 作为“源码软件”,Erlang 25.0同样提供了源代码,开发者可以深入研究其内部工作原理,进行定制化开发,或者为...
**Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...
6. **性能优化**:通过解决实际问题,学习者可以学习到如何有效地利用Erlang的特性进行性能优化,比如避免全局状态,利用并行计算等。 综上所述,"xiandiao"文件夹中的源码是学习Erlang编程和理解其并发特性的宝贵...
Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。...学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式系统时。
Erlang是一种高级编程语言,特别为并发、分布式和实时系统设计,由瑞典电信设备制造商Ericsson开发。...同时,了解Erlang的错误处理机制和调试工具,如observer和debugger,将有助于提升你的开发效率和代码质量。
这些改进有助于提高代码质量,减少bug,并提升开发者的生产力。 Erlang的并发模型是其最独特的特性之一。在24.0版本中,可能会有对进程调度或通信机制的优化,使得并发执行更加平滑,减少了上下文切换的开销。这...
Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...
这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 Erlang B模型,也称为无阻塞模型,主要用于计算在给定呼叫到达率和系统容量下,系统不发生阻塞的概率。它...
Erlang 23.1版可能包括性能优化、bug修复以及对某些特性的增强,这些改进有助于提升RabbitMQ的整体性能和稳定性。 在使用Erlang 23.1安装RabbitMQ时,你需要确保Erlang环境已正确配置,并且版本与RabbitMQ的推荐...
- **错误处理**:Erlang采用异常处理机制,鼓励编写无副作用的纯函数,有助于编写容错性强的代码。 - **模式匹配**:Erlang的模式匹配功能允许在函数定义中使用模式来匹配和解构数据结构,简化了代码编写。 - **...
Erlang的语法简洁明了,函数式编程风格强调无副作用的纯函数,这有助于写出易于理解和维护的代码。 总的来说,Erlang23_3版本的发布为开发者提供了在Windows 64位和Linux平台上使用Erlang的新选择,包括可能的性能...