Комбинация итераторов могут работать (и работают на практике) быстрее обычных циклов for, по следующим причинам:
Комбинаторы используют замыкания. В случае, когда код замыкания является чистой функцией, компилятору проще вычислить отсутствие зависимостей данных между итерациями, соответственно можно лучше векторизовать циклы.
При рефакторинге тела цикла в замыкание приходится приводить его к одному из стандартных комбинаторов (map/fold/reduce/filter), что также способствует уменьшению зависимостей между данными и ветвлениями. В тяжелых случаях тело цикла приводится не к одному комбинатору, а к нескольким, что тоже способствует упрощению кода. Упрощенный код легче читать человеку, и проще оптимизировать компилятору.
Итераторы в расте могут передавать по цепочке т.н. size_hint(), которые реализованы для частых случаев - типа итератора по слайсам. Эта информация тоже может учитываться компилятором для построения более эффективного кода.
Комбинация итераторов могут работать (и работают на практике) быстрее обычных циклов for, по следующим причинам:
Комбинаторы используют замыкания. В случае, когда код замыкания является чистой функцией, компилятору проще вычислить отсутствие зависимостей данных между итерациями, соответственно можно лучше векторизовать циклы.
При рефакторинге тела цикла в замыкание приходится приводить его к одному из стандартных комбинаторов (map/fold/reduce/filter), что также способствует уменьшению зависимостей между данными и ветвлениями. В тяжелых случаях тело цикла приводится не к одному комбинатору, а к нескольким, что тоже способствует упрощению кода. Упрощенный код легче читать человеку, и проще оптимизировать компилятору.
Итераторы в расте могут передавать по цепочке т.н. size_hint(), которые реализованы для частых случаев - типа итератора по слайсам. Эта информация тоже может учитываться компилятором для построения более эффективного кода.
Пример ускорения: https://ipthomas.com/blog/2023/07/n-times-faster-than-c-where-n-128/
Автор переизобрел smol_str (https://lib.rs/crates/smol_str)