benchfella, Microbenchmarking工具

分享于 

7分钟阅读

GitHub

  繁體 雙語
Benchmarking tool for Elixir
  • 源代码名称:benchfella
  • 源代码网址:http://www.github.com/alco/benchfella
  • benchfella源代码文档
  • benchfella源代码下载
  • Git URL:
    git://www.github.com/alco/benchfella.git
    Git Clone代码到本地:
    git clone http://www.github.com/alco/benchfella
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/alco/benchfella
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Benchfella

    Hex versionHex downloads

    Microbenchmarking工具。

    概述

    对于 Benchfella,可以定义小测试,它将智能地运行每个测试,以获得对每个测试的平均运行时间的更可靠的估计。

    Benchfella的主要功能:

    • 很容易编写和运行 microbenchmarks
    • 比较多个运行之间的度量
    • 多个运行的plot 结果

    如果你寻找更精细的度量,请查看使用数理统计的 bmark插件,以比较基准测试结果并判断它的可信度。

    安装

    benchfella 添加为对项目的依赖项:

    # in your mix.exsdefpdepsdo [{:benchfella, "~> 0.3.0"}]end

    这将使新任务在你的混合项目的root 目录中可用。

    只要你想快速测量代码 Fragment,就创建一个与 mix new 相关的代码,并在其中创建一个名为 bench的子目录,并将你的基准定义放在这里。 请参阅下面的示例。

    用法

    花一点时间研究运行 mix help benchmix help bench.cmp inside的输出,以查看所有支持的选项。

    为了开始写测试,添加一个名为 bench的目录,并将名为 MATCH的文件添加到它的中的Pattern *_bench.exs 中。 然后在项目的root 目录中运行 mix bench。 然后Benchfella将加载每个测试并执行它,以便尽可能多的迭代,以便总运行时间至少是指定的持续时间。

    例如:

    # bench/basic_bench.exsdefmoduleBasicBenchdouseBenchfella@listEnum.to_list(1..1000)
     bench "hello list"doEnum.reverse @listendend
    $ mix bench
    Settings:
     duration: 1.0 s## BasicBench[13:23:58] 0/1: hello list
    Finished in 3.15 seconds## BasicBenchhello list 500000 5.14 µs/op

    最后,将迭代次数和单个迭代的平均时间打印到标准输出。 此外,计算机格式的输出将写入 bench/snapshots/ 中的快照文件。

    setup_allteardown_all

    setup_all/0 让你在运行 MODULE 中的第一个测试之前执行一些代码。 它没有参数,并且应该返回 {:ok, <context>} 任何术语,如果定义了 <context>,它将被传递到 before_each_bench/1teardown_all/1。 返回任何其他值将引发错误,并导致整个 MODULE 被跳过。

    teardown_all/1 让你在 MODULE 中最后一次测试完成后进行一些清理。 它接受从 setup_all/0 ( 默认情况下为 nil ) 返回的上下文作为它的参数。

    # bench/sys_bench.exsdefmoduleSysBenchdouseBenchfella setup_all do depth =:erlang.system_flag(:backtrace_depth, 100)
     {:ok, depth}
     end teardown_all depth do:erlang.system_flag(:backtrace_depth, depth)
     end@listEnum.to_list(1..10000)
     bench "list reverse"doEnum.reverse(@list)
     endend

    before_each_benchafter_each_bench

    在执行每个单独的测试之前 before_each_bench/1 运行。 它接受从 setup_all/0 返回的上下文,应该返回 {:ok, <bench_context>}<bench_context> 是任何术语。 返回任何其他值将引发错误,并导致跳过当前测试。

    before_each_bench/1 返回的<bench_context> 在每个测试中都可以作为 bench_context 变量。

    执行每个单独的测试后 after_each_bench/1 运行。 它接受从 before_each_bench/1 返回的上下文作为它的参数。

    # bench/ets_bench.exsdefmoduleETSBenchdouseBenchfella before_each_bench _ do tid =:ets.new(:my_table, [:public])
     {:ok, tid}
     end after_each_bench tid doIO.inspect length(:ets.tab2list(tid))
     :ets.delete(tid)
     end bench "ets insert", [_unused: inspect_table(bench_context)] do tid = bench_context
     :ets.insert(tid, {:rand.uniform(1000), :x})
     :okenddefpinspect_table(tid) doIO.inspect :ets.info(tid)
     endend

    运行时间值

    如果需要在运行时生成测试的输入,而不影响测量,则可以使用 before_each_bench/1 钩子,如下所示:

    # bench/string_bench.exsdefmoduleStringBenchdouseBenchfella bench "reverse string", [str: gen_string()] doString.reverse(str)
     enddefpgen_string() doString.duplicate("abc", 10000)
     endend

    mix bench.cmp

    若要比较多个运行之间的结果,请使用 mix bench.cmp

    # Run 'mix bench' one more time.# Each run automatically saves a snapshot in bench/snapshots.$ mix bench
    ...# 'mix bench.cmp' will read the two latest snapshots by default.# You could also pass the snapshot files to compare as arguments.$ mix bench.cmp -d percent
    bench/snapshots/2015-03-26_01-17-17.snapshot vs
    bench/snapshots/2015-03-26_01-19-30.snapshot## ListBenchreverse list -10.32%## StringBenchreverse string dynamic +2.26%
    reverse string +3.33%

    mix bench.graph

    Benchfella可以生成一个HTML页面,图表提供了对从运行 mix bench 获得的原始数据的各种洞察。

    # run the benchmarks twice$ mix bench
    ...
    $ mix bench
    ...# 'mix bench.graph' works similarly to 'mix bench.cmp' except it can display# all given snapshots on one graph.$ mix bench.graph
    Wrote bench/graphs/index.html
    $ open bench/graphs/index.html

    Graph example

    许可证

    这个软件是在许可下的许可证。


    相关文章