ruby 中哪个更快 - 哈希查找还是带有 case 语句的函数?

2024-01-11

我们在时间关键的脚本中有几个地方将旧 ID 转换为字符串。目前,我们在函数内使用 case 语句,如下所示:

def get_name id
  case id
    when 1
      "one thing"
    when 3
      "other thing"
    else
      "default thing"
  end
end

我正在考虑用哈希查找替换它,如下所示:

NAMES = {
  1 => "one thing",
  3 => "other thing",
}
NAMES.default = "default thing"

感觉使用起来应该更快NAMES[id] than get_name(id)- 但真的是这样吗?


首先,有几点。一是像这样的低级语言结构或多或少做同样的事情几乎从来都不是任何现实应用程序的瓶颈,所以关注它们(通常)是愚蠢的。其次,正如已经提到的,如果你真的关心它,你应该对其进行基准测试。 Ruby 的基准测试和分析工具当然不是编程生态系统中最先进的,但它们可以完成工作。

我的直觉是散列会更快,因为(我再次猜测)case 语句必须依次检查每个条件(使得查找项目的时间复杂度为 O(n) 而不是 O(1))。但让我们检查一下!

完整的基准测试代码位于https://gist.github.com/25 https://gist.github.com/25基本上,它生成一个定义适当的案例/哈希的文件,然后使用它们。我继续将哈希查找也放在方法调用中,这样开销就不会成为一个因素,但在现实生活中,没有理由将它困在方法中。

这是我得到的。在每种情况下,我都会进行 10,000 次查找。时间是以秒为单位的用户时间

Case statement, 10 items  0.020000
Hash lookup, 10 items     0.010000

Case statement, 100 items  0.100000
Hash lookup, 100 items     0.010000

Case statement, 1000 items  0.990000
Hash lookup, 1000 items     0.010000

所以,看起来 case 语句的复杂度是 O(n)(这并不令人震惊)。另请注意,即使在 case 语句中,10K 次查找仍然只需要一秒钟,因此除非您正在对这些查找进行度量但加载,否则最好将重点放在代码的其余部分上。

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

