Здравствуйте, Gaperton, Вы писали: G>Эта... уже наступило. Pentium — суперскалярный процессор, способный выполнять более одной инструкции за такт. Там конвейер длиннющий, и все такое. Лично наблюдал своего коллегу, который год назад решил "оптимизнуть" цикл вставкой на ассемблере . Эх, типа, как в старые добрые времена, на трешке с 4 мегами ОЗУ, размахнись рука, раззудись плечо — компайлер фигню какую-то написал, ща я паправлю... Стало медленнее . Потом он разобрался почему, и догнал по скорости компилятор, а потом выбросил свою вставку за не надобностью.
Я тоже наблюдал не так давно абсолютно аналогичную картину. Все было именно так — биение копытом в грудь, обвинения в адрес тупого компилера, демонстрация заведомо косячного продукта авто-оптимизации, демонстративное написание своего варианта, четыре исправления глюков в самописаном коде, и ужас при сравнении результатов. "Очевидно кривой" код рвал рукоделье на мелкие куски. Я смеялся. Не даром компайл-райтеры свои баксы получают, ох не даром
... << RSDN@Home 1.1.4 beta 4 rev. 347>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[14]: Языковые войны: императивные vs функциональные
Здравствуйте, Gaperton, Вы писали:
G>Здравствуйте, Quintanar, Вы писали:
Q>>Производительность — это одно. Давайте еще и выразительность оценим. Я тут как раз написал эмулятор многотредовости на OCaml с поддержкой самых простых возможностей — pid, имя процесса, приоритет, переключение задач (не вытесняющее ясен пень), fork, exec, wait на произвольном условии и на простейшем спинлоке, kill и фоновый процесс, который читает команды и выполняет их. Все это заняло примерно 180 строк. Было бы интересно посмотреть, как это выглядело бы на С++. + этот эмулятор интегрирован в ocaml top level, т.е. не вырубая эту "OS" можно ее приостановить и добавить новые программы или подрихтовать чего-нибудь, а потом опять вернуться в нее. Но C++ это не светит по определению, поэтому я требовать этого не буду.
G>Я бы тебе показал — как раз готовлю Alpha1 такой фигни на С++ под наш продукт. Но не могу — NDA.
Ну а размер, аля число строк/классов тоже под NDA попадает?
Re[10]: Языковые войны: императивные vs функциональные
Я тронут таким вниманием к своей персоне с твоей стороны, а также трогательной заботой о моей карьере. Аж скупую слезу вышибло. Тебе совсем делать нехер что-ли, я не пойму? У тебя проблемы какие-то личного характера, Влад?
Re[15]: Языковые войны: императивные vs функциональные
Здравствуйте, Gaperton, Вы писали:
GZ>>+1. И это есть гуд. Но к сожалению мы обитаем в мире PC и меряем все миром PC. Когда настанут времена коммунизма, и на PC можно будет такое сделать, это будет круто. Но до сих пор приходится учитывать не только что нужно делать, но и как это нужно делать.
G>Эта... уже наступило. Pentium — суперскалярный процессор, способный выполнять более одной инструкции за такт. Там конвейер длиннющий, и все такое. Лично наблюдал своего коллегу, который год назад решил "оптимизнуть" цикл вставкой на ассемблере . Эх, типа, как в старые добрые времена, на трешке с 4 мегами ОЗУ, размахнись рука, раззудись плечо — компайлер фигню какую-то написал, ща я паправлю... Стало медленнее . Потом он разобрался почему, и догнал по скорости компилятор, а потом выбросил свою вставку за не надобностью.
Да я собственно не об этом. Конкретный пример. Существует достаточно большой граф объектов. По графу нужно достаточно много раз пройтись для выполнения какой-то операции. Проход по графу и операции осуществляется с помощью виртуальных функций. И все начинает сильно тормозить. Немного танцев с бубном+визитер, функции становятся статическими. Результат улучшился на порядок. И компилятор тут не при чем. Он делал только то, что от него просили.
С уважением, Gleb.
Re[10]: Языковые войны: императивные vs функциональные
Здравствуйте, VladD2, Вы писали:
MA>>Следовательно: MA>>Gaperton понимает, что тупые работодатели принимают на работу тех кто работает на С++ (мэйнстрим), чтобы платить им стабильно за работу.
VD>По логике тебе большую оценку не поставили бы.
это вряд ли всё нормально у меня на логику по тестам и анализам
12 независимых присяжных поставили бы — учение верно, потому что истино
VD>Если деньги платят всем. То без разницы где ты и кем работаешь. При этом если ты работаешь, то искать тебе уже ничего не нужно. Ведь "Деньги вообще всем платят, кроме безработных.".
Но они же тупые!!! Собственно — то что они не платят всем кто работает, а только тем кто работает на С++ (мэйнстрим) и инкапсулирует их тупость
MA>>Выводы: MA>>Работодатели тупые. MA>>Работодатели платят деньги Gaperton, работающему за С++.
VD>Я бы сделал другие выводы: VD>1. За мэйнстим деньги платят чаще.
эквивалентно "Работодатели платят деньги Gaperton, работающему за С++.", если оговороить, что "мэйнстим = С++"
VD>2. Платят не одинаково.
этот вывод вообще из логики четырех утверждений не следует откуда подробности?
VD>3. Хорошо платят за работу/опыт.
опять же... это уже домыслы хотя.. опыт С++ тяжкий... да, в этом что то есть — подспудное в логике
VD>4. Иногда надо искать проблемы не только в работодателях.
хорошо, но это уже исследование проблематики
Re[15]: Языковые войны: императивные vs функциональные
Здравствуйте, Курилка, Вы писали:
G>>Я бы тебе показал — как раз готовлю Alpha1 такой фигни на С++ под наш продукт. Но не могу — NDA. К>Ну а размер, аля число строк/классов тоже под NDA попадает?
Не подпадает, но у нас наверняка функционал разный сильно.
Планировщик, задача, +event (примитив синхронизации). Обертку вокруг Win32 fiber-API не считаю.
6 классов
447 + 285 строк в файле, с пустыми и комментариями. Без пустых строк, строк с { и }, и комментариев примерно на 40-50% меньше.
Функционал такой:
— Планировщик в асимптотике делит поровну время на смеси задач построенных на файберах или коллбэках. В случае файберов, в задаче явно обозначены точки, в которых планировщик может ее прервать.
— Он делит время поровну независимо от поведения задач — даже если у конкретной задачи фактический квант времени выполнения сильно отличается от запуска к запуску.
— Планировщик умеет грамотно обходиться с задачами, не использующими весь отпущеный квант времени (пускаются не слишком часто, но с высоким приоритетом).
— Любая операция планировщика выполняется за O(1).
— Накладные издержки на планирование весьма небольшие, и не зависят от количества задач — тоже O(1).
— Примитив синхронизации Event — сложность постановки задачи на ожидание O(1) — это очень быстрая операция. Как и разблокирование. Ожидающая задача целиком исключается из структур планировщика, и не создает абсолютно никакой нагрузки.
Примерно так. Заточен под десятки тысяч "задач".
Re[11]: Языковые войны: императивные vs функциональные
Здравствуйте, Gaperton, Вы писали:
G>Я тронут таким вниманием к своей персоне с твоей стороны, а также трогательной заботой о моей карьере. Аж скупую слезу вышибло.
Я рад что тебя порадовал.
G>Тебе совсем делать нехер что-ли, я не пойму?
Как и тебе. Отдыках по вечерам.
G>У тебя проблемы какие-то личного характера, Влад?
Пока вроде нет. Если появятся, то сразу заведу блог и постараюсь о них расказать столь же живо и весело как это делашь ты.
... << RSDN@Home 1.1.4 beta 4 rev. 359>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Языковые войны: императивные vs функциональные
Здравствуйте, Gaperton, Вы писали:
G>Функционал такой: G>- Планировщик в асимптотике делит поровну время на смеси задач построенных на файберах или коллбэках. В случае файберов, в задаче явно обозначены точки, в которых планировщик может ее прервать. G>- Он делит время поровну независимо от поведения задач — даже если у конкретной задачи фактический квант времени выполнения сильно отличается от запуска к запуску. G>- Планировщик умеет грамотно обходиться с задачами, не использующими весь отпущеный квант времени (пускаются не слишком часто, но с высоким приоритетом). G>- Любая операция планировщика выполняется за O(1). G>- Накладные издержки на планирование весьма небольшие, и не зависят от количества задач — тоже O(1). G>- Примитив синхронизации Event — сложность постановки задачи на ожидание O(1) — это очень быстрая операция. Как и разблокирование. Ожидающая задача целиком исключается из структур планировщика, и не создает абсолютно никакой нагрузки.
Не, у меня планировщик самый примитивный — на основе списка и wait_queue напрямую не реализованы, но все это не так сложно добавить, если взять очередь с ассимптотикой добавить/взять O(1). Вместо фиберов — CPS функции.
Но самое главное, когда я это писал, я еще раз ощутил, что такое нормальный язык — за все время написания у меня была всего одна рантайм ошибка с exception'ом и всего несколько логических ошибок. Правилом было, когда функция начинала работать без ошибок сразу же. И это учитывая, что я писал буквально наугад, поскольку сам плохо понимаю, как нужно писать используя CPS.
Re[11]: Языковые войны: императивные vs функциональные
Здравствуйте, Cyberax, Вы писали:
C>Наоборот как раз бывает. Оптимизированная реализация алогритмов на С C>выглядят ужасно.
Оптимизации вне зависимости от языка очень часто выглядят намного хуже чем чистые алгоритмы и темболее код который специально пытались написать понятным и компактным.
... << RSDN@Home 1.1.4 beta 4 rev. 359>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Языковые войны: императивные vs функциональные
Здравствуйте, alexeiz, Вы писали:
A>Конечно, если хочешь показать, что на OCaml'е можно лучше написать, пожалуйста. Возьми любую (не совсем тривиальную) задачу с этого сайта и вперед. Только не забудь привести свой код. Посмотрим, как красиво он будет выглядеть.
Да фиг с ней с нетривиальной. Меня вот интересут можно ли примитивную быструю сортировку реализовать эффективно в функцональном стиле. Конечно используя копирование списков и рекурсию можно выразить этот алгоритм элегантно и кратко. Но при этом:
1. Просисходит копирование данных, что на больших объемах может выйти боком.
2. В качестве медианы (среднего значения) берется самый первый элемент, что снизит скорость на заранее отсортированных списках.
На ИЯ я могу как модифицировать список по месту, так и брать медиану из середины списка.
Вот и интересно, могут ли что-то оптимизаторы ФЯ противопоставить грубой силе?
... << RSDN@Home 1.1.4 beta 4 rev. 359>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Языковые войны: императивные vs функциональные
Здравствуйте, Cyberax, Вы писали:
C>alexeiz пишет:
>>> Наоборот как раз бывает. Оптимизированная реализация алогритмов на С >>> выглядят ужасно. >> Вопрос в том, чем будет эта реализация на ФЯ, если на C она ужасна.
C>А вот на ФЯ оно обычно проще выглядит.
Это если без оптимизаций. Да и обычно — это "проще" упирается в использование тех или иных фич языка (вроде лист-компрехеншенов) кторые в общем-то к ФЯ отношение имеют очень отдаленное. Тот же лист-компрехеншен есть и в Питоне.
... << RSDN@Home 1.1.4 beta 4 rev. 359>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Языковые войны: императивные vs функциональные
Здорово! Человек говорит о 10-кратном отстовании, а ему в ответ.
G...7-8%. Главное, что не вдвое медленее — это уже реально заметно.
Здается мне, что есть случаи когда Окамл предоставляет оптимизацию аналогичную С++-ным рукопашным. Тогда все ОК. А если вопрос упирается в неэффективность функциональных паттернов, то тут уже нужен супер умный оптимизатор. И вот тут вознкикают очень большие сомнения. В общем, без серьезного анализа, и кучи тестов утверждения о том что Окамл стаит по скорости между С и С++ звучат неубедительно.
... << RSDN@Home 1.1.4 beta 4 rev. 359>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[13]: Языковые войны: императивные vs функциональные
VladD2 пишет:
> Да фиг с ней с нетривиальной. Меня вот интересут можно ли примитивную > быструю сортировку реализовать эффективно в функцональном стиле. > Конечно используя копирование списков и рекурсию можно выразить этот > алгоритм элегантно и кратко. Но при этом: > 1. Просисходит копирование данных, что на больших объемах может выйти > боком.
Копирование данных в ФЯ — дешовая операция, так как реального
копирования не происходит. Все данные же неизменяемые, так что просто
копируются указатели на них.
--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[13]: Языковые войны: императивные vs функциональные
VladD2 пишет: > используя копирование списков и рекурсию можно выразить этот алгоритм > элегантно и кратко. Но при этом: > 1. Просисходит копирование данных, что на больших объемах может выйти боком.
Здравствуйте, Gaperton, Вы писали:
G>Я тронут таким вниманием к своей персоне с твоей стороны, а также трогательной заботой о моей карьере. Аж скупую слезу вышибло. Тебе совсем делать нехер что-ли, я не пойму? У тебя проблемы какие-то личного характера, Влад?
Здравствуйте, Cyberax, Вы писали:
C>Копирование данных в ФЯ — дешовая операция, так как реального C>копирования не происходит. Все данные же неизменяемые, так что просто C>копируются указатели на них.
Если копирование бесплатно, то изменение дорого.
Это мне напомнило анекдот:
Приехал один человек в гости к своему другу-кавказцу. Едут из аэропорта. Доезжают до светофора — не нем красный свет. Кавказец на это внимание не обращает — едет дальше. Гость спрашивает у него:
-- как же ш так, красный свет ведь!
-- я джигит! мнэ можно на красный ехат.
Доезжают до следующего светофора — на нем зеленый свет. Кавказец по тормозам. Гость недоумевает:
-- дак зеленый же! Можно же ехать!
-- Ага, а вдруг справа другой джигит вылетит?
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re: Языковые войны: императивные vs функциональные
Да... Опять началось, блин Я протестую — мало того, что была порезана дискуссия, к которой и только к которой относился этот пост, ему было присвоенно название, не соответствующее содержанию подветки.
Чтобы ни у кого не создалось ложного впечатления от вырванного из контекста письма ), зацитирую себя — из этой же ветки, на всякий случай, в попытке остановить очередной виток бестолкового флейма.
Эти языки (с компиляторами) я привел не потому, что считаю что "они во сто раз круче мэйнстрима и императивных языков" (вообще в этот спор ввязываться не хотел), а потому, что это — известные мне академические проекты, у которых приличная производительность. Кстати, Lisp и OCaml являются в равной степени и императивными языками, из них чистый ФЯ только Clean.
Re[15]: Языковые войны: императивные vs функциональные
prVovik пишет:
> C>Копирование данных в ФЯ — дешовая операция, так как реального > C>копирования не происходит. Все данные же неизменяемые, так что просто > C>копируются указатели на них. > Если копирование бесплатно, то изменение дорого.
В ФЯ изменение — это нежелательная операция, а в некоторых ФЯ вообще
запрещенная.
--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[16]: Языковые войны: императивные vs функциональные
Здравствуйте, Cyberax, Вы писали:
C>В ФЯ изменение — это нежелательная операция, а в некоторых ФЯ вообще C>запрещенная.
В том то и дело. Поэтому изменения должны быть копирующими
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[17]: Языковые войны: императивные vs функциональные
prVovik пишет:
> C>В ФЯ изменение — это нежелательная операция, а в некоторых ФЯ вообще > C>запрещенная. > В том то и дело. Поэтому изменения должны быть *копирующими*
Не поэтому, а для того, чтобы сохранялась ссылочная целостность.
Легкость копирования — приятный побочный продукт.