stdray: (Default)
stdray ([personal profile] stdray) wrote2012-09-29 03:39 pm

А что по скорости?

Регулярно можно видеть рассуждения, мол напишем за 20 минут наш проект на фичастом языке сверхвысокого уровня H, а критические по производительности участки кода сделаем на быстром низкоуровневом языке C. Что-то у меня ощущение, что об этом чаще говорят, чем применяют. Я поспрашивал знакомых программистов, тех что поближе, - подобным не занимаются. Один, говорит, пытался, а потом просто стал писать на плюсах. Даже в интернетах, читал о подобном только в исполнении [profile] levgem и [personal profile] lionet. В связи с чем пара вопросов:

1) Переписываете ли вы куски кода на низкоуровневом языке в угоду производительности?
2) Какой язык вы для этого используете?

Я ведь правильно понимаю, что нет других низкоуровневых языков кроме сишечки? Биндинги ведь только к ней делаются.

[identity profile] proofit404.livejournal.com 2012-09-29 11:48 am (UTC)(link)
Первое что пришло на ум это blender и mypaint - ядра проектов написаны на c и c++ соответственно, а вот всякая там скриптота на python

Сам таким не занимаюсь, т.к. за производительностью я ещё не гонялся.

[identity profile] stdray.livejournal.com 2012-09-29 11:53 am (UTC)(link)
Ну python он вообще какой-то такой. Там половина библиотек, по-моему, является обертками над Си.
Я тоже не гоняюсь, то есть еще не приходилось покидать уютный безопасный дотнет.

[identity profile] proofit404.livejournal.com 2012-09-29 11:58 am (UTC)(link)
пайтон конечно ниразу не язык моей мечты
но вот как скриптота в том же 3D вполне себе состоялся
на равне со своим собственным скриптоподелием поддержка пайтона есть в 90% графических пакетов

за дотнэт не знаю, но к примеру opencv к нему всётаки прикрутили для скорости опять таки для задач с изображениями

[identity profile] izard.livejournal.com 2012-09-29 12:08 pm (UTC)(link)
Переписываю ли я? Да 50% работы как консультанта по производительности из этого состоит. Правда, переписываю или сразу на асме, или на С с интринзиками.

[identity profile] zhengxi.livejournal.com 2012-09-29 12:11 pm (UTC)(link)
фичастая clojure и низкоуровневая java.
я так не делаю, но видел подобное на github

[identity profile] stdray.livejournal.com 2012-09-29 12:18 pm (UTC)(link)
Все таки встроенная скриптота, мне кажется, несколько другой вопрос, который к производительности отношения не имеет. В том же гейдеве LUA получила распространение, но пишется все именно на плюсах.

[identity profile] stdray.livejournal.com 2012-09-29 12:21 pm (UTC)(link)
А на чем как написаны проекты, которые вы консультируете?

>сразу на асме
Ого, а не слишком сурово? Как это потом поддерживать или запустить на новом_классном_дорогом_интелловском процессоре?

[identity profile] proofit404.livejournal.com 2012-09-29 12:22 pm (UTC)(link)
>>> низкоуровневая java
если без clojure контекста, то звучит немного странно
интересно на каких задачах java уделала clojure по производительности?

[identity profile] proofit404.livejournal.com 2012-09-29 12:24 pm (UTC)(link)
просто я вижу что там, где важна производительность, на высокоуровневые языки скриптоту только и оставляют

[identity profile] stdray.livejournal.com 2012-09-29 12:31 pm (UTC)(link)
Ну, джава: jit-компиляция есть, сборщик мусора есть, стэка нет. Оно может простое, но точно не низкоуровневое.

[identity profile] stdray.livejournal.com 2012-09-29 12:36 pm (UTC)(link)
Если один процессор, то все понятно, а если распараллеливать можно, то все не так однозначно.

[identity profile] gds.livejournal.com 2012-09-29 12:37 pm (UTC)(link)
я так делаю иногда. Пишу на окамле, и очень редко переношу код в сишечьку. Очень редко потому, что и без неё на моих задачах почему-то достаточная производительность. Может потому, что представляю, как писать на окамле быстрый код, хз.

