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

leex文法分析的效率

阅读更多
R13B新添加的leex相当于c的lex, 在做文法分析非常方便,但是效率如何呢? leex的example里面带了个erlang_scan和erlang标准的发布版的erl_scan兼容,所以我们来对比测试下效率。

注意用R13B03,因为R13B02的erlc漏掉了编译xrl格式。

以下是实验:

root@nd-desktop:~# git clone git://github.com/rvirding/leex.git
root@nd-desktop:~# cd leex/examples/
root@nd-desktop:~/leex/examples# cat test_scan.erl
-module(test_scan).
-export([start/1]).
start([A])->
    {ok, F} = file:open(atom_to_list(?MODULE)++".erl", [read]),
    {ok, S} = file:read(F, 9999999),
    file:close(F),
    N = list_to_integer(A),
    test(N, fun erlang_scan:string/1, S, "erlang_scan"),
    test(N, fun erl_scan:string/1, S, "erl_scan"),
    ok.

test(N, F, S, Ts)->
    Start = erlang:now(),   
    dotimes(N, fun (_) ->
                       F(S)
               end),
    io:format("~s run ~w ms~n", [Ts,round(timer:now_diff(now(), Start) /1000)]).

dotimes(0, _) -> done;
dotimes(N, F) ->
    F(N),
    dotimes(N - 1, F).

root@nd-desktop:~/leex/examples# erlc erlang_scan.xrl
root@nd-desktop:~/leex/examples# ls *.erl
erlang_scan.erl  test_scan.erl
root@nd-desktop:~/leex/examples# erlc *.erl
root@nd-desktop:~/leex/examples# erl -noshell -run test_scan start 10000 -s erlang halt
erlang_scan run 2208 ms
erl_scan run 1181 ms

%% 这个版本稍微慢点

root@nd-desktop:~/leex/examples# erlc +native *.erl
root@nd-desktop:~/leex/examples# erl -noshell -run test_scan start 10000 -s erlang halt
erlang_scan run 1292 ms
erl_scan run 1238 ms

结论是: leex产生的代码和手写的效率几乎差不多。
分享到:
评论

相关推荐

    prometheus-rule-parser:leex + yecc(Erlang的lex + yacc)

    erl> leex:file(rules). erl> c(rules). erl> {ok, Tokens, _} = rules:string("ALERT MyAlert FOR 5m") LABELS { sev=\"warn\", team=\"sre\" }"). erl> yecc:file(rules_parser). erl> c(rules_...

    example_json_parser:有关Elixir中leex和yecc的示例项目

    `leex`是Elixir中的词法分析器(lexer)生成器,基于Flex开源词法分析器。它的主要任务是将输入源代码分解成一系列有意义的标记(tokens)。在JSON解析过程中,`leex`会识别并提取出如字符串、数字、大括号、方括号...

    calx:使用leex&yecc的小型Elixir项目,以Lisp样式表示法实现计算器

    它是用“真实的”词法分析器和解析器生成器实现的,目的是在柏林Erlang用户组中进行一个不错的演示。用法如果已安装Elixir,请使用mix compile编译项目。 如果没有Elixir,请按照让我们尝试一下计算器! $ iex -S ...

    matplotlib实现显示伪彩色图像及色度条

    img = plt.imread('C:/Users/leex/Desktop/lena.jpg') img_s = img[:,:,0]# 直接读入的img为3通道,这里用直接赋值的方法转为单通道 sc = plt.imshow(img_s) sc.set_cmap('hot')# 这里可以设置多种模式 plt.colorbar...

    erlang-examples-2.0.pdf

    此外,文档还提到了“Parser Tutorial”,这部分内容应该涉及解析技术,例如使用yecc(一个Erlang编译器的Yacc工具)和leex(Erlang编译器的Lex工具)来构建解析器。这里我们可以了解到语法分析和构建解析树的基本...

    Flamekit:使用用于VSCode的Flamekit Phoenix Framework开发扩展更快地构建网站

    ********** 还没做完 ************* 火焰套件 借助用于VSCode的Flamekit Phoenix Framework开发扩展,... 工作区文件路径: lib/example_web/live/helloworld.html.leex 将片段添加到新文件 档案内容: <div clas

    vim-elixir:Elixir的Vim配置文件

    .ex , .exs , .eex , .leex和.sface文件的文件类型检测 自动缩进 Ecto项目与之间的集成,可在已定义的Ecto存储库上运行SQL查询 安装 vim-elixir可以通过插件管理器安装,也可以通过将文件直接复制到vim文件夹中来...

    详解Python list和numpy array的存储和读取方法

    label_path = 'C:/Users/leex/Desktop/label.txt' file = open(label_path, 'r') label = [int(x.strip()) for x in file] file.close() ``` 如果标签是one-hot编码(如[0, 1]表示第一类),可以使用`numpy`的`...

    syntaxerl:Erlang的语法检查器

    语法检查器当前支持erlang源文件(.erl),erlang头文件(.hrl),erlang配置(.config,.rel,.script,.app,.app.src),escript文件(.erl,.escript) ,.es),leex文件(.xrl)和yecc文件(.yrl)。...

Global site tag (gtag.js) - Google Analytics