当我迭代它们时,为什么 Rust 中的迭代器看起来很慢?

巴克兹

我有一个大文件,我正在使用 mmap 读取它。我想在每一行上做一些操作,所以我在它上面调用了 split() ,它为每一行提供了一个迭代器:

let file = File::open("myfile").unwrap();
let mmap = unsafe { MmapOptions::new().map(&file).unwrap() };
//splitting by newline
let iter = mmap.split(|elem| elem == &b'\n');

这工作正常并且没有给我任何问题 - 运行速度非常快。

但是,当我通过迭代器时,它会跳转并且通过 for 循环所需的时间大约是读取和拆分时间的 4 倍。

此外,这不处理该行或在 for 循环内执行任何操作:

for elem in iter {
  //process the line
}

由于性能是一个问题 - 我发现它设法非常快速地读取和拆分文件很奇怪,但是,当我通过迭代器时它变得非常慢。我错过了什么吗?我对 Rust 的了解也很有限,所以不确定我是否在做坏事。有什么东西可以帮助我优化它并加快访问速度?

此外,并行迭代器在我的情况下没有那么有用 - 它们添加的开销不值得。

整个文件:

use memmap::MmapOptions;
use std::fs::File;
use std::time::{Duration, Instant};

fn main() {

    let now = Instant::now();
    let file = File::open("myfile").unwrap();
    let mmap = unsafe { MmapOptions::new().map(&file).unwrap() };
    let iter = mmap.split(|elem| elem == &b'\n');

    /*
    for elem in iter {
      //do nothing
    }
    */
    println!("{:?}", now.elapsed());
}

如果我取消对 for 循环的注释,它会变慢 4 倍。我正在使用 --release 标签进行构建,因此这不是问题。

SE_net4 投票者

当取消对 for 循环的注释时,代码看起来很慢,因为它不会做任何其他事情迭代器是惰性的,只在消耗时执行一些活动。

引用Rust 编程语言第 13 章第 2 节中的相关部分

在 Rust 中,迭代器是惰性的,这意味着它们在您调用消耗迭代器的方法以使用它之前不会产生任何影响。[...] 调用next迭代器上方法会改变迭代器用来跟踪它在序列中的位置的内部状态。换句话说,此代码消耗或用完迭代器

for 循环是使用迭代器的构造示例。调用.split()内存映射数据只会为该迭代器创建一个适配器(请注意,这并不意味着它会创建多个迭代器)。适配器是使用迭代器的一种常见方式,这在本书中也有描述。

Iterator特性上定义的其他方法,称为迭代器适配器,允许您将迭代器更改为不同类型的迭代器。您可以将多个调用链接到迭代器适配器,以可读的方式执行复杂的操作。但是因为所有的迭代器都是惰性的,所以你必须调用其中一种使用适配器的方法来从对迭代器适配器的调用中获取结果。

因此,该示例不会急切地在内存中创建这些拆分,并且程序仅在存在 for 循环或以其他方式消耗迭代器时才做一些有价值的事情。

也可以看看:

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

这些是物体吗?为什么当我打印它们时它们看起来像这样?

如何使迭代器类看起来不像容器类?

Rust中的迭代器类型

Rust实现迭代器

为什么我们不需要在某些 Rust 迭代器中从 Result 中提取值?

Rust 引用迭代器中的引用

在Rust中,向量是迭代器吗?

在Rust中,如何创建可变的迭代器?

在 Rust 中,如何返回反向迭代器?

在复合材料管理器中,为什么窗口的圆角看起来很奇怪?

为什么每次我迭代它们时都会调用向量中结构的析构函数?

Rust迭代器之类的chunks()

在Windows Photo Viewer中预览时,为什么我的屏幕截图看起来很糟糕?

为什么在调整窗口大小时我的页面看起来与在 Chrome 移动查看器中不同?

为什么Rust中的for循环可以遍历切片或迭代器,而不遍历数组?

在Rust中迭代时如何调用方法

当我在localhost上访问时,为什么我的复选框在chrome上看起来不同?

Rust宏中的嵌套迭代

当我在Visual Studio中运行程序时,为什么窗口窗体看起来与众不同?

为什么当我启动我的程序时我的外观和感觉看起来很奇怪?

挂在 Rust 中的通道接收器迭代器中?

迭代行polars rust

Rust 指针迭代问题

更改Java中的默认按钮,使它们看起来“更好”

OpenCV中的Sobel滤波器 - 为什么它看起来那么糟糕,尤其是相对于瘸子?

为什么我的反应步进器组件看起来很小?

为什么在引用dll文件到我的项目之后,当我构建项目时它们不在我的发布目录中?

当我尝试在此列表上使用迭代器时,为什么会引发此异常?

为什么在Chrome(仅在Windows中)和Firefox中我的样式规则看起来不同?