Pull to refresh

Comments 13

Что-то вы совсем очевидные вещи рассказываете.

Мне даже в голову не могло прийти начать джойнить потоки в том же проходе, в котором они создавались...

А ещё это не является rust-специфичным поведением.
Так итераторы работают вообще в любом языке программирования.

Первое апреля в этом году настало раньше положенного

Вроде так себя ведут итераторы в любом языке, где они настоящие, а не просто у массивов есть два метода map/filter возвращающих новый массив. Без ленивости будет аллокация памяти на полный размер массива на каждый шаг обработки.

Такая же ситуация как в Rust будет в Java, например.

Вот ленивый async есть не везде, а ленивые итераторы везде.

Думаю, минусов накидали в первую очередь за заголовок. В оригинале статья называется "Помогите, итераторы делают мой код медленнее!", и с такой постановкой становится понятней что это разбор тривиальной ошибки.

Да и сам перевод далеко не дословный, а с кучей дополнительных пояснений и воды.

Я из-за слишком серьёзного заголовка ожидал рассмотрение каких-то краевых случаев, где zero-cost abstractions оказываются не zero-cost. А внутри увидел совсем другое (я даже не могу сказать, что производительность именно ухудшилась, ибо время исполнения выросло в 10 раз, но и нагрузка на CPU уменьшилась в 10 раз).

Сама по себе статья полезная, но с "Помогите, итераторы делают мой код медленнее", у меня бы не было неоправдавшихся ожиданий от содержимого, я бы читал её именно как статью для новичков, а не понял это только в середине.

где zero-cost abstractions оказываются не zero-cost. 

Т.е. везде? Вызов функции не гарантирует сохранения и обработку всех инвариантов.

Хотите zero-cost - юзайте макросы (кстате, в стандартной библиотеке так и поступают)

Объясните минуса? Я вот могу показать примеры, например, с банальным вызовом `.len()` из-за которого отключаются определённые оптимизации. Или же написать примеры кода, в котором на выходе из-за использования функций падение в производительности в 10+ раз.

zero-cost abstractions это маркетинг, он невозможен из-за природы работы оптимизатора.

Мы говорим про zero-cost, это означает что для оптимизатора не должно быть разницы использовали ли мы абстракцию или нет.

При чём тут ускорение при добавление вызова .len() если разговор идёт об информации которая есть у оптимизатора (на проходах в которых она нужна) при использовании абстракций?

Например len не особо юзается в стандартной библиотеке, а вместо неё используется макрос, т.к. в определённых кейсах оптимизатор не может доказать что 2 вызова len ссылаются на одно значение.

В плане ускорения, конечно итераторы в расте могут быть быстрей чем пользовательский код, т.к. проблемы оптимизатора компенсируются вызовом `assume`, у другими механиками. Но речь немного о другом.

Вы говорите про zero-cost abstractions, только вот .len() - это вообще не абстракция.

Кстати, каким таким макросом можно эту .len() заменить-то?

Если спавнить потоки std::thread::scope, когда не требуется нетривиальной обработки JoinHandle, то .join() будет происходить "автоматически", без явного вызова, который в вашем корректном примере с итераторами делал код многословнее

"Обколются своими курсами, а потом такие статьи пишут"

Sign up to leave a comment.