macros - Julia 中基准和时间宏的区别

标签 macros julia microbenchmark

我最近发现两个宏之间存在巨大差异:@benchmark 和 @time 在内存分配信息和时间方面。例如:

@benchmark quadgk(x -> x, 0., 1.)
BenchmarkTools.Trial: 
memory estimate:  560 bytes
allocs estimate:  17
--------------
minimum time:     575.890 ns (0.00% GC)
median time:      595.049 ns (0.00% GC)
mean time:        787.248 ns (22.15% GC)
maximum time:     41.578 μs (97.60% GC)
--------------
samples:          10000
evals/sample:     182

@time quadgk(x -> x, 0., 1.)
0.234635 seconds (175.02 k allocations: 9.000 MiB)
(0.5, 0.0)

为什么这两个例子有很大的不同?

最佳答案

原因是预编译开销。要查看此定义:

julia> h() = quadgk(x -> x, 0., 1.)
h (generic function with 1 method)

julia> @time h()
  1.151921 seconds (915.60 k allocations: 48.166 MiB, 1.64% gc time)
(0.5, 0.0)

julia> @time h()
  0.000013 seconds (21 allocations: 720 bytes)
(0.5, 0.0)

相反
julia> @time quadgk(x -> x, 0., 1.)
  0.312454 seconds (217.94 k allocations: 11.158 MiB, 2.37% gc time)
(0.5, 0.0)

julia> @time quadgk(x -> x, 0., 1.)
  0.279686 seconds (180.17 k allocations: 9.234 MiB)
(0.5, 0.0)

这里发生的是,在第一次调用中,将quadgk包装在一个函数中,匿名函数x->x仅定义一次,因为它被包装在一个函数,因此 quadgk 仅编译一次。在第二次调用中,每次调用都会重新定义 x->x,因此每次都必须执行编译。

现在的关键点是 BenchmarkTools.jl 将您的代码包装在一个函数中,您可以通过检查 generate_benchmark_definition 函数在此包中的工作方式来检查该函数,因此它相当于上面介绍的第一种方法.

在不重新定义优化函数的情况下运行代码的另一种方法是:

julia> g(x) = x
g (generic function with 1 method)

julia> @time quadgk(g, 0., 1.)
  1.184723 seconds (951.18 k allocations: 49.977 MiB, 1.58% gc time)
(0.5, 0.0)

julia> @time quadgk(g, 0., 1.)
  0.000020 seconds (23 allocations: 752 bytes)
(0.5, 0.0)

(尽管这不是 BenchmarkTools.jl 所做的 - 我添加它是为了表明当您使用函数 g 时,您不需要支付两次预编译税)

关于macros - Julia 中基准和时间宏的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51102221/

相关文章:

julia - 复制数组列

c - 内存的微观基准

objective-c - Swift RC4 与 Objective-C RC4 性能对比

macros - Julia:如何在函数内创建与输入变量匹配的符号?

c - 如何快速确定我的代码使用了哪些宏?

vba - 在 Excel 2010 中查找和替换而不丢失单元格格式 - 无法在包含 255 个字符的单元格上运行

multithreading - Julia 1.5.2性能问题

python - python 中的宏

graph - 如何在 JULIA 中使用 GADFLY 实现直方图绘制的精度

java - 第一次 Java 循环运行缓慢,为什么? [Sun 热点 1.5,sparc]