Julia中基准测试和时间宏之间的区别

基里尔沙皇。

我最近发现两个宏之间的巨大差异:@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)

为什么这两个示例之间有很大差异?

BogumiłKamiński

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

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您不必两次支付预编译税)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基准测试和性能分析之间的区别

riscv 基准测试中与 vvadd 和 mt-vvadd 的区别

Java:宏观和微观基准之间的区别

基准测试和工作负载概念之间有什么区别?

基准测试和处理时间结果的差异

gnuplot:宏处理中脚本和交互模式之间的区别

在julia中抛出错误和返回错误之间的区别

在 Bash 中对内存和时间进行基准测试的错误自制代码

Django测试中TestCase和TransactionTestCase类之间的区别

气流中“气流运行”和“气流测试”之间的区别

集成测试中MockMvc和RestTemplate之间的区别

测试容器中StartupCheckStrategy和WaitStrategy之间的区别

在Julia中对数组的条件赋值进行基准测试

在Java中时间模式“YY”和“YY”之间的区别

JS和QTDatetime中的Unix时间戳转换之间的区别?

验收测试和功能测试之间的区别?

功能测试和集成测试之间的区别

Golang:在消息包和JSON之间解析基准测试

随机测试和随机测试中随机测试状态之间的区别?

Python和Julia卷积之间的区别?

宏中“做{...}时(0)”和“ {...}((无效)0)”之间的实际区别?

循环宏中的“ for”和“ as”关键字之间有什么区别吗?

Visual Studio中的_WIN64和TARGET_X64宏之间的特定区别

Android Instrumentation测试和Android Studio中的单元测试之间的区别?

iTunes Testflight beta测试中内部和外部测试人员之间的区别?

在Python3中使用单元测试和正常进行测试之间的区别

验收测试和验证之间的区别?

CUDA中的矩阵向量乘法:基准测试和性能

内联和通过宏包含源代码之间的区别