thedeemon: (Default)
[personal profile] thedeemon
Читаю статью про F# в очередном номере ПФП, а там стандартный набор бреда про сабж:
В противоположность жадному подходу существует стратегия ленивых вычислений, которая позволяет вычислять значение выражения только тогда, когда оно становится необходимо. Преимуществами такого подхода являются:
• производительность, поскольку неиспользуемые значения просто не вычисляются;
• возможность работать с бесконечными или очень большими последовательностями, так как они никогда не загружаются в память полностью;
• декларативность кода. Использование ленивых вычислений избавляет программиста от необходимости следить за порядком вычислений, что делает код проще.


По пунктам:
1.
а) Что-то я не припомню, чтобы программисты на неленивых языках стали бы вычислять какие-то значения, которые потом не используют. Обычно все-таки люди достаточно разумны, чтобы их программы вычисляли ровно столько, сколько нужно.
б) Ленивость создает накладные расходы, причем существенные. Если две программы делают одно и то же, ленивый вариант никак не будет производительнее энергичного. Почему-то большинство проблем с производительностью программ на Хаскеле решают именно расстановкой всяких ! и $!, убирающих ленивость. И оптимизатор тем же занимается.

2.
С бесконечными структурами ни ленивые, ни энергичные программы работать не могут, они всегда работают с конечной их частью. Насчет больших последовательностей - в неленивых языках они доступны в виде итераторов, энуменаторов и т.п., но это несколько другая вещь, т.к. значения обрабатываются по очереди и не хранятся в памяти, в отличие от ленивых списков и структур. Если же что-то в памяти хранить, то из-за накладных расходов на ленивость ленивые языки принципиально могут хранить меньше данных в тех же объемах памяти, чем неленивые.

3.
От необходимости следить за порядком вычислений избавляет исключительно чистота, а не ленивость. Если код не весь чист (содержит побочные эффекты), то ровно наоборот - ленивость заставляет думать о порядке вычислений гораздо больше обычного, т.к. программа ведет себя не так, как обычно подсказывает интуиция. В строгих же языках порядок вычислений настолько прост и понятен, что задумываться не заставляет.

Date: 2010-05-23 05:09 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
1. Это не так. К примеру, есть конструктор множества, которому или нужно подавать размер, или не нужно (сам сосчитает). Если объявить размер ленивым, то эти два конструктора получаются практически идентичными. (И, кстати, множествам размер не нужен... но это другой вопрос.)

2. Бесконечные программы бывают. Это такие программы, которые работают над потенциально бесконечным потоком. Они не знают, сколько этих данных будет.

С пунктом 3 согласен.

Date: 2010-05-23 12:07 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
1. В данном примере ленивость позволит сэкономить несколько строчек исходника, но не добавит производительности, о которой речь в первом пункте.

2. Такие программы обычно отлично делают на циклах. Сделать то же на ленивом списке, например, да так, чтобы не текла память, уже заметно сложнее.

Date: 2010-05-23 05:45 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
1. В данном случае отсутствие ленивости не позволяет мне вообще сделать что-либо с потенциально бесконечными множествами.

2. Не учите меня программировать.

Извините если что.

Date: 2010-05-24 03:38 am (UTC)
From: [identity profile] thedeemon.livejournal.com
1. Это опять вопрос выразительности, а не производительности.

Date: 2010-05-24 11:00 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
О. Договорились. Именно выразительность.

Date: 2010-05-24 10:35 am (UTC)
From: [identity profile] potan.livejournal.com
Бывает на циклах пишут модели микропроцессоров. Но на ленивых списках, почему-то, получается проще.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 30th, 2026 12:14 pm
Powered by Dreamwidth Studios