[identity profile] izard.livejournal.com 2012-09-29 12:53 pm (UTC)(link)
Встречались C, C++, Erlang, Java, пара экзотических внутриклиентских паскалеподобных языков.

Сложности с последующей поддержкой не такие большие, т.к.
1. 100% моих клиентов пишут софт, который не предназначен для широкого распространения (максимум - десятки тысяч контроллируемых инсталляций), и предназначен для работы на ограниченном множестве железа.
2. На асме переписывается несколько hot_fucntion_N, старая функция никуда не выкидывается, остается на всякий случай или как часть документации.
3. Главный asset Интел - совместимость. Код, откомпилированный на 8086, запустится на Core i7 (с некоторыми условиями и ограничениями, но условия в принципе выполнимы, а ограничения редки и документированы). Но это 35 лет разницы. В пределах 15 лет (типичное время жизни софта, с которым я работаю) проблем совместимости вообще нет.
4. Однако в новом_классном_дорогом_интелловском процессоре могут появится новые инструкции, которые позволят еще ускорить код - тогда клиент is welcome to be my guest еще раз.
5. Бывают регрессии по производительности с новыми архитектурами. Обычно я могу гарантировать, что в моем коде их не будет в течении 2 следующих поколений.

[identity profile] dr-hyder.livejournal.com 2012-09-29 12:57 pm (UTC)(link)
Ну когда то давно чего то присобачивал к одной опердени на С, но нужды в этом в принципе не было, просто блажь заказчика. А так, поскольку занимаюсь в основном серверными приложениями - там такого не бывает в принципе, если что то "жмёт", значит скейлить нужно горизонтально, а не переписывать что то на быстрых языках, в остальном джавы хватает. Выжимать там лишние проценты переписывая на сях - хипстерская блажь.
Edited 2012-09-29 12:59 (UTC)

[identity profile] stdray.livejournal.com 2012-09-29 01:13 pm (UTC)(link)
Вот люди даже с Erlang не брезгуют:
http://lionet.livejournal.com/84884.html
http://levgem.livejournal.com/386524.html
У них точно нет проблем с горизонтальным масштабированием.

Кроме того, выше в комментариях отметился izard, который, как я понял, специализируется именно на том, что выжимает лишние проценты, переписыванием на сях и даже асме.
Edited 2012-09-29 13:16 (UTC)

[identity profile] metaclass.livejournal.com 2012-09-29 01:27 pm (UTC)(link)
Я знаю только один пример такого - GNURadio - обертка на питоне и вычисления на C++
еще numpy/scipy вроде тоже.

А у меня все вычисления упираются в "как наиболее эффективно прочесть наименьшую часть БД размером в 10-50 гб и минимизировать расстояние от чтения до вычисления", так что мне вряд ли поможет переписывание на низкоуровневых языках.

[identity profile] dr-hyder.livejournal.com 2012-09-29 01:32 pm (UTC)(link)
Раз переписывают, значит есть какие то требования к производиетельности той части что горизонтально не масштабируется(критично время отклика например). Проще говоря занимаются миддлвэр'ом скорее всего, Иначе велика вероятность что просто переизобретают какой нибудь велосипед(что бывает нужно, да).

(Anonymous) 2012-09-29 03:05 pm (UTC)(link)
FreeArc так сделан, например. Hackell + С. Сейчас вот в этот самый момент решаю эту проблему. Весь проект на Немерле, небольшая горячая часть на С++. Сценарий примерно такой - подготовка(генерация) сложных структур данных(деревья, автоматы) на Nemerle. Затем все эти структуры данных перемещаются в фиксированную память (System.Runtime.InteropServices.Marshal.AllocHGlobal, System.Runtime.InteropServices.Marshal.StructureToPtr). После в С++ кидается указатель на все это безобразие и он может ходить по этим структурам данным как по своим. Проблема в поддержке описания одних и тех же структур данных на обоих языках. Меняем в одном месте, нужно менять в другом месте. Нужно строго следить за выравниванием и порядком следования полей. Да что там, просто чтобы константу расшарить между двумя языками - уже проблема. Короче мне все это надоело и я написал (на Nemerle, естественно) небольшую утилиту, которая воспринимает описание структур данных на С-образном языке и выдает текст с описанием этих структур данных на С++, Nemerle и богомерзком C# (Ну потому, что в Немерле пока нет полноценной поддержки указателей. Указатель на int уже можно описать, а указатель на структуру еще нельзя.) Далее все это можно подключать как в .NET, так и в C++. Сейчас поддерживаются неймспейсы, структуры, шаблоны С++, енумы, тайпдефы. Про шаблоны... Например - у нас есть описание шаблонов:
LinkedListNode
{
T value;
LinkedListNode* next;
}

