?

Log in

   Journal    Friends    Archive    Profile    Memories
 

iamjaph

дек. 1, 2016 11:55 am От Haskell к Standard ML

От Haskell к Standard ML: http://by-need.blogspot.com/2016/12/haskell-standard-ml.html

Метки: ,

Оставить комментарий

ноя. 29, 2016 09:32 am Haskell: ошибка в Mio...

Кажется, в Mio ("Scalable IO Manager") есть ошибка.
Mio - это IO менеджер для threaded режима в GHC 7.8 и выше.
В сервере, при превышении определенного размера данных, происходит зависание треда.
Mio считает, что писать в сокет еще нельзя, а на самом деле можно.
Проверил на GHC 7.8.[34] и 8.0.1.
В не-threaded режиме зависания нет, все работает.

А ведь считал, что основное преимущество Haskell - это "зеленые нитки" с многопроцессорностью при высокой скорости. А тут, оказывается...

Метки:

Оставить комментарий

ноя. 15, 2016 09:58 am Однокласница сына сильно заболела: ревматический артрит.

Однокласница сына сильно заболела: ревматический артрит.
Ее сестра просит всех о помощи - https://vk.com/id333229995
Нужен курс длительного лечения препаратом Actemra, а одна ампула его стоит около 12 тыс гривен...
5168 7572 2604 8942 (Павлусь Кристина Юрьевна) - ПриватБанк.

Оставить комментарий

сент. 29, 2016 10:38 am Haskell: почему-то замена списка пар и поиск на дата-тип и патерн-матчингом снизила скорость

Haskell не перестает удивлять меня!
Есть старый проект https://github.com/kni/redis-sharding-hs-strict.
В нем для определение типа команды используется поиск по списку пар:
https://github.com/kni/redis-sharding-hs-strict/blob/master/RedisSharding.hs#L59

Давном-давно thesz посоветовал заменить это на дата-тип.

Заменил на:

 data CmdType = 
    CmdToAll         -- На все сервера
  | CmdToOne         -- На конкретные сервер
  | CmdToMany        -- На множество серверов. CMD key1 ... keyN
  | CmdToManyValues  -- На множество серверов. CMD key1 value1 ... keyN valueN
  | CmdToManyTimeout -- На множество серверов. CMD key1 ... keyN timeout (блокирующие команды)
 
 
 cmdType "PING"             = Just CmdToAll
 cmdType "AUTH"             = Just CmdToAll
 ....

Ожидал рост производительности, но получил ухудшение на 20-25%!

Измерял при следующих условиях, и, разумеется несколько раз и разной очередности:
 cpuset -l 0 ./redis_sharding --port=8090 --nodes=127.0.0.1:8081,127.0.0.1:8082,127.0.0.1:8083,127.0.0.1:8084 +RTS -s -N1 -A10M -qa
 redis-benchmark -p 8090 -n 10000 -c 10 -q -t set,get,mset -P 10

Вот результат профилирования (при профилировании замедление меньше).

Старая версия:
 COST CENTRE                             MODULE                              %time %alloc
 throwSocketErrorIfMinus1RetryMayBlock   Network.Socket.Internal              12.2    0.5
 endOfLine                               Data.Attoparsec.ByteString.Internal  11.5    7.5
 servers_sender                          RedisSharding                        10.0   13.2

А вот - новая с data CmdType:
 COST CENTRE                             MODULE                              %time %alloc
 cmdType                                 RedisParser                          12.5   12.4
 throwSocketErrorIfMinus1RetryMayBlock   Network.Socket.Internal              11.9    0.4
 endOfLine                               Data.Attoparsec.ByteString.Internal   9.2    6.4

Почему?!

UPDATE.
Загвоздка была, в том, что cmdType, так как много строк, поместил в другой файл, а не в тот, где case cmdType cmd of

И Haskell не смог оптимизировать. Когда все слил в один - скорость вернулась!!!
Метки:

13 комментариев - Оставить комментарий

сент. 13, 2016 04:47 pm Haskell - что-то с ленью все таки не то...

Haskell - что-то с ленью все таки не то...
http://by-need.blogspot.com/2016/09/lazy-bytestring-haskell.html

Метки:

Оставить комментарий

фев. 8, 2015 05:54 am Путин признал Россию агрессором

Путин в очередной раз признал Россию агрессором. Обратите внимание, как он говорит: "не позволим СДЕРЖИВАТЬ геополитические интересы России". Именно сдерживать, а не ущемлять.

Оставить комментарий

авг. 22, 2012 10:29 am GHC и Perl benchmark в свете CPU и разрядности OS

Есть у меня одно старое приложение в полтысячи строк реализованное на Haskell и на Perl.

На старых процессорах: "Intel(R) Xeon(TM) CPU 2.66GHz", "AMD Sempron(tm) Processor 2800+", - Haskell быстрей Perl в 4.2 раза. Но на относительно новом ноутбучном "Intel(R) Pentium(R) CPU P6200 @ 2.13GHz" разница уже составляет 5.7 раз. Это на FreeBSD 9.0 32bit. Версия Perl - 5.12, из FreeBSD package.

Далее для AMD Sempron(tm) Processor 2800+.
Если поменять 32bit архитектуру на 64bit, Perl ускоряется в 1.2 раза, что связано с использованием use64bitint под 32bit архитектурой. Для GHC 7.4.2 наоборот наблюдается небольшое снижение производительности: 1.08. Для GHC 7.0.3 скорость не зависит от разрядности архитектуры.
GHC 7.4.2 быстрей GHC 7.0.3 в 1.13 раза под 32bit и в 1.05 под 64bit.

Метки: ,

Оставить комментарий

июн. 12, 2012 11:13 am Прагматизм и Haskell

