gpt4 book ai didi

time - 内置@time 宏与基准模块中的宏之间的区别

转载 作者:行者123 更新时间:2023-12-02 15:46:36 27 4
gpt4 key购买 nike

在 Julia 包 BenchmarkTools 中,有一些像 @btime、@belapse 这样的宏对我来说似乎是多余的,因为 Julia 内置了@time、@elapse 宏。在我看来,这些宏服务于相同的目的。那么@time 和@btime、@elapse 和@belapsed 之间有什么区别呢?

最佳答案

TLDR ;)

@time@elapsed 只运行一次代码并测量时间。此测量可能包括也可能不包括编译时间(取决于 @time 是第一次还是第二次运行),并且包括解析全局变量的时间。

另一方面,@btime@belapsed 执行预热,因此您知道编译时间和全局变量解析时间(如果 $ 被使用)不影响时间测量。

详情

为了进一步了解它是如何工作的,让我们使用 @macroexpand(为了便于阅读,我还删除了注释行):

julia> using MacroTools, BenchmarkTools

julia> MacroTools.striplines(@macroexpand1 @elapsed sin(x))
quote
Experimental.@force_compile
local var"#28#t0" = Base.time_ns()
sin(x)
(Base.time_ns() - var"#28#t0") / 1.0e9
end

如果 sin 没有被强制编译,第一次和后续运行时会得到不同的结果。例如:

julia> @time cos(x);
0.110512 seconds (261.97 k allocations: 12.991 MiB, 99.95% compilation time)

julia> @time cos(x);
0.000008 seconds (1 allocation: 16 bytes)

julia> @time cos(x);
0.000006 seconds (1 allocation: : 16 bytes)

@belapsed 的情况不同:

julia> MacroTools.striplines(@macroexpand @belapsed sin($x))
quote
(BenchmarkTools).time((BenchmarkTools).minimum(begin
local var"##314" = begin
BenchmarkTools.generate_benchmark_definition(Main, Symbol[], Any[], [Symbol("##x#315")], (x,), $(Expr(:copyast, :($(QuoteNode(:(sin(var"##x#315"))))))), $(Expr(:copyast, :($(QuoteNode(nothing))))), $(Expr(:copyast, :($(QuoteNode(nothing))))), BenchmarkTools.Parameters())
end
(BenchmarkTools).warmup(var"##314")
(BenchmarkTools).tune!(var"##314")
(BenchmarkTools).run(var"##314")
end)) / 1.0e9
end

可以看到取了一个最小值(代码运行了几次)。基本上大多数情况下,您应该在设计应用程序时使用 BenchmarkTools 来测量时间。

最后但并非最不重要的尝试 @benchamrk:

julia> @benchmark sin($x)
BenchmarkTools.Trial: 10000 samples with 999 evaluations.
Range (min … max): 13.714 ns … 51.151 ns ┊ GC (min … max): 0.00% … 0.00%
Time (median): 13.814 ns ┊ GC (median): 0.00%
Time (mean ± σ): 14.089 ns ± 1.121 ns ┊ GC (mean ± σ): 0.00% ± 0.00%

█▇ ▂▄ ▁▂ ▃ ▁ ▂
██▆▅██▇▅▄██▃▁▃█▄▃▁▅█▆▁▄▃▅█▅▃▁▄▇▆▁▁▁▁▁▆▄▄▁▁▃▄▇▃▁▃▁▁▁▆▅▁▁▁▆▅▅ █
13.7 ns Histogram: log(frequency) by time 20 ns <

Memory estimate: 0 bytes, allocs estimate: 0.

关于time - 内置@time 宏与基准模块中的宏之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73986570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com