「迭代器链和手写循环一样快」是 Rust 的著名说法。这篇不信传说:同一个计算写成链、for、下标 while、中间 Vec,在 release、debug 和各级 opt-level 下实测,再数分配次数,看这个说法成立的条件。
编译:成功
运行(退出码 0):
链 2.724 ms | for 循环 2.725 ms | 下标 while 2.955 ms | 中间 Vec 15.150 ms | 结果相同: true惰性与逐元素执行见Iterator 的惰性执行。
编译:成功
运行(退出码 0):
链 6.522 ms | for 循环 3.154 ms | 下标 while 2.584 ms | 中间 Vec 11.728 ms | 结果相同: true编译:成功 opt-level=0: 链 63.168 ms | for 循环 31.122 ms | 下标 while 29.381 ms | 中间 Vec 121.602 ms | 结果相同: true 编译:成功 opt-level=1: 链 2.749 ms | for 循环 4.915 ms | 下标 while 2.747 ms | 中间 Vec 13.518 ms | 结果相同: true 编译:成功 opt-level=2: 链 3.338 ms | for 循环 3.154 ms | 下标 while 3.159 ms | 中间 Vec 12.286 ms | 结果相同: true 编译:成功 opt-level=3: 链 2.949 ms | for 循环 2.698 ms | 下标 while 2.966 ms | 中间 Vec 12.129 ms | 结果相同: true
Cargo 的 profile 配置见Cargo Profile。
编译:成功
运行(退出码 0):
惰性链: alloc 0 realloc 0 申请字节 0 结果 16616700000
中间 Vec: alloc 2 realloc 14 申请字节 1448544 结果 16616700000filter 的 size_hint 见collect 类型推断。