суббота, 10 сентября 2011 г.

Ускоряющий инлайнинг

Компилятор GHC достаточно хорошо оптимизирует, когда код свален в одну кучу в одном модуле. Исполняется быстро, но с таким кодом работать неудобно. Так в одной куче у меня код долго и оставался, пока сегодня не попробовал прагму компилятора INLINE, которая подобна конструкции inline в C++.

Без этой прагмы после разбиения кода на модули, некоторые тесты стали отрабатывать медленнее в 3-4 раза на счетных задачах. Тогда я прогнал один из тестов через профайлер, и затем добавил прагму самой долгоисполняющейся функции. Я с самого начала догадывался, что эта за функции, а профайлер лишь подтвердил мое предположение.

Так вот, чудесная новость состоит в том, что прежняя скорость вернулась, какой она была до разбиения программы на модули. Другими словами, некоторые вещи ускорились в 3-4 раза.

среда, 30 марта 2011 г.

Портировал одну свою работу на хаскель

Портировал свою библиотеку имитационного моделирования Айвика с F# на хаскель. Зарелизил самую первую версию 0.1 на Hackage DB вместе с 51-страничным описанием в формате PDF.

Умеет этот порт многое. По сравнению с версией для F# дизайн стал чище, а реализация тем более. Вначале даже пытался бороться с чистотой через unsafePerformIO, копируя один в один подход из F#, за что получил от оптимизирующего компилятора. В итоге понял, что чистота — это благо. Научился ее использовать.

В общем, получил море позитива. Доволен результатом.

пятница, 4 марта 2011 г.

Маниловщина


Иногда очень хочется, чтобы F# был отделен от .NET. Чтобы программы на нем работали под юниксами и виндой без использования тяжелой виртуальной машины. Или, как минимум, все его новшества были портированы в окамл. Уж больно F# хорош!


Однако реализация F# иногда хромает. Например, в нем есть такие костыли как OptimizedClosures.FSharpFunc и FSharpFunc.InvokeFast. На деле это означает, что при вызове функции со многими аргументами задействуется RTTI, чтобы узнать, а есть ли прямой вызов функции, минуя каррирование. Во многом потому, что это снизу .NET. Подозреваю, что в окамле такой вызов функции сильно оптимизирован, и он не использует RTTI.

понедельник, 1 ноября 2010 г.

Simtegra MapSys v4.0

Мы выпустили четвертую версию приложения Simtegra MapSys. Это визуальная среда моделирования для системной динамики (имитационное моделирование). Программа создает иллюзию простоты для пользователя, хотя я понимаю, что внутри она устроена очень непросто. В этом ее ценность для меня как разработчика.

Всего разработано мною более 240 тысяч строк кода на C# вместе с сопутствующими библиотеками. Пока еще можно двигаться вперед, используя Far и jEdit, изредка загружая Visual Studio C# Express для отладки. Подавляющая часть кода была создана при помощи замечательного редактора jEdit. А в последнее время стал все чаще использовать Far в качестве редактора... Для сборки сначала использовал NMAKE, потом перешел на MSBuild. Пока еще используем .NET v2.0 и WinForms.

среда, 6 октября 2010 г.

О логике, математике и программировании

Навеяно одними однотипными высказываниями на форуме одного индивидуума.

Человек не рождается с умением логически мыслить. Логика – это искусственное изобретение человеческого разума. Она противоестественна тому, как мы на самом деле мыслим. Даже в логических законах Аристотеля спустя почти две с половиной тысячи лет современными математиками была найдена ошибка. А если сам Аристотель ошибался, то что остается нам, простым смертным?

Возьмем математику. Многие выдающиеся решения контр-интуитивны. Должно снизойти какое-то откровение свыше, должна быть необычайная интуиция, чтобы уметь решать сложные математические задачи. Места логике в чистом виде здесь нет. Мы – не машины. Вот там – действительно непробиваемая логика. И эти машины, кстати, мыслить не умеют. Хаос – атрибут разума, того самого разума, который породил логику и машины.

А программирование в этом вопросе мало отличается от математики, только масштабы сильно скромнее.

суббота, 18 сентября 2010 г.

Размышления о движке моделирования

Я часто думаю на эту тему. О некоторых вещах уже писал. Попытаюсь собрать все воедино, чтобы потом, уже по прошествии некоторого времени, сам смог бы перечитать. Пишу для себя. Надеюсь, что в никакие агрегаторы и планеты не попадет.

Создал два очень разных движка: MapSim и Aivika.

1. Первый – MapSim (лицензия LGPL). Генерирует очень быструю симуляцию, даже удивительно быструю. Но умеет только системную динамику. Очень узкая область. Движок очень хорошо делает свое дело, хотя даже в таком качестве MapSim может показаться отступнически революционным, ибо целиком написан на C#, а не на популярных в этой области Си или Си++ с Фортраном.

2. Второй – Айвика (лицензия BSD). Фантастически универсальный движок. Умеет самые разные парадигмы имитационного моделирования. Но редкостный тормоз на задачах системной динамики (интегралы чудовищно неэффективны). Дискретное событийное моделирование более-менее (быстрый двоичный хип). Скорость же процесс-ориентированной дискретной симуляции сильно зависит от качества реализации системы памяти (создается много легковесных функций) и хвостовой рекурсии (.NET на порядок быстрее, чем Mono), но в целом медленная симуляция. Агентное моделирование медленнее, чем в AnyLogic, но я думаю, что приемлемо. Еще движок Айвика – это полный переворот сознания для обычного модельера. Трудно для понимания.

В общем, два антипода. Есть идея скрестить их. Это возможно благодаря универсальности Айвики. Тут два момента.

1. Симуляцию, сгенерированную с помощью MapSim, можно представить как вычисление в монаде моделирования Dynamics. Это значит, что такую симуляцию можно использовать в Айвике как равноправную. Есть накладные расходы, связанные с оборачиванием итерационного процесса, порождаемого MapSim, в небольшую прослойку, которая будет выглядеть внешне как динамический процесс Dynamics. Нужно будет где-то хранить значения выходных переменных. Чем меньше переменных на выходе, тем быстрее эта прослойка. Придется повозиться.

2. Внутри симуляции под управлением MapSim можно использовать вычисления в монаде Dynamics. Другими словами, MapSim может использовать модели Айвики. Накладные расходы минимальны. Реализовать очень просто.

Теоретических проблем нет. Все должно работать. Я уже продумал. И если бы я снова стал создавать визуальную среду моделирования Simtegra MapSys, то сейчас уже взял бы за основной общесистемный движок Айвику, а системную динамику оптимизировал бы с помощью MapSim. То есть, я очень серьезно отношусь к Айвике, хотя с первого взгляда она может показаться просто игрушкой функционального программирования :)

пятница, 17 сентября 2010 г.

CodeDom для F#

Сегодня взял свою библиотеку MapSim, которая умеет создавать код через CodeDom, и заменил СSharpCodeProvider на FSharpCodeProvider из F# PowerPack. Сработало! MapSim по заданному входу сгенерировал код на F#. Только местами забавный код получился. В одном месте создаются исключения только для того, чтобы их тут же перехватить. Странно как-то. Но в целом качество кода сопоставимо с тем, что у меня создает стандартный провайдер C#.