`
derlang
  • 浏览: 35054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Erlang的基准测试

阅读更多
需要测试Erlang系统各个方面的性能。

  • 进程创建和并发能力
  • 大数据量的消息传输


queue_test() ->
    Q = queue:new(),
    Q1 = queue:in(1),
    Q2 = queue:in(2),
    ok.

-record(node_info, {
        var      = 0,
        name,
        selected = 0,
        disks    = []
    }).

disk_test() ->
    L = [
        #node_info{name="node1", disks=[1,2,3,4]},
        #node_info{name="node2", disks=[1,2]},
        #node_info{name="node3", disks=[1,2]}
    ],
    disk_get(L, 0).

move_head_to_tail([H|T]) -> T ++ [H];
move_head_to_tail([]) -> [].

disk_total(L) ->
    lists:sum([length(D) || #node_info{disks=D} <- L]).

disk_max([]) ->
    undifined;
disk_max(L) ->
    [H|_] = lists:keysort(2, L),
    H.

disk_get(L, Total) ->
    io:format("------------------------------------------~n"),
    receive
    after 1000 ->
        R = disk_get_n(L, Total, 2, []),
        io:format("Selected ~p~n", [element(1, R)]),
        disk_get(element(2, R), element(3, R))
    end.

disk_get_n(L, Total, 0, Acc) ->
    {Acc, L, Total};
disk_get_n(L, Total, N, Acc) ->
    Disks = disk_total(L),
    if
        Total =/= 0 ->
            L1 = [X#node_info{var=S/Total - length(D)/Disks} ||
                #node_info{selected=S, disks=D} = X <- L];
        true ->
            L1 = L
    end,
    #node_info{name=Name, selected=S, disks=D} = H = disk_max(L1),
    L2 = lists:keyreplace(Name, 3, L1, H#node_info{selected=S+1,
            disks=move_head_to_tail(D)}),
    disk_get_n(L2, Total+1, N-1, Acc ++ [H]).


问题:

因为变量的单次赋值原则,上述代码中不能对Q进行in-place修改。Q,Q1,Q2实现的效率如何?每次插入一元素,都要copy一份全新的数据结构出来吗?

所有的数据结构都面临这个问题。不过,ets可以通过id or name进行更新。


类似的还有函数参数的传值方式,对大的结构效率如何?

在if clause中,L1=L为何必要?在分支的时候为了保证变量的安全性,在引入新的变量的时候,所有的分支都要正确的处理,在后面才能对新变量进行操作。关键是,L1=L的效率,是整个list的copy吗?还有,这种处理手法,毕竟有点别扭。

record的用法:用模式匹配提取字段比较好用。H#node_info.name这种用法别扭,代码过长。编译器知道H的实际类型,为何还要我们指明?换成H.name就方便的多了。或者H@name,哈哈都行呀。
分享到:
评论

相关推荐

    berk:Erlang 的基准测试库

    **伯克:Erlang基准测试库** 伯克(Berk)是一个专为Erlang编程语言设计的基准测试库。Erlang是一种强大的并行计算和分布式系统开发语言,以其在高可用性、容错性和实时性方面的优势而闻名。伯克库的出现,旨在帮助...

    eMQTT-Bench是一个用 Erlang 编写的轻量级 MQTT v5.0 基准测试工具

    eMQTT-Bench是针对MQTT v5.0版本的一个基准测试工具,由Erlang编程语言编写。Erlang是一种并发性极强、适合构建分布式系统的语言,因其在实时系统和容错性方面的优势而常被用于构建高可用性的网络服务,比如消息...

    rustler编写erlang nif

    - 谈论如何评估NIF的性能,并可能涉及一些基准测试。 - 提供了一些调试NIF的技巧,比如使用`erl_nif_trace`和日志记录。 通过学习Rustler编写Erlang NIF,开发者可以充分利用Rust的安全性和高性能,同时保持...

    Erlang_to_C

    - **基准测试**:研究者们通过对一系列典型的Erlang程序进行基准测试,比较了Turbo Erlang与原生Erlang、以及其他编译为目标平台的C代码之间的性能差异。 - **结果分析**:初步的结果表明,Turbo Erlang的性能与高度...

    emqtt-bench:Erlang MQTT v5.0基准测试工具

    Erlang MQTT基准测试工具 emqtt_bench是用Erlang编写的简单MQTT v5.0基准测试工具。 需要构建Erlang / OTP R21.2 +。 先建 make 连接基准 $ ./emqtt_bench conn --help Usage: emqtt_bench conn [--help &lt; help&gt; ] ...

    httpcbench:Erlang HTTP 客户端基准测试

    httpcbench Erlang HTTP 客户端基准测试当前测试尝试创建 1000 个到本地服务器的并发 https 连接,该连接在 10 毫秒后响应。结果结果显示了 100 次迭代(100,000 个连接)的结果。 客户运行挂钟内存失败hackney...

    Erlang学习资料

    - **性能测试**:通过对Erlang程序进行基准测试,可以直观地看到多核环境下程序的执行效率。这些测试结果可以帮助开发者了解Erlang在不同场景下的性能表现,从而更好地优化代码。 #### 四、多核编程中的测试与调试...

    bench_util:Erlang的基准测试实用程序功能的集合

    Erlang 的基准实用函数集合。 例子 % % collect system statistics &gt; bench_util : stat (). [{ context_switch_count , 438816 }, { gc_count , 169988 }, { gc_bytes , 6050455640 }, { input_bytes , ...

    horsetheperfs:erlang的微型基准

    Horse the Perfs是微基准测试的基础架构。 它为新的微基准测试提供了测试运行程序,计时和日志记录,因此它们可以高效地编写并以可重复的方式运行。 最后,它是一组微型基准测试,可以针对新的硬件和VM目标重新运行...

    Erlang--性能分析工具之eprof

    在实际使用中,我们还需要结合代码审查、单元测试以及性能基准测试等方法,确保优化措施的有效性。 总之,eprof是Erlang开发者必备的性能分析工具,它能够帮助我们找出代码中的性能问题,提升Erlang应用的运行效率...

    erljson_bench:Erlang JSON库的基准测试

    erljson_bench 用于比较各种JSON编码/解码库的脚本图书馆比较ejson 瞬间json jsonx jsx mochijson2要求要执行这些基准测试,路径上必须有一个有效的erlang(erl和escript)。建立和运行要下载依赖项并进行编译: ...

    vmq_bench:基于Erlang的MQTT基准测试

    vmq_bench-简单的MQTT基准 安装 ./rebar get-deps ./rebar compile 运行基准 erl -pa ebin -pa deps/*/ebin -s vmq_bench -scenario sample.scenario 编写方案文件 去做! 生成图 确保您已安装R ./plot.r 这将产生...

    EdpBench:Erlang 分布式协议 (EDP) 基准

    基准为了运行这个基准测试,你需要在你的机器上安装 Erlang、Java 和 Gnu Make。 将此 repo 克隆到您的机器中将 {message_count} 和 {message_size} 替换为您的 benchmakr 参数和在其根目录执行make MC={message_...

    A Study of Erlang ETS Table

    这些基准测试的结果提供了对不同数据结构在Erlang ETS中的表现进行深入分析的基础。 #### 数据结构简介 1. **AVL平衡二叉树**:是一种自平衡的二叉查找树,能够在添加或删除操作后自动保持平衡状态,从而确保查找...

    bencherl:ErlangOTP 的可扩展性基准套件

    $ make ui如果您移动 bencherl 文件夹,则必须再次构建 Web 界面: $ make clean-ui$ make ui如何运行基准测试套件在conf/run.conf指定要运行的内容和方式,然后使用bencherl运行基准测试套件。 $ ./bencherl如何为...

    eartc:Erlang接口到近似重放跟踪编译器

    伯爵eartc是近似重播-跟踪编译器的简单Erlang端口/ cmdline接口,该工具用于I / O基准测试和重播strace日志。 导出的函数是init_listing / 1(用于geninit阶段),trace / 1(用于运行strace-artc),compile / 1...

    erlbench:Erlang性能测量

    通过对Erlang虚拟机和各种数据结构的基准测试,我们可以优化代码,提高系统效率,尤其是在处理大规模并发任务时。掌握`erlbench` 的使用和结果分析,对于提升Erlang应用程序的性能和稳定性具有重要意义。

    cd:持续交付ErlangOTP工件

    总结来说,这个项目致力于通过持续交付机制,提供Erlang OTP的最新文档、基准测试结果和测试报告,以支持开发者进行高效、可靠的软件开发。这不仅有助于提高开发效率,还能确保代码质量,降低维护成本,从而增强整个...

    redo:流水线的Erlang Redis客户端

    Redo是用Erlang编写的流水线Redis客户端。 它缺乏任何形式的语法糖。 唯一的API函数是redo:cmd,它接受原始的redis命令。 建造 $ make 测试 单元测试 $ ./rebar eunit suite=redo 本地阅读基准 $ erl -pa ebin 1&gt; ...

    basho_bench:一种负载生成和测试工具,基本上可以为您编写返回的Erlang函数

    它最初是为了对Riak进行基准测试而开发的,它公开了可插拔的驱动程序接口,并已扩展为在各种项目中用作基准测试工具。 Basho Bench专注于两个绩效指标: 吞吐量:在一个时间范围内执行的操作数,跨所有操作类型...

Global site tag (gtag.js) - Google Analytics