何时在基准测试表达式中进行插值

2024-02-29

The 基准测试工具文档建议将全局变量插入基准测试表达式中。然而,他们提供的示例的运行时间差距似乎已经大大缩小。在他们的例子 https://github.com/JuliaCI/BenchmarkTools.jl/blob/master/doc/manual.md#interpolating-values-into-benchmark-expressions,他们有一个全局变量A = rand(1000),并且他们比较@benchmark [i*i for i in A] to @benchmark [i*i for i in $A],并得到13.806 μs versus 1.348 μs, 分别。但是,当我现在运行该示例时,运行时间非常接近:

julia> using Statistics, BenchmarkTools

julia> A = rand(1000);

julia> median(@benchmark [i*i for i in A])
BenchmarkTools.TrialEstimate: 
  time:             892.821 ns
  gctime:           0.000 ns (0.00%)
  memory:           7.95 KiB
  allocs:           2

julia> median(@benchmark [i*i for i in $A])
BenchmarkTools.TrialEstimate: 
  time:             836.075 ns
  gctime:           0.000 ns (0.00%)
  memory:           7.95 KiB
  allocs:           2

这是我的版本信息:

julia> versioninfo()
Julia Version 1.1.1
Commit 55e36cc (2019-05-16 04:10 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin15.6.0)
  CPU: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, skylake)

基准中的插值仍然有必要吗?知道为什么现在运行时间如此相似吗?谁能提供一个不同的示例,其中运行时间的差异远大于一?


BenchmarkTools 正在与编译器进行军备竞赛——在多个方面!

两个表达式之间的差异相当于这两个函数之间的差异:

# @benchmark [i*i for i in A]
f1() = [i*i for i in A]

# @benchmark [i*i for i in $A]
f2(X) = [i*i for i in X]

换句话说,使用$将值视为argument而不是硬编码常量或全局常量。自从A是全局的但不是常数,f1() is 类型不稳定。当然,Julia 在处理类型不稳定性方面已经做得越来越好,而且看来这是您不再为此付出代价的另一个地方。

有时不使用$实际上会给出令人难以置信的快速结果,因为 Julia 会对值进行硬编码,并且可能会进行某种常量传播过度专业化根据您正在基准测试的确切值。这是一个显示两个方向的示例

julia> x = 0.5; # non-constant global

julia> @btime sin(x);
  20.106 ns (1 allocation: 16 bytes)

julia> @btime sin($x);
  5.413 ns (0 allocations: 0 bytes)

julia> @btime sin(0.5); # constant literal!
  1.818 ns (0 allocations: 0 bytes)

julia> @btime sin($0.5);
  5.416 ns (0 allocations: 0 bytes)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

