当前位置: 首页 > news >正文

Rust 学习笔记:循环和迭代器的性能比较

Rust 学习笔记:循环和迭代器的性能比较

  • Rust 学习笔记:循环和迭代器的性能比较
    • 示例 1
    • 示例 2
    • 总结

Rust 学习笔记:循环和迭代器的性能比较

示例 1

我们运行一个基准测试,将《福尔摩斯探案集》的全部内容加载到一个字符串中,并在内容中查找单词 the。下面是使用 for 循环的搜索版本和使用迭代器的版本的基准测试结果:

test bench_search_for  ... bench:  19,620,300 ns/iter (+/- 915,700)
test bench_search_iter ... bench:  19,234,900 ns/iter (+/- 657,200)

使用迭代器的版本略优于使用循环的版本。

迭代器虽然是高级抽象,但编译后的代码与自己编写的底层代码大致相同。

迭代器是 Rust 的零成本抽象之一,意思是使用抽象不会带来额外的运行时开销。

示例 2

以下代码取自音频解码器。解码算法使用线性预测数学运算来估计基于前一个样本的线性函数的未来值。这段代码使用一个迭代器链对作用域中的三个变量进行一些计算:一个数据的缓冲片、一个包含12个系数的数组,以及要在qlp_shift中移动数据的量。我们在这个例子中声明了变量,但没有给它们任何值;尽管这段代码在其上下文之外没有太多意义,但它仍然是Rust如何将高级思想转换为低级代码的一个简明的真实示例。

let buffer: &mut [i32];
let coefficients: [i64; 12];
let qlp_shift: i16;for i in 12..buffer.len() {let prediction = coefficients.iter().zip(&buffer[i - 12..i]).map(|(&c, &s)| c * s as i64).sum::<i64>() >> qlp_shift;let delta = buffer[i];buffer[i] = prediction as i32 + delta;
}

为了计算预测值,这段代码遍历系数中的 12 个值,并使用 zip 方法将系数值与缓冲区中的前 12 个值配对。然后,对于每一对,我们将这些值相乘,对所有结果求和,并将总和 qlp_shift 位中的位向右移动。

音频解码器等应用程序中的计算通常最优先考虑性能。这里,我们使用两个适配器创建一个迭代器,然后消费该值。这个 Rust 代码编译成什么汇编代码?

没有任何循环对应于对系数值的迭代:Rust 知道有 12 次迭代,所以它“展开”循环。展开是一种优化,它消除了循环控制代码的开销,而是为循环的每次迭代生成重复的代码。

所有的系数都存储在寄存器中,这意味着访问值非常快。在运行时对数组访问没有边界检查。Rust 能够应用的所有这些优化使生成的代码非常高效。

现在知道了这一点,就可以毫无畏惧地使用迭代器和闭包了!它们使代码看起来更高级,但不会因此造成运行时性能损失。

总结

闭包和迭代器是受函数式编程语言思想启发的 Rust 特性。它们有助于 Rust 以低级性能清晰地表达高级思想的能力。

闭包和迭代器的实现不影响运行时性能。这是 Rust 努力提供零成本抽象目标的一部分。

http://www.xdnf.cn/news/686089.html

相关文章:

  • Windows下安装并使用kubectl查看K8S日志
  • 可视化提示词(Prompt)在训练过程中的优化过程:visualize_prompt_evolution
  • AI 产品的 MVP 构建逻辑:Prompt 工程 ≠ 产品工程?
  • 【Prompt Engineering】摸索出的一些小套路
  • 弱光环境下如何手持相机拍摄静物:摄影曝光之等效曝光认知
  • 【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)
  • GC1267F:单相全波风扇电机预驱动芯片解析
  • 如何发布npm包?
  • 国标GB28181视频平台EasyGBS视频实时监控:打造城市环境监控全场景解决方案
  • LeetCode 1871. 跳跃游戏 VII(中等)
  • EasyRTC嵌入式音视频实时通话SDK助力AI与IoT智能硬件打造音视频交互多场景应用
  • 力扣热题100之二叉树的中序遍历
  • 【掌握文件操作】(下):文件的顺序读写、文件的随机读写、文件读取结束的判定、文件缓冲区
  • 【开源工具】跳过网页APP禁止粘贴限制:自动输入键盘模拟工具
  • day12 leetcode-hot100-21(矩阵4)
  • MySQL XtraBackup---笔记
  • 初识Docker:容器化技术的入门指南
  • 关于JavaScript、TypeScript Module的配置和用法
  • Vue 3.0 状态管理Pinia详解
  • JWT安全:接收无签名令牌.【签名算法设置为none绕过验证】
  • 生成式AI与AI代理:技术、应用与未来
  • 《仿盒马》app开发技术分享-- 订单地址修改(端云一体)
  • 全局代理从局域到全域的网络升级
  • 华为AP6050DN无线接入点瘦模式转胖模式
  • 常见的C语言段错误实例及原因分析
  • Java开发——三层架构,分层耦合
  • 【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘
  • vue2指令方式防抖功能
  • 征程 6X VDSP 调试方法
  • ​​全球购订单查询接口开放:ERP自动同步实战手册​