thedeemon: (Default)
[personal profile] thedeemon
Решил на июньском конкурсе _darkus_'a испытать в деле язык D, о котором недавно читал книжку Александреску*. Первый вариант, написанный без мыслей об оптимизации (кроме общего выбора алгоритма), работает на моем рабочем Core 2 Quad 59 секунд. Стал пробовать его ускорить и быстро увидел, что почти все время уходит на сборку мусора, т.к. в процессе вычислений создается много небольших временных данных. Аналогичный вариант на окамле, также бездумно выделяющий много раз память в процессе выполнения, отрабатывает за 29 секунд. Хоть мелких телодвижений там больше, и арифметика в окамле не супер быстрая, а общая скорость все равно двое больше за счет быстрого generational сборщика мусора. В D сборщик примитивней - без поколений, без компактификации, частично консервативный и требующий больше усилий для отличения указателя от неуказателя. Если же в решении на D в основном вычисляющем цикле избавиться от лишних выделений памяти, задействовав массив на стеке и более примитивный код, временно отключить GC в момент парсинга входных данных, да еще задействовать модуль parallelism из стандартной библиотеки, то получится вариант, который у меня отрабатывает полностью за 4.4 секунды.

* Обнаружил для себя хороший способ не просто скачать PDF'ку, но и прочитать ее целиком - нужно заплатить за нее деньги.

Date: 2012-06-13 07:03 am (UTC)
From: [identity profile] nponeccop.livejournal.com
Для меня это анекдот в пользу того, что не стоит прикручивать к сям гц.

Date: 2012-06-13 10:46 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Да, пожалуй. Ряд низкоуровневых фич языка делают эффективный GC почти(?) невозможным.

Date: 2012-06-13 07:08 am (UTC)
From: [identity profile] diam-2003.livejournal.com
Мне вообще всегда казалось, что Александреску в D решает какие-то странные проблемы идеосинкратического свойства.

Date: 2012-06-13 07:15 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Не знаю, мне сам язык весьма понравился, и книжка о нем приятно написана. Нативный код, не требующий больших ВМ, ФП, кое-какой вывод типов, развитые средства компайл-тайм безобразий без плюсовых извращений с шаблонами, GC, нормальный параллелизм и эрланг-стайл акторы - все это довольно вкусный набор.

Date: 2012-06-13 09:58 am (UTC)
From: [identity profile] diam-2003.livejournal.com
"Родной" GC, как ты сам заметил выше, глупый и медленный. Кстати, с чисто исследовательской точки зрения было бы забавно взять D Compiler for .NET и сравнить быстродействие решений, активно использующих GC.

К D я отношусь примерно как к Scala - много правильного (ты вроде всё перечислил), но "а-а-а зачем этот лютый DSL-ориентированный треш".

Да, в погоне за скоростью я бы избавился от представления звёзд динамическими массивами.

Date: 2012-06-13 10:34 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Я не уверен в живости D.NET. Можно в лоб на C# переписать и сравнить, это действительно любопытно будет.

Date: 2012-06-13 07:55 am (UTC)
From: [identity profile] dlebedev8.livejournal.com
Вы про D1 или D2? Тоже когда-то присматривался к этому языку, но разделение его на две несовместимые ветки отбило всякое желание изучать его дальше.

Date: 2012-06-13 09:10 am (UTC)
From: [identity profile] max klyga (from livejournal.com)
Там D2 код. Сейчас ветка D2 называется просто D, а D1 со следущего года прекратит получать обновления, так что с разделением тема закрыта.

Date: 2012-06-13 10:35 am (UTC)
From: [identity profile] thedeemon.livejournal.com
D2. D1 я не трогал и не вижу смысла это делать.

Date: 2012-06-13 08:12 am (UTC)
From: [identity profile] dimitrykakadu.livejournal.com
У меня получился камлёвый девятисекундный вариант на i3 без Lwt.

А модуль parallelism, это то, что я думаю? На 2 ядра распараллеливали?

Date: 2012-06-13 10:40 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Пара циклов (map и reduce по сути) там распараллеливается на имеющееся число ядер. Мне понравилась простота этого дела:
вместо
foreach(i, cell; cells.keys)
пишешь
foreach(i, cell; taskPool.parallel(cells.keys))
и все работает уже параллельно.

Date: 2012-06-14 06:06 am (UTC)
From: [identity profile] thedeemon.livejournal.com
>У меня получился камлёвый девятисекундный вариант

А увидеть его можно?

Date: 2012-06-14 06:11 am (UTC)
From: [identity profile] thedeemon.livejournal.com
А, уже появилась ссылка на исходник. Ок.

Date: 2012-06-13 10:08 am (UTC)
From: [identity profile] mtve.livejournal.com
алгоритм выглядит немного подогнанным под исходные данные, а если звёзд будет мало, и они будут дальше чем в соседних cell'ах?

Date: 2012-06-13 10:42 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Совершенно верно, подгон под данные имел место, на сильно других не сработает правильно.

Date: 2012-06-13 12:02 pm (UTC)
From: [identity profile] afiskon.livejournal.com
А я попробовал решить эту задачу на Go. Поверьте, в D со сборкой мусора все не так уж плохо :)

Date: 2012-06-13 12:21 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Хотелось бы увидеть код и узнать время выполнения.

Date: 2012-06-24 04:42 pm (UTC)
From: [identity profile] afiskon.livejournal.com
http://eax.me/go-lang/

Date: 2012-06-24 06:43 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
О, спасибо!
Довольно многословно, и непонятно нафига вообще регулярки понадобились (только для пущей схожести с перловой версией? ), но скорость при таком коде не такая уж плохая.

Date: 2012-06-25 02:02 am (UTC)
From: [identity profile] afiskon.livejournal.com
Я уже не могу без регулярок. Писал бы на Сях, тоже ими ввод парсил.

Date: 2012-06-13 09:56 pm (UTC)
From: [identity profile] boltatel.livejournal.com
А в нормальном человеческом С++?

Date: 2012-06-14 05:11 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Не слышал о таком. :)

Date: 2012-06-14 06:41 am (UTC)
From: [identity profile] nponeccop.livejournal.com
ну тогда на ISO C с ассемблерными вставками? :)

Date: 2012-06-14 02:23 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Хоть кто-то предложил правильный вариант! :-)

Profile

thedeemon: (Default)
Dmitry Popov

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 13th, 2025 12:15 pm
Powered by Dreamwidth Studios