何时在基准测试表达式中进行插值 的相关文章

  • 如何在 Julia 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 相当于 Python 中 Julia 中的“with”?

    Julia 有与 Python 相当的东西吗 with 也许作为一个宏 这非常有用 例如 自动关闭打开的文件 Use a do堵塞 关于 do 块的文档是here https en wikibooks org wiki Introducin
  • 带有 varargs 的 Julia @evalpoly 宏

    我正在尝试使用 Julia 的 evalpoly宏 当我手动提供系数时它可以工作 但我一直无法弄清楚如何通过数组提供这些系数 julia gt VERSION v 0 3 5 julia gt evalpoly 0 5 1 2 3 4 3
  • Julia 似乎没有使用字符串来执行插值

    官方文档指出 连接和字符串插值调用string 将对象转换为字符串形式 然而 以下最小工作示例似乎证明了其他情况 type MyType x Int end import Base string Base string m MyType w
  • 离散连续概率分布

    认识到这可能是一个统计问题和编码问题 假设我使用 Distributions jl 创建了一个正态分布 using Distributions mydist Normal 0 0 2 有没有一种好的 直接的方法可以离散化这样的分布以获得 P
  • 埃拉托斯特尼筛法速度比较:Python 与 Julia

    所以我有一个用 Python 和 Julia 编写的 Eratosthenes 函数的小筛子 并且我正在比较运行时间 这是Python代码 import time def get primes n numbers set range n 1
  • Julia 中 @with_kw 和 Base.@kwdef 之间的区别?

    受到这个问题评论的启发 with kw 在 Julia 中做什么 https stackoverflow com questions 69586136 what does with kw do in julia 有什么区别 with kw
  • 具有单变量优化的 NLopt

    任何人都知道 NLopt 是否适用于单变量优化 尝试运行以下代码 using NLopt function myfunc x grad x 2 end opt Opt LD MMA 1 min objective opt myfunc mi
  • 如何在 Julia 中创建一个数组?

    在许多机器学习用例中 您需要创建一个充满 1 且具有特定维度的数组 在Python中 我会使用np ones 2 1 Julia 中的模拟版本是什么 朱莉娅有一个内置的ones可以使用如下函数 julia gt ones 1 2 1 2 M
  • 使用 Julia 的 Debugger.jl - 如何进入类似于 Python 的 pdb.set_trace() 或 ipdb.set_trace() 的调试模式?

    Julia 的新 Debugger jl 很棒 但有时要达到我想要达到的代码中的确切位置有点痛苦 有没有办法可以进入交互式调试模式 类似于 Python 在 pdb set trace 或 ipdb set trace 中的模式 例如 我希
  • Julia:如何使用 PyPlot 创建不同大小的子图?

    我想创建一个包含多个绘图的图形 不过我希望能够使每个图具有不同的大小 例如 我希望第一个子图的宽度大约是第二个子图的两倍 我希望做这样的事情 using PyPlot a rand 500 900 b rand 500 400 notice
  • 为什么 Julia 中的“where”语法对换行符敏感?

    在 Stack Overflow 上的另一个问题中 答案包括以下函数 julia gt function nzcols b SubArray T 2 P Tuple UnitRange Int64 UnitRange Int64 where
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • Julia:将数组数组转换为二维数组

    我有一个数组d包含一个浮点数组 julia gt d 99 element Array Array Float64 1 1 我正在尝试将其转换为二维数组 并且我成功地实现了我的目标 data Array Float64 length d l
  • 如何在 Julia 中进行两个变量数值积分?

    我可以使用 Julia 在 Julia 中进行单变量数值积分quadgk 一些简单的例子 julia gt f x cos x f generic function with 1 method julia gt quadgk f 0 pi
  • 在 Julia 中保存和检索字典的正确方法是什么?

    我已经看到 Julia 充分解释了 MAT 文件 这些文件中的结构可以毫无问题地作为字典读取 现在我创建了自己的字典 其结构如下 String String gt Int Int Int 在每个条目上 我可以保存它writedlm它产生了一
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • Julia 中的 Refs 和 Broadcasting 之间有什么联系

    对于两个对象A and B我们之前可以得到向量 A A A B 与代码A A B 从 Julia 0 7 中的弃用警告来看 执行此操作的新方法似乎是使用第一个 A 的引用 所以它变成Ref A A B 参考文献和广播操作之间似乎没有很强的联
  • 从 Julia 更新 C 结构体的字段值

    我的问题很简单 但我不知道最好的方法 或者 Julia 目前没有提供这样的方法 如何从 Julia 设置 C 结构的字段值 假设您有一个结构类型来表示 C 库中树的节点 typedef struct node s int type node
  • 调试 Julia v.0.6

    我克隆了一个存储库 https github com XiaojingGeorgeZhang OBCA tree master AutonomousParking在 Julia 0 5 和 0 6 中进行了测试 我之前使用的是最新的 Jul

