LINUX.ORG.RU
ФорумTalks

[C++][Новый блестящий молоток][}{-ть по пальцам]Александреску от благодарных читателей

 


0

4

Недавно фирма решила продать очередному клиенту готовое решение... Но тот выдвинул условие, чтоб оно вертелось на 64 битной OpenSuse 11.3. Сначала выморозил дефолтный gcc 4.5, который начал недоумевать, почему операторы сравнения указателей, которые раньше неявно генерились, не были определены явно. (Бага зафиксирована на gcc.gnu.org, как регрессия. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45383) Не долго думая, собрали 4.5-м версию 4.4.1 и убедили cmake дергать именно его. Фреймворк наконец-то пошел собираться... Даунгрейд компилятора, однако, всех проблем не решил - бодренький процесс сборки фреймворка уперся в модуль Templates.cpp (в нем, вроде как не сильно много специализаций шаблонов... на первый взгляд), на котором система ушла в глухой своп (а процесс cpp1plus стал часто висеть в состоянии «disk sleep», попеременно с X-ами). Спросили разрабов фреймворка WTF^W в чем проблема, при каких условиях этот загадочный модуль собирается за приемлемое время... «Дык, 3 гига памяти надо» (c) ответствовали разрабы. Причем только для сборки (и только этого модуля) - если у меня на всем компе 3Gb RAM - ССЗБ. Значит, чтоб компилятор собрать - 1Gb достаточно, а фреймворку для одного файла, который кстати чем-то вроде компиляции (упаковкой данных в бинарный формат) занимается, 3Gb надо... И ведь не стыдно. (Дожидаться финала не стал - добавил гесту с OpenSuse память до 2.5Gb (хосту тоже надо где-то быть), отправил систему в init 3, запустил сборку и прокинул на домашний комп ssh туннель, чтоб перед сном глянуть, чем кончилась борьба за память... Когда пришел домой - cmake уже показывал прогресс в районе [90%]. При всей нелюбви чинить не сломанное, иногда понимаешь людей, которым хочется просто взять и у^Wвсе переписать.)

Ответ на: комментарий от TERRANZ

Пример можно... Завтра на работу приду, и приложу) (В голове не помещается.) Там куча вложенных методов encode(), цапаюших один и тот же буфер, только рекур^Wвложенно же специализируются шаблоны... (Может и не было бы проблем, если б специализации «операций» и «полей» раскинули на больше чем 1 файл) Причем протокол вроде придуман для ускорения... Но компиляция одного файла over 9000^W^Wбольше 3-х часов вызывает нечеловеческие эмоции.

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от thesis

>Александреску, гад ты эдакий, зачем ты сломал ТСу гцц на опенсусе?

Александреску виноват только тем, что не дооценивает энтузиазм своих читателей... Когда в коде встречаются цитаты из определенных книг, и «фишка» считается нужной в проекте, только потому что она была в такой-то книжке популярного автора, это наводит на мысли, о fashion driven development.

slackwarrior ★★★★★
() автор топика

cpp не нужен. Доказано Луговским.

Для чего-то быстрого и/или низкоуровнего рулит обычный Си или да-да, Фортран. Для высокоуровневого всякие хаскели, лиспы и на крайняк питоны.

praseodim ★★★★★
()
Ответ на: комментарий от TERRANZ

>А можно пример кода, заставляющего гцц жрать 100500 рамы?

Рекурсивный шаблон, надо только обеспечить нужную глубину рекурсии (оно же нужную степень пустоты в голове).

Общий принцип:

template<>
class Even<0>
{
public:
const int Even = true;
};

template<>
class Even<1>
{
public:
const int Even = false;
};

template<unsigned T>
class Even : public Even<T-2>
{
};

...

Even<1005000> even;
bool e = even.Even;

Pavval ★★★★★
()
Ответ на: комментарий от Reaper

У него видимо подход, что так как продукт рассчитан на разработчиков, то кому не понятно, тому типа и не нужно.

Но как я понял из http://www.meta-alternative.net/product-overview.html эта тулзевина умеет анализировать полученный .NET-овский бинарник и сохраняя неизменным исходный код приложения, оптимизировать его, ускоряя работу и уменьшая выделение памяти.

