Звезды, секунды и сборка мусора
Jun. 13th, 2012 02:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Решил на июньском конкурсе _darkus_'a испытать в деле язык D, о котором недавно читал книжку Александреску*. Первый вариант, написанный без мыслей об оптимизации (кроме общего выбора алгоритма), работает на моем рабочем Core 2 Quad 59 секунд. Стал пробовать его ускорить и быстро увидел, что почти все время уходит на сборку мусора, т.к. в процессе вычислений создается много небольших временных данных. Аналогичный вариант на окамле, также бездумно выделяющий много раз память в процессе выполнения, отрабатывает за 29 секунд. Хоть мелких телодвижений там больше, и арифметика в окамле не супер быстрая, а общая скорость все равно двое больше за счет быстрого generational сборщика мусора. В D сборщик примитивней - без поколений, без компактификации, частично консервативный и требующий больше усилий для отличения указателя от неуказателя. Если же в решении на D в основном вычисляющем цикле избавиться от лишних выделений памяти, задействовав массив на стеке и более примитивный код, временно отключить GC в момент парсинга входных данных, да еще задействовать модуль parallelism из стандартной библиотеки, то получится вариант, который у меня отрабатывает полностью за 4.4 секунды.
* Обнаружил для себя хороший способ не просто скачать PDF'ку, но и прочитать ее целиком - нужно заплатить за нее деньги.
* Обнаружил для себя хороший способ не просто скачать PDF'ку, но и прочитать ее целиком - нужно заплатить за нее деньги.
no subject
Date: 2012-06-13 07:03 am (UTC)no subject
Date: 2012-06-13 10:46 am (UTC)no subject
Date: 2012-06-13 07:08 am (UTC)no subject
Date: 2012-06-13 07:15 am (UTC)no subject
Date: 2012-06-13 09:58 am (UTC)К D я отношусь примерно как к Scala - много правильного (ты вроде всё перечислил), но "а-а-а зачем этот лютый DSL-ориентированный треш".
Да, в погоне за скоростью я бы избавился от представления звёзд динамическими массивами.
no subject
Date: 2012-06-13 10:34 am (UTC)no subject
Date: 2012-06-13 07:55 am (UTC)no subject
Date: 2012-06-13 09:10 am (UTC)no subject
Date: 2012-06-13 10:35 am (UTC)no subject
Date: 2012-06-13 08:12 am (UTC)А модуль parallelism, это то, что я думаю? На 2 ядра распараллеливали?
no subject
Date: 2012-06-13 10:40 am (UTC)вместо
foreach(i, cell; cells.keys)
пишешь
foreach(i, cell; taskPool.parallel(cells.keys))
и все работает уже параллельно.
no subject
Date: 2012-06-14 06:06 am (UTC)А увидеть его можно?
no subject
Date: 2012-06-14 06:11 am (UTC)no subject
Date: 2012-06-13 10:08 am (UTC)no subject
Date: 2012-06-13 10:42 am (UTC)no subject
Date: 2012-06-13 12:02 pm (UTC)no subject
Date: 2012-06-13 12:21 pm (UTC)no subject
Date: 2012-06-24 04:42 pm (UTC)no subject
Date: 2012-06-24 06:43 pm (UTC)Довольно многословно, и непонятно нафига вообще регулярки понадобились (только для пущей схожести с перловой версией? ), но скорость при таком коде не такая уж плохая.
no subject
Date: 2012-06-25 02:02 am (UTC)no subject
Date: 2012-06-13 09:56 pm (UTC)no subject
Date: 2012-06-14 05:11 am (UTC)no subject
Date: 2012-06-14 06:41 am (UTC)no subject
Date: 2012-06-14 02:23 pm (UTC)