我可以在每次除法发生时禁用检查零除法吗?

2024-02-20

为了更好地理解 Rust 的恐慌/异常机制,我编写了以下代码:

#![feature(libc)]

extern crate libc;

fn main() {
    let mut x: i32;
    unsafe {
      x = libc::getchar();
    }

    let y = x - 65;
    println!("{}", x);

    let z = 1 / y;
    println!("{}", z);
}

我想检查 Rust 如何处理被零除的情况。最初我认为它要么接受了一个未处理的 SIGFPE 并死亡,要么它实现了一个处理程序并将其重新路由到一个恐慌(现在可以处理吗?)。

该代码很冗长,因为我想确保 Rust 在编译时知道某些内容为零(因此用户输入为零)时不会执行任何“智能”操作。只需给它一个“A”,它就可以解决问题。

我发现 Rust 实际上生成的代码每次在除法发生之前都会检查零除法。我什至看了一次大会。 :-)

长话短说:我可以禁用此行为吗?我想对于更大的数据集,这可能会对性能产生相当大的影响。为什么不利用我们的 CPU 能力来为我们检测这些东西呢?我可以设置自己的信号处理程序并处理 SIGFPE 吗?

根据Github 上的一个问题 https://github.com/rust-lang/rust/issues/944不久前情况一定有所不同。

我认为事前检查每个部门离“零成本”还很远。你怎么认为?我错过了一些明显的东西吗?


我认为事前检查每个部门离“零成本”还很远。你怎么认为?

你测量了什么?

执行的指令数量是性能的一个非常差的指标;矢量化代码通常更详细,但速度更快。

所以真正的问题是:这个分支机构的成本是多少?

由于故意除以 0 的可能性相当小,并且偶然除以 0 的可能性稍大一些,因此分支总是会被正确预测except当除数为 0 时。但是,考虑到恐慌的代价,错误预测的分支是你最不用担心的。

因此,成本为:

  • 稍微胖一点的组件,
  • 分支预测器中的占用槽。