Довольно круто, если это у него реально работает с ощутимым эффектом.

praseodim ★★★★★
()
Ответ на: комментарий от Reaper

Хм, http://www.meta-alternative.net/product-faq.html

6. How significant an improvement can be achieved with Meta Optimiser?

This depends on the nature of your program. In our tests of processor-intensive activities, such as factorial functions and string intensive programs, the tasks run up to 100 times faster after optimisation. More typically, 20% to 200% acceleration can be expected. The program does not accelerate external or non-processor tasks such as database accesss.

Если ему верить, выходит, что для задач интенсивно использующих процессор, он ускоряет .NET прогу раз в 100 (!!!). Не ускоряет работу задач, слабо зависимых от процессора, типа доступа к базе данных. Но это естественно. В типичных случаях эффект от 20% до 200%.

Мне сейчас даже пришло в голову, что я знаю людей на работе, которых это заинтересует.

praseodim ★★★★★
()
Ответ на: комментарий от yoghurt

>compilation-time even/odd - плохой и непрактичный пример :)

Татышо:)

Pavval ★★★★★
()
Ответ на: комментарий от praseodim

>На пару с женой основал в Англии стартап Meta-Alternative http://www.meta-alternative.net/

Продвигает там тулзу MetaOptimizer - автоматический оптимизатор для .NET, уверяет что единственный и неповторимый.


Это что-то с метаном связанное? Оптимизация .Net в метан?

Pavval ★★★★★
()
Ответ на: комментарий от TERRANZ

> А можно пример кода, заставляющего гцц жрать 100500 рамы?

boost, dev.mdc.ru

namezys ★★★★
()
Ответ на: комментарий от praseodim

Но как я понял из http://www.meta-alternative.net/product-overview.html эта тулзевина умеет анализировать полученный .NET-овский бинарник и сохраняя неизменным исходный код приложения, оптимизировать его, ускоряя работу и уменьшая выделение памяти.

Это я всё прочитал, мне интересно, как он это делает.

Reaper ★★
()
Ответ на: комментарий от Reaper

Хотел подписаться на бета-тест, форма отправки заявки не работает. (

Reaper ★★
()
Ответ на: комментарий от namezys

> хер вам.

Спасибо, у меня уже есть.

у него ограничение на глубину шаблонов есть


Ок, тогда как именно?

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

> у него ограничение на глубину шаблонов есть

Ок, тогда как именно?

просто много сложных шаблонов. рекурсию он прервет, там вроде 128 глубина вхождения стоит

namezys ★★★★
()
Ответ на: комментарий от namezys

>рекурсию он прервет, там вроде 128 глубина вхождения стоит

Я кажись, когда игрался с шаблонами (т.е. не на реальных проектах) набирал больше 128.

Pavval ★★★★★
()
Ответ на: комментарий от Reaper

> Это я всё прочитал, мне интересно, как он это делает.

Видно на уровне .net ассемблера что-то делает. Хотя конечно, действительно интересно. Дополнительной инфы действительно маловато.

praseodim ★★★★★
()
Ответ на: комментарий от KERNEL_PANIC

Стандартный ответ на большинство тредов, где он не сечет ни хрена, но пройти мимо не может.

xscrew ★★
()
Ответ на: комментарий от namezys

Да никто не против оптимизации... Когда оптимизируется то, без чего никак - оно конечно... А когда компайл-тайм легко уходит в неопределенную бесконечность и помогает только что-то вроде -fno-var-tracking, можно долго медитировать на top (нагрузка пляшет в районе 2%, а система стоит колом), /proc/sys/vm/swapзiness и прочий ionice... Хочется съездить в командировку к авторам Templates.cpp в глаза им посмотреть^W^W^W^Wи спросить, что они знают про декомпозицию. (Про оптимизацию можно не спрашивать - и так все понятно.)

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от DNA_Seq

>нефиг виртуалкой пользоваться

Думается, на железной машине результат был бы не лучше... А пользоваться или не пользоваться виртуалкой - это политика конторы решает.

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от slackwarrior

Гы. Работая с шаблонами мы как раз при любой степени декомпозиции задачи вконечном итоге приходим к сбору всего компилируемого материала в одном месте на стадии именно компиляции, а не линковки

Одна из основных проблем шаблонов, имхо

namezys ★★★★
()
Ответ на: комментарий от namezys

Если все в один бинарь сводить - то да.

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от namezys

Ну и... Если бескомпромиссно подойти к оптимизации, можно и без шаблонов, наверное, ту же задачу решить.

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от slackwarrior

Не будем трогать тему глюков виртуалки. Сам процесс разработки не под целевой системой добавляет геморроя в последний момент типа вышеописанного - то конфиги в целевом дистрибутиве не там то версии библиотек не те под которые отлаживалось и тд. Пишешь под сусю - пиши под сусей. В противном случае проблема в собственных руках.

DNA_Seq ★★☆☆☆
()
Ответ на: комментарий от slackwarrior

> Если бескомпромиссно подойти к оптимизации, можно и без шаблонов, наверное, ту же задачу решить.

Не. НЕ всегда. Просто фанатеть не надо

namezys ★★★★
()
Ответ на: комментарий от DNA_Seq

>Не будем трогать тему глюков виртуалки.

Ага. Тему глюков последних релизов суси тоже не будем ;)

