Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ленивые вычисления vs энергичные 
:(
    Опции темы
Void
Дата 28.12.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Глядя, как бодаются gaperton с thesz, лулзов ради решил создать темку.

Речь идёт о модели вычислений в языке программирования. Ленивость по умолчанию или строгость (strictness) с явными аннотациями ленивости.

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

Fight!


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
unicuum
Дата 11.1.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 16.3.2005
Где: Рашка

Репутация: 1
Всего: 8



Цитата(Void @  28.12.2008,  13:50 Найти цитируемый пост)
Fight! 

И тишина, и мёртвые с косами стоят.


--------------------
user posted image
обычный день на винграде
PM   Вверх
Lazin
Дата 11.1.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(Void @  28.12.2008,  13:50 Найти цитируемый пост)
gaperton с thesz

ктоэта?
вообще, ленивые вычисления возможны не только в Haskell, только там они ленивые все и по умолчанию, так?
если да, то я считаю что это должно плохо сказываться на производительности а так-же на предсказуемости работы программы smile
PM MAIL Skype GTalk   Вверх
Void
Дата 11.1.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Lazin @  11.1.2009,  14:36 Найти цитируемый пост)
ктоэта?

%username% @ ЖЖ и RSDN
Цитата(Lazin @  11.1.2009,  14:36 Найти цитируемый пост)
вообще, ленивые вычисления возможны не только в Haskell, только там они ленивые все и по умолчанию, так?

Какбэ да.
Цитата(Void @  28.12.2008,  15:50 Найти цитируемый пост)
Ленивость по умолчанию или строгость (strictness) с явными аннотациями ленивости.


У меня, кстати, осмысленной позиции по этому поводу нет, потому что на Haskell я практически не писал, а ленивость использовал в основном в виде lazy streams, которые более или менее реализуются во всех приличных языках.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
baldina
Дата 11.1.2009, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Код

if (f1() || f2())
{
  ...
}

вот вам ленивость по умолчанию. 

Цитата

это должно плохо сказываться на производительности а так-же на предсказуемости работы программы


это почему же? наоборот, если вычисления аргументов функции ленивые, это весьма положительно сказывается на производительности. а что касается предсказуемости... смешно... ну какая разница, все вычисления по любому выполняются.
PM MAIL   Вверх
Lazin
Дата 11.1.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(baldina @  11.1.2009,  12:56 Найти цитируемый пост)
это почему же? наоборот, если вычисления аргументов функции ленивые, это весьма положительно сказывается на производительности.

в случае строгого порядка вычислений, заранее известно когда вычислять и в каком порядке, в случае ленивых вычислений это неизвестно, это выясняется только на этапе выполнения программы, поэтому, на практике это приводит к снижению производительности. Ленивость хороша на макроуровне(уровне архитектуры), там она может давать большие приемущества smile .

Цитата(baldina @  11.1.2009,  12:56 Найти цитируемый пост)
а что касается предсказуемости... смешно... ну какая разница, все вычисления по любому выполняются. 

но когда и в каком порядке никто заранее не знает

в общем я так понимаю ленивость
допустим есть у нас цикл
Код

for(value in container)
    do_something_whith(value)

в языке со строгим порядком вычислений, каждый элемент контейнера изменится сразу, в языке с ленивыми вычислениями, каждый элемент контейнера запомнит, что с ним перед использованием нужно сделать... 
в итоге, если у нас будет что-то вроде этого
Код

for(value in container)
    do_something_whith(value, another_value)//вычисляем новое значение value с использованием доп. данных

то another_value - то-же должно существовать до тех пор, пока существует контейнер, поэтому я и написал про плохую предсказуемость, в случае строгих вычислений, another_value должно существовать ровно до тех пор, пока оно нужно, в языке с ленивыми вычислениями сложно предсказать сколько должно жить another_value, за этим должен следить сборщик мусора, который должен быть очень умным а значит сложным
PM MAIL Skype GTalk   Вверх
baldina
Дата 11.1.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата
но когда и в каком порядке никто заранее не знает


конечно, если не императив, а, скажем, функционал, программист выражает "что надо сделать", а не "как". например, задавая рекуррентное отношение. 

Цитата
на практике это приводит к снижению производительности


почему же? есть два аспекта:
1. современные компьютеры (в большинстве) архитектурно императивны. и моделируя другие парадигмы появляются доп. накладные расходы
2. для не императивной модели затруднена оптимизация кода

рассмотрим:
1. a) опытный программист знает как устроена виртуальная машина, производящяя вычисления. и может это учесть.
    б) собственно вычисления часто составляют не такую уж большую часть программы. многое зависит от эффективности используемых библиотек. недаром Java, исполняемая на VM, часто не уступает в скорости С++ на реальных приложениях
    в) любое инженерное решение имеет достоинства и недостатки. это из разряда, когда за эффективность разработки мы платим некоторым снижением производительности

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

однако все это не вполне относится к ленивым вычислениям. например:

Код

int f (int a, int b)
{
   if (a > 0)
      return a+1;
   else
      return b+1;
}

....

cout << f (10, get_b());

vs
Код

int f (int a, int (*get_b)())
{
   if (a > 0)
      return a+1;
   else
      return get_b()+1;
}

....

cout << f (10, get_b);

во втором случае неизвестно, вызовется ли get_b(), но здесь не меньше, а, может, и больше возможностей для оптимизации.

что касается языков с ЛВ, то здесь имеем оптимизация графа vs "лишние" переменные. что эффективней - зависит от программы и программиста.
кстати, про сборку мусора и проч. наличие доп. переменной само по себе на производительность не влияет: память тратится, но и почти все. эффективное управление памятью - неотъемлемая часть реализации функционального языка, но распределение памяти там происходит под управлением исполняющей системы, а не так бардачно, как, скажем, в Java. Так что все не так плохо smile

Добавлено через 7 минут и 46 секунд
что касается вопроса темы - подход к ЛВ от точки зрения зависит, которая формируется под влиянием используемого языка. В каждом языке свои походы и приемы, однозначно сказать что лучше нельзя. имхо. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.0711 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.