comparison benchmark/benchmark_utils.jl @ 1192:339cb6eacb0c tooling/benchmarks

Rename the script file
author Jonatan Werpers <jonatan@werpers.com>
date Fri, 27 Jan 2023 22:02:43 +0100
parents benchmark/run_and_view.jl@12b525cd3da6
children 5e20c0815e07
comparison
equal deleted inserted replaced
1191:12b525cd3da6 1192:339cb6eacb0c
1 import PkgBenchmark
2 import Markdown
3 import Mustache
4 import Dates
5
6 import Sbplib
7
8 const sbplib_root = splitpath(pathof(Sbplib))[1:end-2] |> joinpath
9 const results_dir = mkpath(joinpath(sbplib_root, "benchmark/results"))
10 const template_path = joinpath(sbplib_root, "benchmark/result.tmpl")
11
12 """
13 main(args...; kwargs...)
14
15 Calls `run_benchmark(args...; kwargs...)` and writes the results as an HTML file in `benchmark/results`.
16 See [`run_benchmark`](@ref) for possible arguments.
17 """
18 function main(args...; kwargs...)
19 r = run_benchmark(args...; kwargs...)
20 file_path = write_result_html(r)
21 open_in_default_browser(file_path)
22 end
23
24
25 """
26 run_benchmark()
27
28 Runs the benchmark suite for the current working directory and returns a `PkgBenchmark.BenchmarkResult`
29 """
30 function run_benchmark()
31 r = PkgBenchmark.benchmarkpkg(Sbplib)
32
33 rev = hg_id()
34
35 return add_rev_info(r, rev)
36 end
37
38 """
39 run_benchmark(rev)
40
41 Updates the repository to the given revison and runs the benchmark suite. When done, updates the repository to the origianl state.
42 `rev` can be any identifier compatible with `hg update`.
43
44 Returns a `PkgBenchmark.BenchmarkResult`
45 """
46 function run_benchmark(rev)
47 rev_before = hg_rev()
48 hg_update(rev)
49 r = run_benchmark()
50 hg_update(rev_before)
51
52 return r
53 end
54
55 """
56 run_benchmark(target, baseline, f=minimum; judgekwargs=Dict())
57
58 Runs the benchmark at revisions `target` and `baseline` and compares them using `PkgBenchmark.judge`.
59 `f` is the function used to compare. `judgekwargs` are keyword arguments passed to `judge`.
60
61 `target` and `baseline` can be any identifier compatible with `hg update`.
62
63 Returns a `PkgBenchmark.BenchmarkJudgement`
64 """
65 function run_benchmark(target, baseline, f=minimum; judgekwargs=Dict())
66 rev_before = hg_rev()
67 hg_update(target)
68 t = run_benchmark()
69 hg_update(baseline)
70 b = run_benchmark()
71 hg_update(rev_before)
72
73 return PkgBenchmark.judge(t,b,f; judgekwargs...)
74 end
75
76
77 function add_rev_info(benchmarkresult, rev)
78 return PkgBenchmark.BenchmarkResults(
79 benchmarkresult.name,
80 rev,
81 benchmarkresult.benchmarkgroup,
82 benchmarkresult.date,
83 benchmarkresult.julia_commit,
84 benchmarkresult.vinfo,
85 benchmarkresult.benchmarkconfig,
86 )
87 end
88
89
90 function write_result_html(io, r)
91 iobuffer = IOBuffer()
92 PkgBenchmark.export_markdown(iobuffer, r)
93
94 parsed_md = Markdown.parse(String(take!(iobuffer)))
95 content = Markdown.html(parsed_md)
96
97 template = Mustache.load(template_path)
98
99 dt = Dates.format(PkgBenchmark.date(r), "yyyy-mm-dd HH:MM:SS")
100 Mustache.render(io, template, Dict("title"=>dt, "content"=>content))
101 end
102
103 function write_result_html(r)
104 dt = Dates.format(PkgBenchmark.date(r), "yyyy-mm-dd HHMMSS")
105 file_path = joinpath(results_dir, dt*".html")
106
107 open(file_path, "w") do io
108 write_result_html(io, r)
109 end
110
111 return file_path
112 end
113
114
115 PkgBenchmark.date(j::PkgBenchmark.BenchmarkJudgement) = PkgBenchmark.date(PkgBenchmark.target_result(j))
116
117
118 function hg_id()
119 cmd = Cmd(`hg id`, dir=sbplib_root)
120 return readchomp(addenv(cmd, "HGPLAIN"=>""))
121 end
122
123 function hg_rev()
124 cmd = Cmd(`hg id -i`, dir=sbplib_root)
125 return readchomp(addenv(cmd, "HGPLAIN"=>""))
126 end
127
128 function hg_update(rev)
129 cmd = Cmd(`hg update --check -r $rev`, dir=sbplib_root)
130 run(addenv(cmd, "HGPLAIN"=>""))
131 end
132
133
134 # From Pluto.jl/src/webserver/WebServer.jl (2023-01-24)
135 function open_in_default_browser(url::AbstractString)::Bool
136 try
137 if Sys.isapple()
138 Base.run(`open $url`)
139 true
140 elseif Sys.iswindows() || detectwsl()
141 Base.run(`powershell.exe Start "'$url'"`)
142 true
143 elseif Sys.islinux()
144 Base.run(`xdg-open $url`)
145 true
146 else
147 false
148 end
149 catch ex
150 false
151 end
152 end
153
154
155 main
156
157 # TODO: Better logging of what is happening
158 # TODO: Improve the workflow? How?
159
160 # TODO: Clean up the HTML output?
161 # TODO: Make the codeblocks in the table look nicer
162 # TODO: Change width of tables and code blocks so everything is visible
163 # TODO: Fix the commit id, it chops off all the important info
164 # TODO: Make title less verbose
165 # TBD: Do we have to replace export_markdown? Could use a template instead.
166
167
168 # TBD: How to compare against current working directory? Possible to create a temporary commit?
169 # TBD: What parts are PkgBenchmark contributing? Can it be stripped out?