Целевой дистрибутив OpenSuse 11.3. Сборка и писанина, собственно происходят в нем. Другой вопрос, что когда разраб фреймворка уверен, что у него, например 10.3 (просишь чела вывод cat /etc/SuSE-release и выясняется, что у него 10.2, пусть и апгрейженная. В результате на нулевом 10.3 сборочный скрипт не видит libdl)

slackwarrior ★★★★★
() автор топика
Ответ на: комментарий от KERNEL_PANIC

>Как я заметил, это твой стандартный ответ на большинство тредов, правда?

Он хорошо применим в тех местах, где непонятно о чем идет речь или многобукоф.

Zhbert ★★★★★
()
Ответ на: комментарий от slackwarrior

Заинтриговал. Не большой знаток плюсов, но ради такого случая...)

Deleted
()
Ответ на: комментарий от slackwarrior

> Александреску виноват только тем, что не дооценивает энтузиазм своих читателей... Когда в коде встречаются цитаты из определенных книг, и «фишка» считается нужной в проекте, только потому что она была в такой-то книжке популярного автора, это наводит на мысли, о fashion driven development.

Страуструп прохладно относится к идеям Александреску примерно из тех же соображений.

Relan ★★★★★
()
Ответ на: комментарий от slackwarrior

вообще у меня в коде куча шаблонов. экономят десятки и сотни строк кода

namezys ★★★★
()
Ответ на: комментарий от Zhbert

Признак неосилятора, даже там, где пару строчек треда. Поищи по форуму фразу «сказать-то что хотел?» =)

KERNEL_PANIC ★★★
()
Ответ на: комментарий от KRoN73

>Типа, получается раз в 20-50 быстрее машинных кодов?

Можно в машинных кодах искать прямым перебором, а сортировать пузырьком. А потом написать тулзу которая в коде будет заменять прямой перебор бинарным поиском, а сортировку - квиксортом.

Absurd ★★★
()
Ответ на: комментарий от Absurd

>Можно в машинных кодах искать прямым перебором, а сортировать пузырьком

Т.е. эта хрень меняет алгоритмы? И вместо пузырька сама догадается поставить qsort? Отсыпь мне того же! :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>>Можно в машинных кодах искать прямым перебором, а сортировать пузырьком

Т.е. эта хрень меняет алгоритмы? И вместо пузырька сама догадается поставить qsort? Отсыпь мне того же! :D

Ну я бы не сказал что у меня настолько хорошо прокачана матчасть и профессиональная эрудиция как у Луговского. Может и можно как-то эвристически отыскивать O(N^2) и менять на O(N*log N), кто его знает.

Absurd ★★★
()

А никто не обещал, что сишникам будет лехко. Не нравится — используйте Java. Она на мобильниках с 1M RAM даже работает и ест не просит.

iZEN ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.