metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2015-07-10 02:01 pm

Хаскель и среднее арифметическое

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

[identity profile] binf.livejournal.com 2015-07-10 04:56 pm (UTC)(link)
Вы хотите сказать, что гипотетическая ситуация, когда коллекция тестировалась на мегабайты, а в продакшене стала гигобайтами и обвалила всю систему - это большая редкость для java, c++ или (здесь вписать ваш любимый не ленивый ЯП)? Не соглашусь. Из моей практики: в разы проще отыскать и исправить узкое место профилированием в GHC, чем в C# например. Просто потому что меньше бойлерплейта

[identity profile] justy-tylor.livejournal.com 2015-07-10 05:05 pm (UTC)(link)
"авгиевы конюшни на 5 строк".

[identity profile] ww9cb.livejournal.com 2015-07-10 06:52 pm (UTC)(link)
сейчас ты снова как подросток говоришь. очень глупо выглядит.

[identity profile] antilamer.livejournal.com 2015-07-11 05:51 am (UTC)(link)
Не соглашусь. Профайлера утечек памяти из-за ленивости у хаскеля, насколько я знаю, до сих пор приличного нету. Имеющиеся режимы профайлинга памяти почти совсем не помогают, а только слегка намекают. В C#, Java, даже C++, по крайней мере по моему опыту, такого не бывает: если у программы есть проблема, то прикладываешь профайлер (памяти ли, процессора ли) и проблема как на ладони, осталось только пофиксить. Профайлеры памяти у Java и C#, типа YourKit, вообще невероятно мощные, хаскелю до этого расти десятки лет.
Для меня это перекрывает бойлерплейт, и при всей моей любви к хаскелю в серьезном проекте я его использовать не хотел бы именно из-за того, что если что-то пойдет не так, то будет кирдык, особенно если программа напичкана какими-нибудь абстракциями высшего порядка. Профайлер скажет что-нибудь вроде "так у вас списки текут!" и приехали.
Когда сделают приличный профайлер или расширение системы типов, решающее такие проблемы, пересмотрю.

[identity profile] binf.livejournal.com 2015-07-11 09:35 pm (UTC)(link)
Я таки юзал YourKitd на F#-пе (охуенная вещь!) и могу это всё понять, но вы не совсем правы. Профайлер кучи, встроенный в Haskell Platform, на самом деле очень классный. Там есть все нужные группировки потребления - по центрам затрат, по типам, по модулям, по замыканием и плюс ещё пяток. Проблема с хаскель-профиоированием такая же как, и с почти любым софтом, разработанным изначально под линуксы - говёный front-end. Профайлер просто создаёт двоичный файл с расширением hp, который потом можно перевести в PostScript. Конечно такие костыли омерзительны и очень бесят. Для результатов профилирования надо интерактивные фильтры с удобной навигацией, графики и всё такое, а этого в хаскеле нет. У меня уже давно есть желание сделать на WPF утилиту вместо уёбищной hp2ps, но всё лень
Edited 2015-07-11 21:42 (UTC)

[identity profile] thesz.livejournal.com 2015-07-13 07:51 pm (UTC)(link)
Вот вы это кому другому рассказывайте, пардоньте.

В отчёте профиля ghc RTS я нахожу проблемное место прямым глазением в подобие дерева в текстовом виде. Часто даже этого не надо, пяток самых тяжёлых функций наверху мне услужливо привели. В отчёте VS 2012 я, если специально не указал нужный модуль в качестве единственного, вообще ничего найти не могу. А если указал, то мне надо сделать десять раскрытий дерева и всё равно можно промахнуться. Например, две функции занимают, примерно, по 20%, но в одной десять вызово по 2%, а в другой, чуть ниже, есть горячий вызов в 18%. И вот ты сидишь, и пялишься на этот тупой список в 10 вызовов.

(не говоря уж о том, что оптимизиррованный код оставляет new промежуточных данных!!!)

В VS я вообще почти на ощупь работаю. Удивительно ущербная система, от тестирования (smallcheck? хаха!) до отладки (eventlog? хаха!).

[identity profile] metaclass.livejournal.com 2015-07-13 08:46 pm (UTC)(link)
Какой еще eventlog, log4net или NLog наверно надо :)

[identity profile] antilamer.livejournal.com 2015-07-14 12:30 am (UTC)(link)
Профайлер производительности у хаскеля действительно хороший. Я говорю про профайлинг памяти (а именно - поиск места, где я забыл добавить строгости).

Я помню, что https://github.com/jkff/timeplot/commit/5eba586188e0767c1cf59bc43c45d71ea7e73752 или какой-то похожий коммит у меня занял несколько дней, т.к. профайлер показывал мне какую-то бесполезную бурду (я уже не помню - может, стеки cost centres тогда не умел показывать?), и мне пришлось написать https://hackage.haskell.org/package/htrace, чтобы найти утечку. Возможно, с тех пор ситуация улучшилась - надо будет попробовать откатиться до того коммита и посмотреть, что мне покажет сегодняшний профайлер памяти.

В идеале, я бы хотел видеть профайл количества живых санков и занимаемых ими байтов, разбитый по стекам cost centres, так же как для профайлинга производительности. Такое уже есть?

(Профайлером VS я не пользовался, но в YourKit у меня, кажется, описываемых проблем не было.)

[identity profile] thesz.livejournal.com 2015-07-16 12:39 pm (UTC)(link)
У меня не настолько длинные строки, тем не менее, код структурирован примерно так же.

Я тут недавно баловался профилированием, проблем с поиском проблемных мест не было. Были трудности, как исправить.

Мой анекдот против вашего анекдота.

Насчёт "такое уже есть" это вам лучше самому проверить. Мне хватает отчёта +RTS -p. Дерево вызовов там точно есть, с суммарной и отдельными стоимостями.

[identity profile] thesz.livejournal.com 2015-07-16 12:40 pm (UTC)(link)
На всякий случай - функционал +RTS -p не менялся вот уже лет восемь, думаю.