【发布时间】:2020-02-25 04:39:27
【问题描述】:
我的代码做了什么
我们的目标是构建一个函数,该函数使用 julia 检查给定字符串中的所有括号是否正确打开和关闭。所以,
"{abc()([[def]])()}"
应该返回 true,而类似
"{(bracket order mixed up here!})[and this bracket doesn't close!"
应该返回 false。
问题
我有两个版本的函数。 为什么版本 I 快了 10% 左右?
第一版
function matching_brackets_old(s::AbstractString)
close_open_map = Dict('}' => '{', ')' => '(', ']' => '[')
order_arr = []
for char in s
if char in values(close_open_map)
push!(order_arr, char)
elseif (char in keys(close_open_map)) &&
(isempty(order_arr) || (close_open_map[char] != pop!(order_arr)))
return false
end
end
return isempty(order_arr)
end
第二版
这里我将 for 循环替换为 do 块:
function matching_brackets(s::AbstractString)
close_open_map = Dict('}' => '{', ')' => '(', ']' => '[')
order_arr = []
all_correct = all(s) do char
if char in values(close_open_map)
push!(order_arr, char)
elseif (char in keys(close_open_map)) &&
(isempty(order_arr) || (close_open_map[char] != pop!(order_arr)))
return false
end
return true
end
return all_correct && isempty(order_arr)
end
时间
对字符串 "{()()[()]()}" 和 "{()()[())]()}" 使用 BenchmarkTools 的 @benchmark,在比较最短执行时间时,这两个字符串的速度都降低了大约 10%。
附加信息
版本信息:
Julia Version 1.3.1
Commit 2d5741174c (2019-12-30 21:36 UTC)
Platform Info:
OS: macOS (x86_64-apple-darwin18.6.0)
CPU: Intel(R) Core(TM) i5-4260U CPU @ 1.40GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-6.0.1 (ORCJIT, haswell)
计时码:
using BenchmarkTools
benchmark_strings = ["{()()[()]()}", "{()()[())]()}"]
for s in benchmark_strings
b_old = @benchmark matching_brackets_old("$s") samples=100000 seconds=30
b_new = @benchmark matching_brackets("$s") samples=100000 seconds=30
println("For String=", s)
println(b_old)
println(b_new)
println(judge(minimum(b_new), minimum(b_old)))
println("Result: ", matching_brackets(s))
end
有结果:
For String={()()[()]()}
Trial(8.177 μs)
Trial(9.197 μs)
TrialJudgement(+12.48% => regression)
Result: true
For String={()()[())]()}
Trial(8.197 μs)
Trial(9.202 μs)
TrialJudgement(+12.27% => regression)
Result: false
编辑
正如 François Févotte 建议的那样,我混淆了审判判决的顺序,所以版本 I 更快。我的问题仍然存在:为什么?
【问题讨论】:
-
由于这是一个有效的实现,我建议您也可以在CodeReview 上询问此代码以获得更多反馈。
-
@phipsgabler:关于 why 一个版本更快的细节问题对于 SO 来说是完美的主题(只要它包含有关测试设置的详细信息,包括编译器版本/选项和硬件)。关于此代码的 CR 问题可能是要求就其是否高效(以及编写良好)提供反馈,而不是试图解释现有的性能差异。
-
@PeterCordes 绝对,我并不是说这不是主题。我只是建议它,因为代码正在运行,并且我想提供更多反馈,这反过来不会在 SO 上给出一个好的答案,而是在 CR 上。
标签: performance julia benchmarking