class LinkedList
{
LinkedListNode* root;
...
}
typedef LinkedList MyList;
typedef LinkedList HisList;
В С++ это передается как есть, для Шарпа генерируется следующие структуры LinkedListNode_instantation_int, LinkedList_instantation_int, LinkedListNode_instantation_SomeStruct, LinkedList_instantation_SomeStruct:
LinkedListNode_instantation_int
{
int value;
LinkedListNode* next;
}

class LinkedList_instantation_int
{
LinkedListNode_instantation_int *root
}
Для HisList тоже самое. Что-то типа инстанцирования шаблонов. Все это с поддержкой области видимости. LinkedList < SomeTemplate < SomeOtherTemplate < int > > > то же поддерживается. Вопрос - не велосипед ли я изобретаю?
P.S.: Перед тем, как прочел этот пост, сидел отлаживал описанную выше утилиту.

[identity profile] stdray.livejournal.com 2012-09-29 03:27 pm (UTC)(link)
>Весь проект на Немерле, небольшая горячая часть на С++... подготовка(генерация) сложных структур данных(деревья, автоматы) на Nemerle... С++ кидается указатель на все это безобразие и он может ходить по этим структурам данным как по своим.

Если структуры действительно сложные, то писать обходчики на С++ - это адский ад. Какие преимущества дает цепепе? Какие преимущества перед unsafe C#, который достаточно быстр (http://stdray.livejournal.com/73674.html?thread=377546#t377546) и может простым и прозрачным образом общаться со структурами данных, описанными на Nemerle?

(Anonymous) 2012-09-29 04:12 pm (UTC)(link)
Обходчики - не ад. Вот генерация всех этих деревьев, конечных автоматов - вот это реально ад (алгоритмы на строках сейчас мой фокус). Писать все это на С++ - застрелиться легче.

Я не знаю насколько ансейф С# быстрый в реальности, а не на тестах. В С++ я почти уверен, в С# не уверен. Тем более на плюсах у меня есть немалый опыт, на С# опыта нет, я сразу начал писать на Немерле. Шаблоны опять же. OpenMP опять же. Куча нативных библиотек опять же. И т.д.

(Anonymous) 2012-09-29 04:20 pm (UTC)(link)
Обходчики - не ад, генерация - ад. Деревья, конечные автоматы(алгоритмы на строках сейчас мой фокус) - писать генерацию всего этого на С++ - застрелиться легче.

В С++ я почти уверен, в С# не уверен. На С++ у меня большой опыт, на шарпе опыта нет почти. Темплейты опять же, куча нативных библиотек, OpenMp, и т.д.

[identity profile] stdray.livejournal.com 2012-09-29 04:25 pm (UTC)(link)
>Тем более на плюсах у меня есть немалый опыт, на С# опыта нет, я сразу начал писать на Немерле.

