This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2017-10-02
Channels
- # beginners (98)
- # bigdata (1)
- # bitcoin (1)
- # boot (32)
- # cider (20)
- # cljs-dev (57)
- # cljsrn (130)
- # clojure (93)
- # clojure-dusseldorf (1)
- # clojure-germany (1)
- # clojure-greece (3)
- # clojure-italy (2)
- # clojure-russia (203)
- # clojure-spec (14)
- # clojure-uk (50)
- # clojurescript (127)
- # css (7)
- # cursive (6)
- # data-science (1)
- # datomic (4)
- # emacs (1)
- # events (1)
- # fulcro (8)
- # funcool (12)
- # graphql (7)
- # jobs (1)
- # lein-figwheel (2)
- # luminus (2)
- # off-topic (7)
- # om (16)
- # onyx (4)
- # parinfer (17)
- # pedestal (6)
- # portkey (36)
- # proton (3)
- # re-frame (10)
- # shadow-cljs (140)
- # spacemacs (12)
- # specter (1)
- # sql (1)
- # vim (10)
- # yada (10)
товарищи, читая твиттер, который сравнивал hello-world питона и раста https://twitter.com/playpausenstop/status/914218443443929089, решил перепроверить и дополнить https://github.com/razum2um/hello-http-bench чет результаты сильно подозрительные (в нашу сторону). ничего специально не делал, но цифры отличаются в разы. что с ними может быть не так?
@U04V1HS2L в aiohttp выруби логгер и uvloop возьми - будут сильно другие цифры.
@U050HDACA если честно, я не питонист, взял код из твиттера. можешь PR?
@U04V1HS2L принимай.
@U050HDACA улучшилось, но не намного если честно..
у меня пока главное подозрение speed-step интела, т.е. 4ghz это максимальная частота и она не мгновенно прыгает в максимум. по хорошему надо тестить на воспроизводимой машинке типа инстанса амазона (причем не t* burstable)
угу. но ожидаемо. там скорее уже в одно ядро упирается и больше не вытащить без скейла. кстати rust/clojure тоже по ядру используют?
на счет воспроизводимости мысль хорошая, но уже есть https://www.techempower.com/benchmarks/ - переизобретать не вижу смысла, если только для своих железок / кейсов.
замечу что в clojure нету роутинга совсем.. а в питоне он есть, и достаточно тяжелый https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web_urldispatcher.py. про раст не знаю
а с кложей... возможно jit сотворил чудеса. я бы поменял на отдачу чуть разных значений все время (ну хоть бы счетчик дописать в респонс)
@U6VVC5CTZ да, про роутер мне уже сказали
tl;dr - по тесту Serialize a object to JSON and return application/json
response. - aiohttp медленнее wsgi в несколько раз
этот бенч сильно устарел. с тех пор aiohttp получил много оптимизаций и сишный http парсер.
@U6VVC5CTZ чет добавил вывод текущих секунд с ответ rust/clj - результат немного меньше, но варьируется вокруг тех же результатов
там гил никак не обходится, просто асинхронное io. на отдаче hello-world это скорее минус, а вот когда пойдут вебсокеты, тормозные клиенты и микросервисы, то будет профит.
@U04V1HS2L так сколько у тебя ядер ?
@U050HDACA про что и реч - асинхронность даром не дается. в кложе юзается синхронный ring/jetty, про раст молчу 😃
конечно, если выкрутить клиентов больше чем тредпул синхронных серверов то приплывем
да, минимум 8, макс 50 https://github.com/ring-clojure/ring/blob/master/ring-jetty-adapter/src/ring/adapter/jetty.clj#L103
кстати о hello world, вспомнилось: https://github.com/squeaky-pl/japronto (:
@U04V1HS2L если клиентов будет больше чем тредпул - ничего не будет
@U050HDACA рискну предположить что брешут 😄
@U6VVC5CTZ не удивлюсь, хотя не проверял. Хотя затюниться под hello-world и выдать вау эффект не сильно большое дело. А потом долго и упорно фиксить все срезанные углы.
@U6VVC5CTZ не понял как выкинуть роутер, все ридми aiohttp с ним, фиг с ним, с async, добавил руби, сделал по одному воркер-треду на сервер и 1 тред wrk. разница с растом конечно сократилась но расклад остался. я конечно понимаю что это бессмысленно по сути итд, но меня зацепил факт, что я не могу объяснить разницу перед тем как лезть на уровень ниже хотел убедиться, что не упускаю чего-то элементарного
@U04V1HS2L а никак ты не выкинешь роутер. хочешь быстрее - не юзай aiohttp, юзай asyncio напрямую 😃
@U6VVC5CTZ да я забил на питон, а вот на руби/кложе пишу и растом активно интересуюсь
и практически не сомневался утром, что кложа сольет расту, хотел просто посмотреть насколько
@U04V1HS2L можешь ради интереса запустить на своем железе https://github.com/anjensan/hello-http-bench/commit/21ca0d10e13ca6b63eb04b64c13df67c333b4432 - "классический вариант" (синхронный на WSGI)
@U6VVC5CTZ ты бы еще на сокетах написал (;
@U050HDACA а что не так то 😉 ?
но простите - на clojure мы юзаем jetty (на чисто джаве). на ruby - юзаем puma, где 15% C-шного кода...
и это не оптимизация - это минимальный web-helllo-world на python в стандарте WSGI. который можно зпустить в uwsgi, twisted, cherrypy, etc...
ну и если что >> Ring is a Clojure web applications library inspired by Python's WSGI and Ruby's Rack.
@U04V1HS2L если что парамтр -p - сколько змей запускать. так что можно несколько запустить и и забыть про GILы
@U6VVC5CTZ только почему то аномально низкий результат вышел. ты сам запускал?
во вторых у меня
> [uwsgi-http] unable to connect() to node “127.0.0.1:58755” (0 retries): Operation timed out
при том, что я запустил 8 процессов и wrk -c 8 -t 1
@U6VVC5CTZ на 2ке значит? и? у меня прям аномально низкие результаты
@U050HDACA там еще число дофигачивается
погоди, ты юникорном отскейлили свое приложение по ядрам - оно естественно будет быстрее (:
@U050HDACA так uwsgi я тоже скейлил по ядрам
python тоже какбы все ядра юзает. просто у него в самом сердце сидит такой нехороший мьютекс... который всю малину портит 🙂
@U6VVC5CTZ если не сложно запости результат питончика в сравнении с любым другим по выбору. у меня что uswgi что gunicorn не больше 500 rps (пробовал уже и --enable-threads и разную конфигурацию wrk, и на том компе где остальное, и на макбуке дома.. понимаю, херня какая-то)
убрал лимит по тредам из clojure. югикор запустил с 8 воркерами (у мну 6 физ ядер). тестил при помощи ab -n 500000 -c 100, результаты gunicorn: 14135 rps clojure: 14500 rps
короче засада наверное в том, что это была 1) макось с настройками не для бенча 2) премия лучшего растамана среди кложуристов не достанется никому, ибо я тестил нерелизный билд
справедливость восстановлена для раста и такого сишного-пресишного 🙂 вебсервера в рубях.
всем спасибо мир вернулся на место
@U6VVC5CTZ и напоследок я немного упоролся затачивая кложу под latency, если будет время и желание из спортивного интереса - попробуй что-нить еще сделать? yourkit tracing мне показывает, что сейчас уперлись в основном в jetty.HttpOutput.close…
Наткнулся на либу типа клары, только кажется более кложуристую на мой взгляд: https://github.com/CoNarrative/precept
кажется это обёртка над кларой
@U0EJUF3KQ а расскажи, пожалуйста, про эти самые правила? я не встречал, хочу понять юз-кейс, с ходу не очень ясно
Precept wraps Clara, a ground-up implementation of the Rete algorithm in Clojure and Clojurescript.
Идея на сколько я понимаю простая: пишешь правила вида если произошло это событие, то сделай это. Потом начинаешь сессию и в эту сессию накидываешь события (факты). Соответственно триггерятся разные штуковины. Интерес конкретно данной либы, что тут факты как в датомике, а не рекордами как в кларе (под капотом они всё равно рекорды думаю, но тем не менее)
@U0NBJDK4N самый классический пример сессии в движке правил - пациент с симптомами, на основании которых назначается и исключается лечение
потому что написать универсальную ветвистую ифочку для всех комбинаций сыпи/температуры/боли/аллергий/уже принимаемых препаратов/и тд. – "проблематично"
Да, теперь понятно, спасибо!
Привет! Кто как в clojure делает формы для админок? Будет ли интересно следующее? Ключевой момент. Все это для backend. Программис не пришет ни строчки фронтенда. 1. В html вставили js скрипт из cdn 2. Написали clojure.spec для данных формы, или взяли существующую 3. Поставили из jar пакет, который из спеки делает описание формы 4. Дополнили это описание названиями заголовков, указали тип виджетов и прочие настройки 5. Передали в функцию из пакета описание формы и сами данные, получили кусок html, для вставки на страницу Т.е. форма на js с виджетами селекта, селекта даты, селекта с автокомплитом, поддержка cljojure типов, вроде keyword, и т.п. Программист не пишиет сам js/cljs/css совсем. Для валидации даннные отпраляются на сервер. Возможно будет некий адаптив, что бы оно прилично вписалось в дизайн страницы. Насколько вам больно делать формы? Нужно ли это? Полезно ли подобное для других языков? puthon, erlang, node.js, ruby
@kuzmin_m если чесно я не понял, что за 5 пунктов? если тебе нужна библиотека компонентов, то я точно помню, кто-то спаривал бутстрап, недавно видел вот такую имхо приятную на вид вещь https://priornix.github.io/antizer/latest/examples/reagent.html
речь не про компоненты, но за ссылку спасибо. речь про то, что бы по спеке генерить форму
@U04V1HS2L или непонятно?
ну последнее то библиотеки компонентов+css-бандлы решают. вот кстати бутстрап http://yogthos.github.io/reagent-forms-example.html
тебе нужно руками собрать форму из компонентов, конвертировать типы, т.е. были кейворды, а в форму нужно передать строки
допустим (только для упрощения) у нас была бы акторная модель по актору на пользователя и ты хочешь, чтобы данные с формы магически оказывались с правильными типами в акторе на беке?
итого по спеке генерится описание это описание патчится руками ну был у тебя в спеке (s/def ::password string?)
например https://github.com/Day8/re-com/ http://re-demo.s3-website-ap-southeast-2.amazonaws.com/#/date
мне лично тяжело сказать, года 2 назад у меня был чистый cljs, тогда еще схемы не было, был om+sablono, чего-то более декларативного не хотелось. html это вполне декларативно. но далеко от бизнес логики, да
ты на сервер сгенерировал html, а он его подцепил и сделал возможность добавлять/удалять вложенные формы
мм, хз. я последнее время склоняюсь к умным spa клиентам (конечно от проектов зависит, у меня так), но фронт пока это redux или мобилка RN с тем же redux, поэтому уносить что-то кроме логики на сервер не хочется, чем больше клиент может тем лучше имхо
короче, сделать, чтобы бек быстро накидывал админки, т.е. скорее опять вернулись к simple_form (если думать гибко и не рождать АА) так?
тогда всетаки ActiveAdmin (AA)? (если с прищуром принять схему базы за схему данных)
в общем цель чтобы бек быстро накидал админку хорошая, но почему такой изврат тогда? почему не генерить html на сервере постаринке
да. перепиши, плиз, чтобы цель была сверху и что “не пишиет сам js/cljs/css” это не оптимизация усилий фронта, а имено для бека, конкретные шаги можно спрятать, ибо спорно (сколько чего где делать) 🙂
@kuzmin_m Я видел такое пару раз (не на clojure) и это жило ровно до того момента, пока не требовалось каких-то специальных контролов на клиенте. А после этого либо всё целиком сносилось и переносилось на клиента (в лучшем случае), либо окружалось кучей хаков (в худшем).
тут как раз специальные контролы на клиенте что мешает сделать подключаемые виджеты? @dottedmag есть какой-то конкретный пример? была такая-то форма, сделали так-то, стало нужно вот это, не получилось потому-то
да. и всё это поломалось тогда, когда форму не получилось стыковать из элементов, а потребовались какие-то связи между ними.