ruby 中哪个更快 - 哈希查找还是带有 case 语句的函数? 的相关文章

  • 如何静默启动Sinatra + Thin?

    我有一个 Sinatra Base webservice 我想从命令行 Ruby 程序启动它 所以我有这个 command line program file require mymodule server puts Running on
  • MySQL max_allowed_pa​​cket 参数有什么问题?

    我需要增加 max allowed pa cket 参数 以适应一些理论上非常大的项目 如果我将此参数设置为 10M 那么与设置为 1M 或 4M 相比 我要支付什么价格 如果有的话 感谢您的任何意见 托马斯 我找到了这个解释 http w
  • 如何对 ruby​​ 的 URI.parse 方法进行猴子补丁

    一些流行的博客网站通常在其 URL 中使用方括号 但 ruby 的内置 URI parse 方法会阻塞它们 引发令人讨厌的异常 如下所示 http redmine ruby lang org issues show 1466 http re
  • 表长度运算符的性能

    卢阿有 运算符来计算用作数组的表的 长度 在诸如 C 之类的语言中 计算出某个内容的长度后 通常不会再次计算它 例如int len strlen string 这在 Lua 中有什么不同吗 其中一个的效率是否比另一个低 显然这可能不会显示显
  • 如何在 Rails 模型中获取 request.uri?

    request request 当我在控制器中写这个时 它就会起作用 但是如果我在模型或应用程序控制器中需要这个变量 我该怎么办 模型存在于 Web 请求的上下文之外 您可以在 irb 中实例化它们 可以在延迟作业或脚本等中实例化它们 如果
  • C# 代码在 IIS 上运行速度快,但在 Mono 上运行速度慢 - 如何改进?

    我有一个 ASP NET 应用程序 它在我的 Windows 开发计算机上运行良好 不过 服务器是运行 Mono 的 Linux 一旦上传 相同的代码在 Windows 上的运行速度会比在 Windows 机器上慢 4 到 5 倍 例如 一
  • 为什么线程本地存储不使用页表映射来实现?

    我希望使用 C 11thread local将非常频繁地访问的每线程布尔标志的关键字 然而 大多数编译器似乎都使用一个表来实现线程本地存储 该表将整数 ID 槽 映射到当前线程上的变量地址 此查找将发生在性能关键的代码路径内 因此我对其性能
  • RVM 无法通过 SSH 工作(作为一项功能)

    我刚刚在 Debian 6 服务器上安装了 RVM 一开始没有任何问题 但是 在一切设置完成后 我无法在终端中运行 RVM 我打字时收到的消息rvm use is RVM is not a function selecting rubies
  • 将 UTF-8 设置为 Heroku 中的默认字符串编码

    我需要在 Heroku 中将默认的 ruby 字符串编码更改为 UTF 8 由于某种原因它是 US ASCII heroku console Ruby console for myapp heroku com gt gt a encodin
  • Rails 中带有 text_field 的逗号分隔数组

    我有一些users可以有很多posts 并且每个帖子都可以有很多tags 我已经使用一个实现了拥有并属于许多帖子和标签之间的关系 创建新帖子时 用户可以使用逗号分隔的值列表对其进行标记 就像在 SO 上发布新问题时一样 如果任何标签尚不存在
  • 相当于 JavaScript 中 Ruby 的each_cons

    许多语言都曾提出过这个问题 但 javascript 却没有 Ruby 有方法Enumerable each cons https devdocs io ruby 2 5 enumerable method i each cons看起来像这
  • #freeze 除了防止修改之外还有其他用途吗?

    Ruby s 标准uri library https github com ruby ruby tree trunk lib uri对于无法修改或修改不会造成损害的对象 冻结有很多用途 user password ui split free
  • SHA256在 x64 构建中的管理速度是原来的两倍 - 这是典型情况吗?

    有人说 NET 应用程序可以在 x86 模式下编译 因为 x64 提供的唯一好处几乎是更大的虚拟地址空间 从而允许应用程序分配超过 2 或 3 GB 的内存 或者整个内存映射非常大的文件 然而 一个非常简单的测试表明 在 64 位计算机上
  • 异常的成本有多高[重复]

    这个问题在这里已经有答案了 你知道java中异常抛出和处理的代价有多大吗 我们就团队中异常的实际成本进行了多次讨论 有些人尽可能避免使用异常 有些人则认为使用异常会导致性能损失被高估了 今天我在我们的软件中发现了以下代码 private v
  • 将数据添加到闪存中的段如何会扰乱程序的时序?

    我有一个实时嵌入式应用程序 其主周期以 10KHz 运行 它在配置为从闪存启动的 TI TMS320C 上运行 我最近在源文件中添加了一个初始化的数组 突然间时间就搞砸了 以一种太复杂的方式无法很好地解释 本质上串行端口写入不再按时完成 这
  • 在 VB6 中计时函数/测量性能的最佳方法是什么?

    如果我只想快速测量特定函数花费的时间 我可以调用什么来获得准确的计时 鉴于VB6计时函数精度不高 是否可以调用Windows API函数 您还通过哪些其他方式衡量应用程序性能 有推荐的第三方工具吗 我通常使用 Windows 高分辨率性能计
  • 对 ruby​​ 命令行应用程序的代码进行单元测试 - 如何模拟/通过 ARGV

    我有一个命令行应用程序 它使用 thor 来处理选项的解析 我想使用 test unit 和 或 minitest 对代码进行命令行功能的单元测试 我似乎无法弄清楚如何确保 ARGV 数组 通常会保存命令行中的选项 保存我的测试选项 以便可
  • Ruby MRI 1.8.7 - 文件写入线程安全

    在我看来 在 Ruby MRI 1 8 7 中写入文件是完全线程安全的 示例 1 完美的结果 File open test txt a f threads 1 000 000 times do n threads lt lt Thread
  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草