Если из Nemerle убрать паттерн-матчинг, макросы и TCO, то получится Сишарп. Что касается обхода структур, то я не понимаю, на чем там можно в плюсах сэкономить. Адресная арифметика здесь мало применима, а для распараллеливания есть PLINQ, async/await (в C#5 и Немерле) и Async монада для Nemerle.

[identity profile] thedeemon.livejournal.com 2012-09-29 04:45 pm (UTC)(link)
Другой известный пример - mercurial. Большая часть питон, какие-то важные по скорости куски на Си.

[identity profile] thedeemon.livejournal.com 2012-09-29 04:51 pm (UTC)(link)
Я обычно до начала проекта представляю ожидаемые требования по скорости и выбираю язык соответственно. Когда пишу на окамле, оптимизаций чисто алгоритмических хватает. Когда пишу на руби, делаю это только там, где вообще нет требований к скорости. Такого, чтобы в одном проекте были одновременно нужны и плюшки высокоуровневых языков, и максимальная скорость на поворотах, как-то не попадалось.

[identity profile] thedeemon.livejournal.com 2012-09-29 04:55 pm (UTC)(link)
Практически на всех, я полагаю.
У clojure с ее динамикой нет причин быть быстрой, и на тестах shootout'a она отстает в разы.

[identity profile] stdray.livejournal.com 2012-09-29 05:53 pm (UTC)(link)
Я уже понял, что куда в питоне не глянь, увидишь обернутые куски на сях.

[identity profile] proofit404.livejournal.com 2012-09-29 05:57 pm (UTC)(link)
тоесть следуя этой логике скала должна бы быть пошустрее?

[identity profile] thedeemon.livejournal.com 2012-09-29 06:14 pm (UTC)(link)
Да.

[identity profile] proofit404.livejournal.com 2012-09-29 06:24 pm (UTC)(link)
Спасибо, а sbcl вродебы сейчас самый шустрый из лиспов?

[identity profile] thedeemon.livejournal.com 2012-09-29 06:46 pm (UTC)(link)
Точно не знаю, но вроде бы да.
wizzard: (фото)

[personal profile] wizzard 2012-09-29 07:36 pm (UTC)(link)
Python+C, отлично работало.

Еще Javascript+C был.

[identity profile] stdray.livejournal.com 2012-09-29 07:40 pm (UTC)(link)
Я уже понял, что питон по другому не работает.

>Еще Javascript+C был.
Это еще что за эксперименты?
wizzard: (фото)

[personal profile] wizzard 2012-09-29 08:02 pm (UTC)(link)
chromium как гуй к приложению

кстати, ЕМНИП, Steam так устроен (морда на HTML, остальное на плюсах)

[identity profile] enternet.livejournal.com 2012-09-29 08:43 pm (UTC)(link)
Я когда-то давно по неопытности писал extended stored procedures на C для MSSQL7. Потом бросил заниматься этой дурью, т.к. у MSSQL есть хранимые процедуры для дергания COM-объектов, что (1) отвязывает от С и (2) часто ничего писать не нужно, т.к. нужный объект в системе уже есть. Ну и (3) COM c некоторыми нюансами можно делать in-process, т.е. ничего на производительности не терять даже в теории. А потом и это бросил делать, т.к. попадающиеся задачи требовали других методов оптимизации - головой.

Но пример, когда С был реально нужен у меня есть - писал когда-то индексатор для MS Indexing Service, там производительность была критична и заголовки портировать на что-то не хотелось. Т.е. изначально отладил сам алгоритм на дельфи, а потом итог оформил на С.

[identity profile] satanus.livejournal.com 2012-09-30 02:36 pm (UTC)(link)
Любой проект питона - большая часть питон, какие-то важные по скорости куски на си. Как и сам питон.

[identity profile] satanus.livejournal.com 2012-09-30 02:39 pm (UTC)(link)
А ещё большинство лаунчеров и мморпг, начиная с wow и заканчивая лигой легенд.
У вова морда в два потока вообще - отдельный минибраузер и отдельный торрент-клиент.

[identity profile] si14.livejournal.com 2012-11-30 09:57 pm (UTC)(link)
Пришлось один раз, но case достаточно специфичный — впилить в Erlang мутабельные циклические массивы. Получилось https://github.com/band115/ecirca .

[identity profile] stdray.livejournal.com 2012-11-30 11:21 pm (UTC)(link)
Как я понимаю, удалось остаться в рамках Эрланга, и писать код на языке более близком к железу не пришлось.

[identity profile] si14.livejournal.com 2012-12-01 12:37 am (UTC)(link)
За исключением куска по ссылке — да, всё отлично работает. На самом деле, тормоза эрланга очень сильно overrated в общем случае.

[identity profile] levgem.livejournal.com 2012-12-01 06:22 am (UTC)(link)
При вычислении mpeg crc32 эрланг работает в 40 раз медленнее чем аналогичный кусок а С.
По прошестви пары лет я выкинул с-шный кусок потому что это очень неудобно таскать такие экстеншны. И ничего в общей скорости не поменялось.

Там где скорости эрланга не хватает возможно и скорости plain c может не хватить, потребуются всякие intrinsic