The exact impact is hard to qualify, and for math-heavy code it might have an impact. Though I would remind you that an integer division is ~100 cycles1 to start with, so math-heavy code will shy away from it as much as possible (it's maybe THE single most time consuming instruction in your CPU).

1 See Agner Fog's Instruction Table http://www.agner.org/optimize/instruction_tables.pdf: for example on Intel Nehalem DIV and IDIV on 64-bits integrals have a latency of 28 to 90 cycles and 37 to 100 cycles respectively.


除此之外,rustc 是在 LLVM 之上实现的,它将实际的代码生成委托给 LLVM。因此,rustc 在许多情况下都受到 LLVM 的支配,这就是其中之一。

LLVM 有两个整数除法指令:udiv 和 sdiv http://llvm.org/docs/LangRef.html#udiv-instruction.

两者都具有除数为 0 的未定义行为。

Rust 的目标是消除未定义的行为,所以has防止被 0 除的情况发生,以免优化器破坏发出的代码而无法修复。

它使用 LLVM 手册中建议的检查。

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

我可以在每次除法发生时禁用检查零除法吗? 的相关文章

  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • 如何使用 Serde 反序列化包含空值的 JSON 文件?

    我想反序列化化学元素 JSON 文件GitHub 上的 Bowserinator https github com Bowserinator Periodic Table JSON blob master PeriodicTableJSON
  • 如何与超级请求处理程序共享不可变的配置数据?

    我正在尝试用 Rust 开发一个基于超级的服务器应用程序 有一个 INI 文件保存诸如绑定 IP 数据库等配置 我不想在每个请求上解析 INI 文件 并且可以保留配置数据直到服务器重新启动 如何向请求处理程序提供已解析数据的结构 我尝试过几
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • 有没有办法分析 WCF 应用程序的性能?

    我们正在尝试测量我们的系统的性能 该系统是一个使用 WCF 调用的 NET 3 5 应用程序 问题是到目前为止 我们无法分析这些调用中的方法 编写了一个 winforms 客户端应用程序来测试我们的系统 我们尝试使用ANTS 4 Profi
  • Array.indexOf 如何比 Array.some 更高效

    这个问题的灵感来自于这个问题的竞争答案 具有多个参数的indexOf https stackoverflow com questions 39000151 indexof with multiple arguments 用户想知道一种有效的
  • 存储 PHP 数组的首选方法(json_encode 与序列化)

    我需要将多维关联数据数组存储在平面文件中以进行缓存 我偶尔可能会遇到需要将其转换为 JSON 以便在我的 Web 应用程序中使用的情况 但绝大多数时候我会直接在 PHP 中使用该数组 在此文本文件中将数组存储为 JSON 或 PHP 序列化
  • 处理 C++ 中执行时间的大量分析

    我目前正在进行一个科学计算项目 涉及海量数据和复杂算法 因此需要进行大量代码分析 我目前依靠的是
  • 有效地生成所有排列

    我需要尽快生成所有排列 https en wikipedia org wiki Permutation整数的0 1 2 n 1并得到结果作为NumPy https numpy org 形状数组 factorial n n 或者迭代此类数组的
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • .NET 迭代器包装抛出 API

    我有一个带有 API 的类 它允许我请求对象 直到它抛出一个IndexOutOfBoundsException 我想将它包装到一个迭代器中 以便能够编写更清晰的代码 但是 我需要捕获异常以停止迭代 static IEnumerable It
  • SQL Server 不使用索引将日期时间与非空进行比较

    我有一个与其他任何表都不相关的简单表 它有一个非 PK 列 它是一个日期 我已经为该列创建了一个非聚集索引 如果我提出这个查询 select from table where datecolumn is not null 但如果我删除 no
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • 优化 CSS 交付 - Google 的建议

    谷歌建议在 head 中使用非常重要的 CSS 内联 并在内部使用其他 CSS
  • 如何在 WSL 上构建使用 device_query crate 的项目?

    我正在尝试使用以下命令跟踪在 WSL 中键入了哪些键设备查询 https crates io crates device query箱 我已经阅读了板条箱的文档 添加了device query 0 2 4 到我的 Cargo toml 文件
  • 为什么 System.nanoTime() 比 System.currentTimeMillis() 慢(性能)?

    今天我做了一个快速基准测试来测试速度性能System nanoTime and System currentTimeMillis long startTime System nanoTime for int i 0 i lt 1000000
  • 为什么对于小数组,for-of 循​​环比标准 for 循环快,而对于大数组则慢?

    在 JavaScript 中 我注意到 ES6for of循环的性能与传统的有很大不同for start stop step loop 基准 const n 10000 const arr Array n fill map e i gt i
  • 令人困惑的无法访问模式错误

    在使用 Rust 编译器时 我遇到了一条非常令人困惑的错误消息match陈述 enum Name Known fn unreachable pattern n Name gt usize use Name match n Unknown g
  • PHP MVC 应用程序中哪里可以捕获异常?

    我有一个中小型 PHP 应用程序 用于练习 OOP 和 MVC 技能 我有初始化 引导程序调用的文件Router谁打电话控制器 gt 服务层 gt 存储库 数据库 然后将变量发送回视图层 所有依赖项均由 DiC IOC 处理 我创建抽象类

随机推荐

  • 是否可以使用 System.IO.Packaging.Package 压缩文件夹并稍后向其中添加文件/文件夹?

    我想知道我们是否可以使用 net 类 ZipPackage http msdn microsoft com en us library system io packaging zippackage aspx将文件夹压缩到file zip文件
  • QTableView - 限制所选项目的数量?

    问题就在标题里 没有函数 QTableView set Max Number SelectedItems int 当所选项目的数量为 2 时 我想禁用项目选择 Thanks 您可以通过以下方式禁用选择 connect ui gt table
  • 如何在碰撞后实现超时/冷却

    我一直在做一个pygame两名玩家尝试将球击入网中的游戏 我的游戏中有一个增强功能 但是 我想要一些增强垫 当它们被收集时 我会获得 3 增强 在我下面的代码中 有一个巨大的黄色物体 当有人将鼠标悬停在它上面时 他们会得到提升 但他们可以永
  • 从 URL 安装 conda 包

    在康达 有没有办法直接从 URL 安装包 如下所示 conda install url https anaconda org conda forge pytest 3 4 0 download linux 64 pytest 3 4 0 p
  • 如何让日期时间对象感知(而不是幼稚)

    我需要做什么 我有一个不了解时区的日期时间对象 我需要向其中添加一个时区 以便能够将其与其他时区感知的日期时间对象进行比较 我不想在不知道这一遗留情况的情况下将整个应用程序转换为时区 我尝试过的 首先 演示一下问题 Python 2 6 1
  • Liquibase 无法启动,因为在“迁移文件:类路径”中找不到更改日志

    当我启动应用程序时 它失败并显示以下消息 指出更改日志文件的类路径不存在 Description Liquibase failed to start because no changelog could be found at Migrat
  • 获取今天的 NSDate,时间为 00:00:00

    我正在 Xcode 中编写一个类别 它将扩展当前的 NSDate 类 我想添加两种我经常使用的方法 但不知何故我无法让它们正常工作 目前我有这个代码 NSDate today NSCalendar gregorian NSCalendar
  • Spring Boot中如何设置嵌入式tomcat的日志级别?

    Spring Boot中如何设置嵌入式tomcat的日志级别 特别是我需要查看tomcat集群相关的日志 我将以下行添加到 application properties 中 但 tomcat 似乎只记录 INFO 级别日志 logging
  • Flutter调试release模式,release模式下启用日志

    根据文档我知道 调试信息被删除 调试已禁用 但是我们可以以某种方式强制打印日志 或者在发布模式下进行调试吗 生产应用程序 我正在使用 Android Studio 例如 在 AS 中开发 Android 应用程序时 我们可以打印日志 and
  • PHP lambda 函数和范围

    下面的函数接受一个数组并检查其键和值是否与指定的数据类型匹配 我似乎对之前工作的内部 lambda 函数遇到了一些问题 我正在运行 PHP v5 3 6 他们最后在 v5 3 4 下工作 他们抱怨未传递的变量不在范围内 如果我将该变量重述为
  • 如何使用 uiview 和 uibutton 检测对 Uitableview 单元格的点击?

    我创建了一个表视图 并将自定义 uiview 添加到单元格的内容视图中 uiview 有一个 uibutton 但是 我可以在创建单元格时将 uibutton 添加到内容视图中 我想获取桌面视图上的点击事件来执行某些操作 我还希望 uibu
  • 如何映射或嵌套 Python 2.7 函数生成器?

    如果我在 Python 2 7 中有一个非常简单 尽管可能非常复杂 的函数生成器 如下所示 def accumulator x yield 0 while True x yield x 可以这样使用 gt gt gt a accumulat
  • 如何在firebird sql语句中使用非ascii字符串文字?

    我想在 firebird sql 查询中使用非 ascii 字符串文字 所以我用了火焰知更鸟首先看看它是否有效 我用过这样的东西 SELECT NAME FROM TABLE1 WHERE NAME 我也尝试过 SELECT NAME FR
  • 在 C++ 中传递变量“名称”

    我目前仅使用以下模板作为检查 NULL 指针的方法 如果为 NULL 则将错误消息打印到日志文件 然后返回 false template lt typename T gt static bool isnull T t std string
  • 关于“Hello World”Android 教程的菜鸟问题

    刚刚开始学习 Android 开发和 Java 所以 这是我正在使用的代码 package com example helloandroid import android app Activity import android os Bun
  • 如何让 Eclipse 运行我的所有 Groovy 单元测试?

    我有一个 Eclipse 项目 其中有许多用 Groovy 编写的单元测试 我可以使用 Eclipse 的 GUnit 运行配置在每个单独的类中运行测试 我打开此配置 选择 运行单个测试 单选按钮 然后选择我要运行其测试的类 这工作正常 但
  • Doxygen 速度慢

    Doxygen 在我们的代码库上运行大约需要 12 小时 这主要是因为有大量代码需要处理 约 150 万行 然而 我们很快就无法进行夜间文档更新 因为它们花费的时间太长 我们已经不得不减少图表深度以将其缩短至 12 小时 我已经尝试过标准方
  • 如何在nodejs中将UUID存储为字母数字

    Node uuid提供了一个优秀的包来生成uuid https github com broofa node uuid https github com broofa node uuid Generate a v4 random id uu
  • 是否可以提交一系列不同的工作来进行 slurm ?

    例如 我有一个名为myScript那个过程one输入文件 我有一个文件名列表 也就是说 我需要运行 myScript
  • 我可以在每次除法发生时禁用检查零除法吗?

    为了更好地理解 Rust 的恐慌 异常机制 我编写了以下代码 feature libc extern crate libc fn main let mut x i32 unsafe x libc getchar let y x 65 pri