随机推荐

  • 计算一个字符串在另一个字符串中出现的次数 (Perl)

    计算某个字符串在较大字符串中出现的次数的最快方法是什么 我最好的猜测是将该字符串的所有实例替换为空 计算长度差并除以子字符串的长度 但这似乎相当慢 而且我需要分析大量数据 您可以捕获字符串 然后对它们进行计数 可以通过将列表上下文应用于捕获
  • 为什么我在使用 Rspec 和 Capybara 编写测试用例时无法获取 current_user

    我必须为我的一个功能列表页面编写集成测试用例 并且该功能索引方法具有如下代码 def index food categories current user food categories end 现在 当我尝试为此编写测试用例时 它会抛出错
  • 如何使用反应式扩展通过最大窗口大小来限制事件?

    Scenario 我正在构建一个 UI 应用程序 每隔几毫秒从后端服务获取通知 一旦收到新的通知 我想尽快更新用户界面 由于我可以在短时间内收到大量通知 并且我总是只关心最新的事件 因此我使用风门 反应式扩展框架的方法 这使我可以忽略紧接着
  • Terraform、AWS RDS aurora mysql 无服务器异常“找不到源集群”

    我正在尝试通过引用第一个集群的还原时间点来创建一个新集群和另一个集群 对于第一个 tfvar 块 它将创建一个新的 aurora mysql 集群 aurora cluster mysql serverless 在第二个 tfvar 块中
  • Clojure let 与 Common Lisp let

    在 Common Lisp 中 let使用绑定列表 即 let var1 1 var2 2 虽然 Clojure 使用向量来代替 let a 1 b 2 除了可读性之外 Clojure 使用向量还有什么具体原因吗 您可以在以下位置找到 Ri
  • 在另一个指令内渲染指令(在转发器模板内)

    我试图在另一个指令中渲染一个指令 不确定模板内的转发器是否正在工作 它似乎只是作为文本输出而不是编译该指令 此处的plunker代码 http plnkr co edit IRsNK9 http plnkr co edit IRsNK9 关
  • 有没有办法用异或翻转32位浮点数的符号位?

    我正在尝试翻转 xmm0 内部最低有效浮点数的符号位 我尝试将 0 转换为另一个 xmm 寄存器 并将其与 xmm0 进行异或 不幸的是 尽管我的浮动值已经消失 但我已经实现了翻转标志 有没有办法使用xorps在asm中为了翻转符号位 我还
  • 独立 Jython:导入错误 (Apache-POI)

    当我尝试将 Jython 与 Apache POI 一起使用时 Jython 独立 jar 抛出 ImportError 异常 您将在下面找到我如何调用 Jython 脚本 java cp C jAutoMailerScript lib p
  • 类作用域变量与方法作用域变量

    我知道变量范围是由块的开头包围的 和块的末尾 如果在块内声明相同的变量 则编译错误Variable already defined发生 但看看下面的例子 public class Test int x 0 Class scope varia
  • 三元运算符(内联如果没有其他)

    我有两个checkbox in a
  • java xml document.getTextContent() 保持为空

    我正在尝试在 JUnit 测试中构建 xml 文档 doc docBuilder newDocument Element root doc createElement Settings doc appendChild root Elemen
  • 如何使用 MVC Html Helpers 截断字符串?

    我正在尝试截断一个长字符串 以便仅在我的索引页上显示 它显示如下 td Html DisplayFor modelItem gt item Description td 描述可以有 500 个字符长 但我无法在网格布局上显示那么多 我想只显
  • 如何增加 tinter 列表框中行之间的间距 - python

    我有一个 tkinter 列表框初始化如下 self serives listbox tk Listbox parent font TkTextFont 20 exportselection False width 30 height 15
  • 捕获视频文件的输出以进行逐帧处理

    我试图从视频文件 7 秒长 中抓取各个帧 但遇到了巨大的内存问题 我正在使用 AVURLAsset 加载资产 然后创建一个AVAssetReader以及随附的AVAssetReaderTrackOutput 采用像素格式kCVPixelFo
  • 使用 KSoap 库使用 .NET Web 服务时出现错误

    我一直在使用 ksoap 库来使用 net Web 服务 我遇到了这种错误 预计 START TAG http schemas xmlsoap org soap envelope http schemas xmlsoap org soap
  • 在 OpenGL ES 2.0 / GLSL 中,哪里需要精度说明符?

    您要填充值的变量是否决定了您在等号右侧使用的精度 例如 这里的精度说明符在含义上是否有任何区别 gl FragColor lowp vec4 1 这是另一个例子 lowp float floaty 1 2 floaty lowp 1 low
  • Bash 监控磁盘使用情况

    我买了一个 NAS 盒子 上面有 debian 的精简版 前几天它空间不足 但我没有意识到 我基本上想编写一个 bash 脚本 每当磁盘已满 90 以上时就会提醒我 有谁知道可以执行此操作的脚本或给我一些关于编写脚本的建议吗 bin bas
  • C# 获取 cmd 输出,如真实 cmd 窗口中所示

    我有一个BackgroundWorker运行 cmd 进程并向其写入多个命令的线程 有些命令可能需要一段时间才能完成 因此我想向用户显示进度的 cmd 输出 我运行 cmd 命令的代码如下所示 private void background
  • 在C中的两点之间选取随机数

    我想知道 是否有可能在 c 中生成两个限制之间的随机数 IE 我的程序是这样设置的 function x generate random number while 1 function x delay 所以基本上我希望每次调用该函数时都会生
  • 何时在基准测试表达式中进行插值

    The 基准测试工具文档建议将全局变量插入基准测试表达式中 然而 他们提供的示例的运行时间差距似乎已经大大缩小 在他们的例子 https github com JuliaCI BenchmarkTools jl blob master do