Два года назад Haskell привлек меня своей отличной поддержкой параллельных вычислений и "ну не может быть call-by-need язык настолько сложным, как о нем говорят". Erlang после OZ "не пошел".

О Haskell также говорят, что это академический язык, мало пригодный на практике.
Как не пригодный? Ведь для него так много библиотек. Я мне много и не надо: поддержка работы с kqueue (epoll), LWP аналог, DBI, JSON и HTML парсеры.

Так как поддержка kqueue (epoll) появилась в GHC 7.x, то я взял Haskell и написал свое первое приложение. Правда для подстраховки перед этим сделал Perl вариант. Perl хорош тем, что дает много свободного рабочего времени, чтобы заняться Haskell. С третьей попытки Haskell версия стала выглядеть не хуже Perl версии, и даже немного лучше, и имела производительность в два раза выше. Но из-за кривой Python библиотеки, используемой клиентом, пришлось на сервере включить буферизацию и производительность упала в эти два раза. Но зато осталось отличное использование памяти. Все стлало работать отлично, после того как разработчики GHC сообщили, что kqueue в GHC 7.0.1 по умолчанию не используется, а активируется косвенно в threaded режиме.

Но вернемся к Haskell. Haskell в первую очередь академический язык. А в академиях свои порядки: в год необходимо опубликовать не меньше столько-то статей, размер диссертации должен быть не меньше столько-то страниц, литературных источников нужно не меньше такого-то количества. А кто их все читает эти литературные источники, в большинства случаев? Так, по парочки страниц в каждом.

Такое впечатления, что те, кто пишут на Haskell, по диагонали читают статьи и о самом Haskell. Это относиться, к сожалению, и к авторам base пакета. Чувствую, что преувеличиваю, но факт остается фактом: используя совет из документации, сразу словил ситуацию гонки. Хорошо, что недавно читал статью про асинхронные исключению. Но это прошлое, написанный сервер без проблем работает полтора года, так что вернемся в настоящие.

С быстрым HTML парсером мне помог vshabanov.livejournal.com, большое спасибо ему.

Сейчас мне нужно работать с базами данных (Pg и MySql). Для работы с базами рекомендуют использовать HDBC и Takusen, но в последнем нет поддержки MySql. Недавно появились postgresql-simple и mysql-simple. Берем проверенный временем HDBC, о котором написано, что он сделан по образу и подобию Perl DBI, но лучше, так как использовался опыт Python's DB-API v2, JDBC in Java.

Ой! Где в HDBC поддержка prepared statement на стороне сервера?! Я не требую поддержки асинхронность, которая давно есть в Perl DBD::Pg и в упрошенном, но достаточном виде, 2 года как появилась в DBD::mysql и самом DBI. Я хочу лишь поддержку prepared statement на стороне сервера, баз которой быстрая работа с базами данных не возможна.

Справедливости надо сказать, что в Takusen есть поддержка prepared statement на стороне сервера и для PostgreSQL, и для Oracle.

Но как-же HDBC? Для postgresql нет вообще, а для mysql, сюрприз, есть. Но какая. После execute сразу вызывается mysql_stmt_close, что делает все prepared statement одноразовыми. Да и самом HDBC не предусмотрена поддержка этого. Чтобы ее добавить придется согласовать действия автором всех HDBC пакетов.

Если сравнивать с Perl DBI, то такое ощущение, что вернулся в прошлое.

Что делать? Какие меня ждут впереди неприятные сюрпризы от Haskell? Стоит время тратить на Haskell или использовать Perl с IPC::MPS, EV, Coro и DBI?
Ведь имея IPC::MPS, который я написал по мотивам Erlang и OZ, и при наличии MultiAgent (Multiplicative Agent поверх IPC::MPS), написанного с оглядкой на OZ, с учетом их интеграции с EV и Сoro, мой Cloud Perl не хуже, чем Cloud Haskell. :-)

Ну, что же с тобой делать, Haskell? Стоит ли твой игра свеч? Я в замешательстве и раздумьях...

P.S.
Оказывается в Python библиотеках также не используется prepared statement на стороне сервера.
Теперь понятно, почему люди говорят, что NoSQL быстрей YesSQL, а мои тесты говорят, что PgSql и MySql дают не производительность не хуже

Метки: ,

7 комментариев - Оставить комментарий

дек. 26, 2011 10:37 am Ищется Дед Мороз со знанием Haskell

Не принес мне Haskell под новый год подарок :-(

После успешного проекта под названием RedisSharding, решил я сделать второй также на Haskell, а не на Perl.

Задача: как можно быстрей загрузить и распарсить множество HTML страниц - Web Shpider.

Как раз задача для Haskell, поскольку у него самые легкие потоки, а задача легко параллелиться.
Читать дальше...Свернуть )

Наверно, придется взять Perl, Coro, и сделать просто и эффективно!
Тем более, что Marc Lehmann этим летом пофиксил один нехороший момент в связке Coro и AnyEvent.

Или может подоспеет "помощь зала"?

Метки: ,

38 комментариев - Оставить комментарий

июн. 29, 2011 10:03 am Почему Haskell

Haskell - простой и мощный язык, позволяющий с легкостью описывать высокоуровневые абстракции.

Простота языка, ленивость и легковесные потоки позволяют без труда использовать data flow execution стиль.

А data flow execution стиль настолько удобен по сравнению с message passing cтилем, насколько последней удобен по сравнению с голым event-driving programming.

Яркие представители стилей:
* data flow execution - Mozart-OZ
* message passing - Erlang
* event-driving programming - все, с нормальной лямбдой (без нее можно, но не совсем удобно).

Метки: , ,

Оставить комментарий

Back a Page