随机推荐

  • css在表单中浮动2个输入字段

    我在理解 css 时遇到以下问题 我有一张登记表 在这种形式中 我使用字段集 现在我想在每行旁边放置两个输入字段 上面的每个字段还应该有一个标签 所以我想要实现的是 label 1 label 2 label 3 label 4
  • Intellij 自动构建 - 不存在

    如果我删除一个方法 则在我手动构建项目之前 不会显示错误 由于不存在方法而在代码中的其他位置 有没有办法让它在保存 更改时自动构建 我在某个地方缺少一个选项吗 你可以尝试理念 12 EAP http confluence jetbrains
  • TFLite 的硬刷操作

    我有一个用 Tensorflow Keras 编写的自定义神经网络 并应用 Hard swish 函数作为激活 如 MobileNetV3 论文中使用的那样 执行 def swish x return x tf nn relu6 x 3 6
  • 嵌套 jquery 选择器触发父级和子级特定事件

    我有一个具有以下结构的表 表 主 tbody tr Row td 输入 EditRow 我的 jquery 看起来像这样 table Main gt tbody gt tr Row live click function e RowClic
  • PhantomJS/CasperJS AssertExists() 失败

    我试图检查我的网页中是否存在选择器 但 casperjs 从未找到它 我尝试过两种方法 1 无需等待 casper then function search for casperjs from google form this test a
  • 出站 ChannelHandler 的捕获所有异常处理

    在 Netty 中 您有入站和出站处理程序的概念 只需在管道的末尾 尾部 添加一个通道处理程序并实现一个捕获所有入站异常处理程序即可实现exceptionCaught覆盖 如果未沿途处理 沿入站管道发生的异常将沿着处理程序传播 直到遇到最后
  • Visual Studio 2012 的 Intellisense 不再接受按空格键的建议

    我一直在多台 PC 上使用 Visual Studio 2005 2008 2010 由其他人或我安装 始终对它的智能感知建议是这样工作的 我开始打字 弹出带有建议的窗口 突出显示当前建议 然后我可以按空格键接受建议 然而 由于我在当前的
  • 为 Flink 集群中的插件添加自定义依赖项

    我有一个 Flink 会话集群 作业管理器 任务管理器 版本 1 11 1 配置了 log4j console properties 以包含 Kafka 附加程序 此外 在作业管理器和任务管理器中 我都启用了 flink s3 fs had
  • 设置所有行的一列的值非常慢

    我有一个包含大约 350 000 行的表 最近我从 MyISAM 存储引擎更改为 InnoDB 我运行查询 UPDATE users SET online 0 每次我的服务器启动时 使用 MyISAM 时都没有任何问题 该查询通常只影响几百
  • EF 5-6.1.1 中的 NullReferenceException 具有同一类型的两个导航属性

    我想首先我有一个解决这个问题的方法 但我今天花了几个小时找出异常的原因 所以我想我应该分享 给定域中的两个实体 public class User public int Id get set public string Name get s
  • 反应本机 ios:默认情况下 geoloc 的准确性很差

    我正在使用 navigator geolocation watchPosition 和 getCurrentPosition 实现健身追踪器 它在 android 和 ios 模拟器上运行良好 具有 5 10m 精度 但在 iphone 5
  • JavaFX:鼠标剪贴板在 Unix 中不起作用

    您可能知道 在 Unix 中 通常使用鼠标进行复制粘贴操作 IE 文本选择自动将其复制到剪贴板并点击滚动条将其粘贴到您单击的位置 对于使用 Java 7 和 Swing 的 GUI 应用程序 我没有出现剪贴板问题 但在 JavaFX 和 J
  • 如何检测Android设备的芯片组信息? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如何检测android设备的芯片组信息 例如 要禁用某些功能MediaTek芯片组 本问题中讨论的 10
  • 无法从站点获取服务器证书

    我无法从我的网站 其他网站 获取证书 我尝试了一些解决方案HttpsURLConnection和方法getServerCertificates但没有任何办法可以解决问题 URL httpsURL new URL https www goog
  • 如何增加 Flink taskmanager.numberOfTaskSlots 以在没有 Flink 服务器的情况下运行它(在 IDE 或 fat jar 中)

    我有一个关于在 IDE 中运行 Flink 流作业或作为 fat jar 运行而不将其部署到 Flink 服务器的问题 问题是当我的工作中有超过 1 个任务槽时 我无法在 IDE 中运行它 public class StreamingJob
  • 使用 OpenSmpp 从 SMSC 接收消息

    我正在尝试使用 OPENSMPP 接收来自 SMSC 的消息 这是我的代码 try PDU pdu session receive 30000 if pdu instanceof DeliverSM DeliverSM received D
  • 闪亮书签无法恢复selectizeinput

    我设计了一个简单闪亮的应用程序 https yuchenw shinyapps io selectizeinput bookmark https yuchenw shinyapps io selectizeinput bookmark 有两
  • 过滤列表中的位置,Haskell

    我需要打印奇数索引的元素 目前正在打印索引 我不明白如何打印该索引的元素 f Int gt Int f lst filter odd 0 length lst I can t edit this part main do inputdata
  • 在 Jython 中导入 jar API

    我正在尝试导入 Java API 它作为 jar 文件分发 我按照以下指示进行操作这个答案 https stackoverflow com a 1734231 1072062在 Stack Overflow 上有一个类似的问题 但没有成功
  • ruby 中哪个更快 - 哈希查找还是带有 case 语句的函数?

    我们在时间关键的脚本中有几个地方将旧 ID 转换为字符串 目前 我们在函数内使用 case 语句 如下所示 def get name id case id when 1 one thing when 3 other thing else d