?

Log in

No account? Create an account
I have never encountered this in any other language - Дважды мудак — ЖЖ [entries|archive|friends|userinfo]
Декларативное рулит

Site Meter

[ website | Мой сайт ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

I have never encountered this in any other language [июл. 5, 2019|13:20 pm]
Andy Melnikov
[Tags|, , ]

https://github.com/haskell/haskell-ide-engine/issues/1302

TLDR: всем похуй на потребление памяти
СсылкаОтветить

Comments:
[User Picture]From: dmytrish
2019-07-05 09:39 pm
Так а что делать-то, если без поллитры профайлера понять рантаймовое поведение даже какого-нибудь fold непросто?

Что делать, когда у sort time complexity это O(n log n), а у take 5 . sort complexity is implementation-defined и напрямую зависит от внутренностей sort?

Причем complexity может меняться зависимо от фазы луны опций билда и версии ghc.

Как в таком языке можно эффективно рассуждать о потреблении памяти?
(Ответить) (Thread)
[User Picture]From: nponeccop
2019-07-06 07:06 pm

Что делать?

То же, что и в других языках - профайлер иногда пускать да сравнивать реальное потребление с рассчитанным на салфетке.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-07 03:02 pm
Ну есть же Clean, который ровно тот же Хаскель, но работает быстро.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-07-08 07:11 pm
> ровно тот же

Ясно-понятно
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-08 07:42 pm
Раскройте тему, пожалуйста.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-07-09 01:49 am
Ну я слежу за GHC vs CClean с 1999 года, и GHC выигрывает по очкам
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-09 03:38 am
Ну понятно, что GHC выиграл, и давно. В Клине, например, нет многопоточности.

Но, кмк, вопрос об промышленном ленивом функциональном языке назрел и перезрел. И, собственно, тут у Клина есть некоторые возможности - Плазмеер и компания его бросили, пилят его Джон ван Гронинген, да Камил Стаплс. Соответственно, есть какая-то возможность, что оно стабилизируется. Хотя тут я, наверное, сильно оптимистичен.

Хочу отметить, что лично для моих мелких прожектов Clean как-то сильно приятнее GHC тем, что компилирует мгновенно. Комменты, конечно, у Haskell красивее, но чем-то надо жертвовать. Плюс, линейные типы прикольны.
(Ответить) (Parent) (Thread)
[User Picture]From: jakobz
2019-07-05 10:22 pm
У меня монорепа на 10 модулей, в сумме может метров 20 сырых исходников. Вебпак, тайпскрипт, лерна. Билдится минут 10, в это время даже мышка зависает.
(Ответить) (Thread)
[User Picture]From: rdia
2019-07-05 11:35 pm
Если дело не в памяти, есть такая команда nice -n 19.
(Ответить) (Parent) (Thread)
[User Picture]From: jakobz
2019-07-06 05:53 am
Дело в кривожопости вебпака. Вся эта хрень не задизайнена под инкрементальную компиляцию, и переиспользование промежуточных артефактов. В результате чтобы сбилдить каждый отдельный модуль, надо отпарсить и проверить типы во всей репе. N^2 сложность.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-05 11:34 pm
И это вы ещё не слышали говняний на Камл от профессионалов от криптографии!
(Ответить) (Thread)
[User Picture]From: rdia
2019-07-05 11:41 pm
It's written in an unusual programming language called OCaml, and in a fairly idiosyncratic dialect of it at that.

....

Not only do we need to be bright enough to understand an algorithm that's literally someone's Ph.D thesis, but we need expertise in obscure programming languages and strange programming customs.
(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-07-06 12:30 am
Это люди, которые вину предпочитают джин-тоник и ром-колу.
Я вот сегодня наслаждался чтением хорошо выдержанных в пещере на тенистой стороне холма исходников на смеси французского с английским в caml light:
...
and variable_de_type =
  { mutable Niveau: int;
    mutable Valeur: valeur_d'une_variable }

and valeur_d'une_variable =
    Inconnue
| Connue of type_simple;;

...
  match schéma.Paramètres with
  | [] -> schéma.Corps
  | paramètres ->
      let nouvelles_inconnues =
        map (fun var -> (var, nouvelle_inconnue())) paramètres in
      let rec copie ty =
        match valeur_de ty with
        | Variable var as ty ->
            begin try
              assq var nouvelles_inconnues
            with Not_found ->
              ty
            end
        | Terme(constr, arguments) ->
Terme(constr, map_vect copie arguments) in

:)
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 03:19 am
Ну тут достаточно курса матана, на котором мне объяснили, что Valeur Principale - это значит, считаем интеграл в смысле главного значения. А в остальном, в общем, известно все, кроме inconnues. :-)

---------------
А таки расскажите, зачем вам Caml Light?
(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-07-06 10:05 am
Да, value и valeur достаточно близки, а вот что motif это pattern я не сразу понял.

Это я просто смотрел разной степени игрушечности реализации вывода типов. В Caml Light есть в папке examples отдельная маленькая реализация небольшого ML.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 02:51 pm
Спасибо! А я подумал, что вы возвращаетесь к истокам - окамл сильно разросся в последнее время.
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-07-06 06:54 pm
да?
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 07:10 pm
Это подъебка или вопрос?
(Ответить) (Parent) (Thread)
[User Picture]From: nponeccop
2019-07-06 07:15 pm

Я не следил

Это вопрос с целью узнать, что там поменялось в масштабах последних 10 лет. Я не следил.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 08:32 pm

Re: Я не следил

За последние 9 лет:

1. PPX и все сопутствующее - выделены compiler-libs, новый синтаксис
для строк {ключ| |ключ}, etc.
2. First-class modules (несколько через жопу - синтакс нужно либо
целенаправленно заучивать, либо подсматривать).
3. GADTs.
4. Переработка Stdlib в скучно-бюрократическую форму, аля всякие Хаскели/Русты.

Ну и по-мелочи: наконец-то добавлены аналоги $: операторы @@ и |>,
typechecked printf, атрибут @tailcall (явная оптимизация хвостовой рекурсии),
печатаем кусок кода в сообщении об ошибках, а не просто строка/столбец.
Unicode в Виндах!!!

-----------------------------
Но я воняю на букву O, и говносинтаксис модулей. Особо меня бесит корпоративный код фирмы "улица Жени Егоровой". В частности, ppxlib и интерфейс командной строки у dune.

То есть, кмк, Алан Фриш пишет значительно качественнее, чем Джереми Д.
(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-07-07 08:43 pm
По-моему, Printf.printf проверял типы испокон веков. В 2007, когда я начинал, уже давно было. Возможно, механизм этого дела они поменяли..

Edited at 2019-07-07 20:44 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-07-06 12:34 am
Я наверное уже рассказывал, что на работе проект, собираясь, 13-14 гигов памяти ест. Потому дома я уже не могу его целиком собрать, только обрезанный вариант.
А все потому что компилятор использует отличную стратегию управления памятью: never free.
(Ответить) (Thread)
[User Picture]From: avnik
2019-07-06 02:08 pm
У меня иногда ощущение, что если ghc внутри местами поменять String на !Text ему сильно полегчает в плане памяти. (И всяким HIE/Intero тоже)
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 08:34 pm
Я на своих мелких проектах смотрел - никакой разницы Text-String не заметил. Вот ByteString действительно очень ускоряет, если, конечно, подходит.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-06 03:30 pm
А какой компилятор?
(Ответить) (Parent) (Thread)
[User Picture]From: thedeemon
2019-07-07 08:39 pm
LDC на винде, DMD в линуксе, они в этом отношении одинаковые.
(Ответить) (Parent) (Thread)
[User Picture]From: rdia
2019-07-07 10:21 pm
Спасибоё
(Ответить) (Parent) (Thread)
[User Picture]From: max630
2019-07-06 05:13 am
I have, рекурсивный msbuild так и параллелится - сказано ему 5 процессов, он и делает: папа пускает 5 солюшенов, каждый из них 5 проектов, каждый из них 8 CL.exe.
(Ответить) (Thread)