> 1 <

Автор Сообщение

mew2

Members


Статус

13 сообщений

Где: Ukraine
Род занятий:
Возраст:

#7708   2016-03-10 07:00 GMT+3 часа(ов)      
И все таки, в чем практическая польза immutable объектов и в чем их достоинство перед mutable? Честно говоря, я не очень въезжаю. Насколько я понял, в ракет принято отдавать предпочтение immutable, но с чем это связано, ведь с mutable все работает намнооого быстрее. Много где пишут, что это вопрос религии, но меня такой ответ мало устраивает, честно говоря.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7711   2016-03-12 00:02 GMT+3 часа(ов)      
>Насколько я понял, в ракет принято отдавать предпочтение immutable, но с чем это связано, ведь с mutable все работает намнооого быстрее.

Кто вам такое сказал? Или вы сами тестировали?

>Много где пишут, что это вопрос религии, но меня такой ответ мало устраивает, честно говоря.

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

mew2

Members


Статус

13 сообщений

Где: Ukraine
Род занятий:
Возраст:

#7712   2016-03-13 00:40 GMT+3 часа(ов)      
Цитата
misha :
Кто вам такое сказал? Или вы сами тестировали?



Да, я делал простенькие тесты на производительность с разными типами структур, которые идут из коробки, в частности тогда меня больше всего интересовал set.
Мне очень нравится как выглядят программы с immutable объектами, как лаконично выглядят рекурсии вместо циклов и я бы с радостью везде пихал именно их, если бы не проблемы с производительностью, которые они создают, особенно с большими структурами данных. То есть, может эти проблемы и не заметны при использовании программы на глаз, но мне все равно не дает покоя тот факт, что производительность приносится в жертву красоте кода.
Хотя, я допускаю, что чего-то не понимаю и делаю не правильно, поэтому мои тесты и были максимально примитивными по сути своей, чтобы свести к минимуму зависимость результатов от моей некомпетенции в вопросе.
(чуть позже приведу примеры тестов, которые я делал)

Цитата
misha :
А вы вместо того, чтобы школьников слушать, лучше бы писали многопоточные приложения. И тогда этот вопрос отпал бы сам, без чьей-либо помощи.



Честно говоря, я щас и не вспомню когда в последний раз я писал программу, отличную от хеловорлда, которая была бы не многопоточной.
Мне вообще нравятся многопоточные программы, да и проблем с многопоточностью у меня вроде не возникало нигде. А в ракет так вообще я был удивлен насколько просто управляются потоки. Плюс, в каком-то гайде рассказывалось про дебаггер который эти самые потоки визуализирует, короче очень круто.
Но, если вернуться к теме, многопоточность это лишь частный случай, где в силу обстоятельств выгоднее использовать immutable, но если вынести реализацию многопоточности за скобки и рассмотреть вот общие случаи, где вам нужно бегать по спискам, что-то искать, что-то менять и так далее, короче вот эти все примитивные вещи, которые вы вынуждены делать постоянно, разве вы отдали бы в них предпочтение неизменяемым объектам?

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7714   2016-03-13 01:55 GMT+3 часа(ов)      
>Мне очень нравится как выглядят программы с immutable объектами, как лаконично выглядят рекурсии вместо циклов и я бы с радостью везде пихал именно их, если бы не проблемы с производительностью, которые они создают, особенно с большими структурами данных.

Неизменяемые объекты существуют как раз для удобства программирования, особенно в функциональном стиле. Так что вы вправе сами решать, что вам лучше использовать.

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

А для этого существуют mutable cons, хотя я зачастую отдаю предпочтение связанным структурам.

mew2

Members


Статус

13 сообщений

Где: Ukraine
Род занятий:
Возраст:

#7721   2016-03-15 02:52 GMT+3 часа(ов)      
Ну вот, например, первое что в голову пришло потестить. Там где большие числа - это все иммутабле.

 
#lang racket/base
 
(require racket/function racket/set racket/stream)
 
 
(define SIZE 10000)
 
 
(define dta (build-list SIZE identity))
 
(define immu-set-1 (apply set dta))
(define immu-set-2 (set))
 
(define muta-set-1 (apply mutable-set dta))
(define muta-set-2 (mutable-set))
 
 
(define (immutable-test)
(time
(let loop ((st1 (set->stream immu-set-1))
(st2 immu-set-2))
(if (stream-empty? st1)
(set! immu-set-2 st2)
(loop (stream-rest st1)
(set-add st2 (* 2 (stream-first st1))))))))
 
(define (mutable-test)
(time
(for ((elm (in-set muta-set-1)))
(set-add! muta-set-2 (* 2 elm)))))
 


misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7723   2016-03-15 17:16 GMT+3 часа(ов)      
А смысл этого тестирования? Зачем пытаться доказать очевидные вещи? Потестить можно операции над примитивными типами данных, например, cons vs mcons (car vs mcar, cdr vs mcdr). Ведь скорость операций над сложными типами данных будет зависеть от реализации алгоритмов этих операций. Так что в будущих версиях рэкета "картина" может несколько поменяться, поэтому над этим не стоит заморачиваться.
> 1 <


Онлайн :

0 пользователь(ей), 21 гость(ей) :




Реклама на сайте: