Benchmarktools'不适用于符号

时间:2017-10-18 12:09:11

标签: julia benchmarking

简介

我有一个具有以下结构的目录

--> Report
--> Problems
    --> PE_001
        --> Julia
            PE_001.naive.jl
            PE_001.jl
        --> Benchmarks
            test_001.txt
            test_002.txt
        --> Results
    --> PE_002
     .
     .
     .
    --> PE_XXX
--> Benchmark

我正在尝试迭代所有Julia文件,并根据位于顶层目录Benchmark下的基准数据对它们进行基准测试。我不想让cd进入每个目录,并从julia命令行运行@ belapsed来单独为每个函数计时。

为了解决这个问题,我编写了以下代码,该代码应该位于上面层次结构中的benchmarks下面。但是为了说明的目的,我使它更简单。

尝试解决方案

编辑:以下代码不遵循上述层次结构。为了快速重现错误,下面的代码编写方式使得所有文件都可以放在同一目录中。

benchmark.jl

include("PE_002.jl")

using BenchmarkTools

function get_file_path(PE=1)
    current_folder = pwd()
    PE_folder = "/PE_" * lpad(string(PE),3,"0")
    dirname(pwd()) * "/Problems" * PE_folder * "/Julia"
end


function include_files(PE_dir)
    for filename in readdir(PE_dir)
        if !startswith(filename, "benchmark")
            filepath = PE_dir * "/" * filename
            @everywhere include($filepath)
        end
    end
end


function benchmark_files(PE_dir)
    for filename in readdir(PE_dir)
        if !startswith(filename, "benchmark")
            f = getfield(Main, Symbol(filename[1:end-3]))
            # Produces an error
            println(@belapsed f())
        end
    end
end

# Works
println(@belapsed PE_002())

PE_dir = pwd()
include_files(PE_dir)
benchmark_files(PE_dir)

PE_002.jl

function PE_002(limit = 4*10^6)
    a, b = 0, 2
    while b < limit
        a, b = b, 4 * b + a
    end
    div(a + b - 2, 4)
end

PE_002_naive.jl

function PE_002_naive(limit=4 * 10^6, F_1=1, F_2=2)
    total = 0
    while F_2 < limit
        if F_2 % 2 == 0
            total += F_2
        end
        F_1, F_2 = F_2, F_1 + F_2
    end
    total
end

test_001.txt

0*10**(2**0)
4*10**(2**0) 
4*10**(2**1)
4*10**(2**2)
4*10**(2**3) 
4*10**(2**4) 
4*10**(2**5) 
4*10**(2**6) 

问题

有趣的是包括文件PE_002然后运行@ belapsed,但是从目录中获取文件名,将其转换为符号,然后尝试使用@belapsed计时失败。

我知道@elapsed works但是,由于垃圾收集,它对我的​​需求来说不够准确。

是否有一种简单的方法可以使用BenchmarkTools或类似工具对远程目录中的所有文件进行基准测试?

我只需要一个代表每个文件的平均/平均运行时间的数字。

编辑2:根据请求我已经包含了

下面的完整错误消息
~/P/M/Julia-belaps ❯❯❯ julia benchmark.jl

9.495495495495496e-9
ERROR: LoadError: UndefVarError: f not defined
Stacktrace:
 [1] ##core#665() at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:290
 [2] ##sample#666(::BenchmarkTools.Parameters) at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:296
 [3] #_run#6(::Bool, ::String, ::Array{Any,1}, ::Function, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:324
 [4] (::BenchmarkTools.#kw##_run)(::Array{Any,1}, ::BenchmarkTools.#_run, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at ./<missing>:0
 [5] anonymous at ./<missing>:?
 [6] #run_result#16(::Array{Any,1}, ::Function, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:40
 [7] (::BenchmarkTools.#kw##run_result)(::Array{Any,1}, ::BenchmarkTools.#run_result, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at ./<missing>:0
 [8] #run#17(::Array{Any,1}, ::Function, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:43
 [9] (::Base.#kw##run)(::Array{Any,1}, ::Base.#run, ::BenchmarkTools.Benchmark{Symbol("##benchmark#664")}, ::BenchmarkTools.Parameters) at ./<missing>:0 (repeats 2 times)
 [10] macro expansion at /home/oisov/.julia/v0.6/BenchmarkTools/src/execution.jl:208 [inlined]
 [11] benchmark_files(::String) at /home/oisov/Programming/Misc/Julia-belaps/benchmark.jl:26
 [12] include_from_node1(::String) at ./loading.jl:569
 [13] include(::String) at ./sysimg.jl:14
 [14] process_options(::Base.JLOptions) at ./client.jl:305
 [15] _start() at ./client.jl:371
while loading /home/oisov/Programming/Misc/Julia-belaps/benchmark.jl, in expression starting on line 36

1 个答案:

答案 0 :(得分:1)

println(@belapsed f())更改为println(@belapsed $f())。我无法完全解释它,但是here is a link to the relevant part of the docs.