Здравствуйте, NikeByNike, Вы писали:
NBN>Происходит практически необратимая деградация...
Истинны слова твои, о Мастер!
После того, как ступил я на тёмную сторону силы кодирования и прельстился сладким речам демона Garbage Collector,
утратил мой мозг способность практически полностью вкуривать вот в этот феерический ПЦ:
,
который на C# укладывается в десяток императивных строк или пару лямбд...
Рыдаю и посыпаю главу выдранными волосьями.
Нет мне обратного пути к plswczwtfomfgstr ((
советую забыть про с++. На нем сейчас пишут почти только игрушки/драйверы за редкими исключениями. Обычно за вакансией с++ dev будет скрываться поддержка легаси проекта такого качества исполнения, что php сказкой покажется. А в геймдеве в хорошие времена денег не было для разработчиков, а сейчас вообще всё плохо думаю. Помню мне в начале 2007го года в геймдев конторе предлагали 17тр, а в других местах от 45и.
А вообще всё сложно(кризис), думаю надо сначала вообще найти живые вакансии, а потом уже решать. Успехов.
Здравствуйте, shrecher, Вы писали:
S>MSOffice12, Microsoft Silverlight, Windows7, Vista,
мне это напомнило один школьный конкурс. две команды по очереди называли маттермины, выигрывала та, которая назовёт последний. и мы нашли золотую жилу — треугольник, четырёхугольник, пятиугольник...
S>Дофига потребительских прог на C++
массовые коробочные продукты действительно лучше написать на C++ — хоть время разработки в несколько раз выше, зато они требуют меньше памяти и работают быстрее. вот только где у нас в стране разрабатывают такие прогшраммы — с миллионами продаж? таких мест раз-два и обчёлся, добавь к этому массу legacy C++ программистов и ты получишь, что порог вхождения в эту область слишком высок, а к тому времени, когда человек станет квалифицированным C++ девелопером, потребность в них и вовсе исчезнет. словом, это всё равно что идти учиться на кучера в эпоху первых трамваев
Мне кажется, что языки, используемые нами для выражения своих идей, становятся частью нас самих, поэтому, если вы знаете только один язык, может показаться, будто сторонники других языков представляют опасность лично для вас. Мне представляется, что выход из этой ситуации – освоение других языков. Сомневаюсь, что можно быть профессионалом в области ПО и знать лишь один язык программирования. Может быть и экономическая причина: фундаментальные знания выходят за границы языка программирования в отличие от многих практических навыков. Поэтому, если я знаю только язык X и его наборы инструментов, а вы являетесь сторонником языка Y и его наборов инструментов, вы представляете угрозу для источника моего заработка. И вновь решение, как мне кажется, — в знании нескольких языков и наборов инструментов (а также твердое понимание фундаментальных концепций).
Интервью++: Бьерн Страуструп об эволюции языков
Портфелем знаний мы предпочитаем называть все факты, известные программистам об информатике, обалсти приложений, в которых они работают, и накопленный ими опыт. Управление портфелем знаний очень похоже на управление финансовыми портфелем.
Предложения по поддержке портфеля знаний:
— Учите (как минимум) по одному языку программирования каждый год.
— Читайте по одной технической книге ежеквартально.
— Читайте книги, не относящиеся к технической литературе.
— Экспериментируйте с различными операционными средами.
Важно продолжать инвестирование. Как только вы почувствуете, что освоили новый язык или фрагмент технологии, двигайтесь дальше. Изучайте другой.
Неважно, будете ли вы когда-либо использовать одну из этих технологий в проекте или даже не упомянете о них в своем резюме. Процесс обучения расширит ваше мышление, открывая вас для новых возможностей и новых путей в творчестве. "Перекрестное опыление" идей важно; попытайтесь применить выученные уроки к проекту, над которым вы работаете в настоящее время. Даже если в вашем проекте не используется некая технология, вы наверняка сможете позаимствовать некоторые идеи.
Эндрю Хант и Дэвид Томас. Программист-прагматик. Путь от подмастерья к мастеру
Как сказал Дэвид Грфйс (Gries) подход к программированию не должен определяться используемыми инструментами. В связи с этим он проводит различие между программированием на языке (programming in lanuage) и программирование с использованием языка (programming into language). Разработчики, программирующие «на» языке, ограничивают свое мышление конструкциями, непосредственно поддерживаемых языком. Если предоставляемые языком средства примитивны, мысли программистов будут столь же примитивными.
Разработчики, программирующие «с использованием» языка, сначала решают, какие мысли они хотят выразить, после чего определяют, как выразить их при помощи конкретного языка.
Стив Макконнелл. Совершенный код.
Я привел три цитаты, каждая из которых говорит о второстепенной роли языка программирования в жизни разработчика. Причем автор одной из них имеет непосредственное отношение к одному из языков программирования!
Конечно же, я не придерживаюсь мысли, что язык программирования не играет никакой роли. Нет, это не так. Я не считаю, что не нужно углублять свои знания в конкретном языке или технологии; не считаю, что нужно выбросить книги Герба Саттера и Андея Александреску, Джошуа Блоха и Билла Вагнера, и не зачитыватся этюдами nikov-а на этом форуме. Все это очень полезно. Но польза не только в том, что эти знания вы можете использовать сейчас на текущем проекте с текущим языком и технологией, а в том, что эти знания позволят перейти вам на следующий уровень своего развития и решать более сложные задачи в следующих проектах, уже на совершенно других языках программирования и совершенно других технологиях.
Продолжая рассуждение о языках программирования в жизни разработчика, достаточно вспомнить, что пишет Брукс и Буч о сложности программных систем:
Эйнштейн неоднократно утверждал, что природа должна иметь простые объяснения, поскольку Богу не свойственны капризность и произвол. У программиста нет такого утешения: сложность, с которой он должен справиться, лежит в самой природе системы
а затем:
Сложность программного обеспечения – отнюдь не случайное его свойство. Сложность вызывается четырьмя основными причинами: сложностью реальной предметной области, из которой исходит заказ на разработку; турдностью управления процессом разработки; необходимостью обеспечить достаточную гибкость программы; неудовлетворительными способами описания поведения больших дискретных систем.
Как вы можете заметить, не один из этих пунктов не содержит фразы: «сложность программного обеспечения обусловлена неверным выбором языка программирования». Кроме того, вам будет довольно сложно найти цитату авторитетного автора, который бы сказал что-то вроде этого: «Изучение языка программирования А – это ваш путь к успеху. Благодаря ему уже через полгода его изучения вас ждет почет и уважение в среде разработчиков по всему миру, вы будете президентом корпорации и будете ездить на Bentley, а вот если ваш выбор остановится на языке программирования Б – вас ждет позор, забвение и жизнь на помойке».
На закуску, хочется привести еще одну цитату Ханта и Томаса:
Программирование – это прикладное искусство. Простейший его смысл заключается в следующем: заставить компьютер делать то, что вам нужно (или то, что нужно пользователю, работающему с вашей программой). Программист – он и слушатель, он и советник, он и переводчик и даже диктатор. Вы пытаетесь ухватить суть не совсем ясных требований и найти такой способ их выражения, что только машина сможет оценить их по достоинству. Вы пытаетесь задокументировать работу так, чтобы она была понятна другим, спроектировать ее так, чтобы другие могли на нее положиться. Кроме того, вы пытаетесь сделать все это вопреки безжалостному ходу стрелки часов, отсчитывающих время, отпущенное на проект. Каждый день вы совершаете по маленькому чуду.
Это непростая работа.
Многие предлагают вам помощь. Фирмы-поставщики инструментальных средств настойчиво говорят о чудесах, которые творят их программы. Мудрецы от методологии заверяют в том, что их средства гарантируют результаты. Каждый считает свой язык программирования лучшим из лучших, а операционную систему – панацеей.
Разумеется, эти утверждения неверны. Простых ответов не существует. Не существует такого понятия, как наилучшее решение, будь то инструментальное средство, язык или операционная система. Существует лишь некие системы, которые являются более приемлемыми при конкретном стечении обстоятельств.
И в этот момент на сцену выходит прагматизм. Стоит избегать обряда венчания с конкретной технологией, но при этом необходимо обладать подготовкой и опытом, настолько обширными, что это позволит выбрать верные решения в конкретных ситуациях. Ваша подготовка происходит из понимания основных принципов информатики, а опыт основывается на разнообразных практических проектах. Теория и практика сочетаются, придавая вам силу.
ЗЫ. топикпастеру (если он все еще читает это обсуждение): расценивай это обсуждение так, как будто оно находится в форуме «Коллеги, улыбнитесь». Главное – выбор интересного коллектива с интересной задачей, а язык программирования имеет второстепенное значение.
Здравствуйте, VladD2, Вы писали:
VD>>> Что ты хочешь увидеть? AB>>Мастер-класс, я же написал VD>Это типа попрограммировать на публике чтобы все рты по открывали?
Да нет, Влад. От тебя мне будет достаточно, чтобы RSDN заработал на Nemerle под рантаймом Mono. Стабильно, без сбоев, быстро. Это будет высший мастер-класс.
VD>Да, давно пора. Слив, с твоей стороны, уже произошел. Что еще обсуждать?
* А пока что я вижу фаната-Влада, который носится с Nemerle как с писаной торбой;
* Я вижу сайт RSDN, который в течении полутора (или уже больше?) месяцев периодически или ложится или выдает HTTP-500 или тормозит безбожно;
* Я вижу насквозь сишный юниксойдный nginx, который поставили для латания брешей, с которыми не справляется IIS и начинка, и который бог знает сколько пытались настроить (хоть спасибо за сжатие — всего каких-то 740 килобайт сишного кода решили проблему, которую так долго не могли решить на IIS и Co);
* Я вижу лежащий уже с несколько недель поиск, который мало того, что лежит, так еще находится на стороннем ресурсе;
* Я вижу AndrewVK, который отдувается за всю команду и боится трогать код сайта от греха подальше (и в чем-то я его понимаю);
* Я вижу в форумах сообщения о том, что "безопасный" код сайта боятся открывать потому что в нем много дыр;
* Я вижу неработающие ссылки, которые отваливаются по таймауту и некому и нечему (и нечем, судя по всему) просматривать логи;
* Я не вижу Янус... впрочем, это уже другая история.
З.Ы. Да, я знаю, что это удар ниже пояса, но хотелось ответить по теме и без эмоций.
Здравствуйте, astral_marine, Вы писали:
_>Главное что бы работа нравилась, а язык — второстепенен.
_>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы.
_>C# больше как формошлепка под венду для работы с БД.
Это такая тема реферата?
_>Нет смысла изучать C# что бы потом перейти на С++, тем более, что новых проектов на С++ дофига.
Нет смысла изучать C++ что бы потом перейти на С#, тем более, что новых проектов на С# дофига.
_>Знаний для работы под С++ надо больше, но это изучается один раз в жизни. Много библиотек уже существуют по 10-20 лет и до сих пор актуальны. А самой CRT уже лет 40.
Вот те раз. Оказывается на C++ ничего нового за 10-20 лет не придумали? Ну ващеееее
_>Возможно, С# проще, но надо будет каждые несколько лет выкидывать старые знания, и изучать новую приблуду от Microsoft (WinForms и WPF).
Слушай не смеши народ, а. "Опыт не пропьешь"
Здравствуйте, gandjustas, Вы писали: G>>>Если не верите, то попробуйте написать алгоритм решения задачи: "вывести на экран все строки текстового файла, в которых более трех слов, отсортированные по алфавиту". G>Можете запостить сюда код решения на C++
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. CC>>>Ты пожалуйста ссылку дай на стандарт С++, где написано что именно так работает "стандартный аллокатор С++". G>>Стандарт C++ не определяет реализацию выделения памяти. Во всех известных мне реализациях С++ работает именно так. CC>Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"?
Еще раз: все известные мне реализации так работают.
CC>Я могу встроить тот же Hoard в CRT и он тогда будет являться стандартным аллокатором.
Не можешь. Твой CRT ниекто не будет распространять.
G>>>>Не разводи демагогию, давай факты. CC>>>Симметрично! G>>Я уже приводил код, где GC работает быстрее алокатора С++. CC>Аллокатора операционной системы, ты хотел сказать? CC>CRT вижуалки тупо зовёт HeapAlloc.
И что? У него внутри такой же хип, на таком же С++.
CC>Я уже приводил тебе ответный пример, где GC не был быстрее. CC>Напомню: CC>
Здравствуйте, niellune, Вы писали:
N>Здравствуйте! Нужен ваш совет)) N>Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию? N>В каких областях сейчас применяется C++?
N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++ N>Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
N>У меня есть опыт работы на php, причем не только web, а еще что-то вроде создания системы документооборота) N>Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
если хочется именно развиваться, то гораздо лучший выбор это C#:
1)C# сейчас — самый современный язык, который вобрал в себя много хороших качеств императивных, функциональных языков, на подходе еще и динамическая типизация в C#.
2)Платформа .NET, на которой работает C# — это не только десктопные программы, это еще и серверное веб-программирование с очень богатыми возможностями (см ASP.NET), клиентское веб-программирование (см Silverlight), разработка для мобильных устройств (Compact Framework), разработка игр (см XNA), разработка программ для роботов (см Robotics studio), разработка неограниченно масштабируемых программ в "облаке" (см Windows azure), очень простая автоматизация бизнеса (см Sharepoint, Dynamics, VSTA), автоматизация администрирования (Power Shell, MMC), разработка БД (см SQL CLR), простая разработка программ для параллельных вычислений (см Parallel FX), разработка для устройст (.NET Microframework).
3)Кроме того платформа .NET это не только язык C#, это функциональные языки F# и Nemerle, это скриптовые языки с динамической типизацией Python и Ruby. Общая базовая библиотека значительно снижает время обучения языкам, а само обучения разным языкам делает тебя гораздо более хорошим программистом.
4)Зная C# вполне можно писать кросплатформенные приложения с помошью Mono (только десктоп), которые запускаются под Windows, Linux, Mac и iPhone.
Здравствуйте, criosray, Вы писали:
ГВ>>Ты с топика-то не съезжай. Я тебе тут давеча вопрос про тестирование задал. Ответ будет? C>Я даю ответы только тем, кто хоть что-то понимает в теме. В Вашем случае не вижу смысла тратить время и силы, т.к. все-равно канут в лету.
Фи, как не интеллигентно.
Короче, орёл. Кури нормальную литературу а не ту фигню, которую ты мне попытался всучить под видом источников. Этой чепухой корми программистов, выращенных на ускоренных курсах переквалификации из домохозяек, только смотри, чтобы они ненароком не оказались студентами профильных специальностей — могут не понять. И самое главное — не подпускай их ближе, чем к веб-дизигну.
Для справки: нормальная литература, это либо та, которая издана примерно до 1995 года (до бума доткомов), либо та, которая не содержит словесей "...-driven development". Если с первым ещё понятно, то про второе объясню, почему. Потому что development направляется всегда (абсолютно всегда, исключений нет) только одной вещью — требованиями к конечному продукту. Функциональными, эстетическими, приснившимися в пророческом сне — не важно. Не паттернами, не agile-ением, не XP-данутостью, ни тем более — тестами. Тестирование — составляющая development, которая нужна только для одного — доказать, что продукт соответствует выдвинутым требованиям. Я не знаю, какую траву нужно смалить и в каких количествах, чтобы всерьёз упирать на то, что заведомо подчинённая часть может управлять целым. То есть противоречие тут уже на уровне терминологии определений. Потому, вероятно, Фаулер и мечется между "приблизительно", "обычно" и "это надо объяснить на следующих трёхстах страницах".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
S>>Дело не в том как написано и что тестируется и даже не в конкретном экспериментаторе (который думает что разница в контроле типов в рантайме), а в интерпретации результата. S>>Победил C# — недоумение S>>Победил С++ — значит C# — тормоз
COF>Не, ну все правильно. Победил C# значит надо разбираться где в C++ коде косяк
Совершенно верно. И пока программисты С++ ищут очередной косяк, программисты С# сдали проект в продакшн и занялись другим, получив свою денюжку.
Здравствуйте, vdimas, Вы писали:
C>>Ответьте на этот вопрос:
C>>
C>>Ну хорошо, расскажите тогда что в С++ "немного по другому", что программам на С++ нет пользы от автоматического тестирования. Внимательно Вас слушаю.
V>Вопрос стоит вовсе не так, и я дважды пытался поправить постановку вопроса. Видя твою невнимательность, мне крайне неохота что-либо объяснять, ибо опять может уйти в космос... Тем не менее, для истории:
Ну вот и хорошо. Значит польза все-таки есть. Хорошо, что Вы это осознали. Ну а то, что способы тестирования различаются в виду убогости С++ и native кода — это и так понятно было.
Главное что бы работа нравилась, а язык — второстепенен.
C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии.
C# больше как формошлепка под венду для работы с БД.
Нет смысла изучать C# что бы потом перейти на С++, тем более, что новых проектов на С++ дофига.
Знаний для работы под С++ надо больше, но это изучается один раз в жизни. Много библиотек уже существуют по 10-20 лет и до сих пор актуальны. А самой CRT уже лет 40.
Возможно, С# проще, но надо будет каждые несколько лет выкидывать старые знания, и изучать новую приблуду от Microsoft (WinForms и WPF).
PHP — это рабочая лошадка веб-программиста, если не нравится разрабатывать дизайн сайтов, то не имеет смысла его трогать.
Здравствуйте, shrecher, Вы писали:
S>Для разработчика это очень рискованно связываться с C#, т.к. требуется тащить .net runtime и привяжешь себя к Виндам.
Вот-вот! Только представь, каждый день на работу и обратно таскать эти два тяжелых чемоданчика с .net runtime. Там по 20 кг в каждом! Порог вхождения очень высок
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Круто, а фабричный метод так изобразите? E>А зачем в данном случае фабричный метод?..
Действительно, ООП там толком нет, только пародия на него.
E>Но вообще-то возможно и изображу, правда тут надо бы уточнить, что ты понимаешь под "фабричный метод", так как может и изображу, а может и нет... http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)
G>>ЗЫ. Передача указателя на стек до добра не доводит, большенство уязвимостей в ПО так и получаются. E>А как можно было бы такой уязвимостью воспользоваться? Ну, хотя бы, гипотетически? Это же не буфер, а объект на стеке.
Я не говорю что это уязвимость. Это причина появления уязвимостей.
Например есть убрать возможность передавать указатель на стек (или сделать такую передачу безопасной), то многих уязвимостей переполнения буфера просто не появится. В managed языках как раз такой возможности нету.
И в C++ есть способ безопасной передачи указателя на стек — ссылки называется. Только на ссылках вообще ООП не сделаешь.
E>Про то, что в больших программах 99% кода достаточно глубоко запрятаны для того, чтобы не смочь породить уязвимость, я и не говорю..
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Дык. Наследия нет, а наблюдения очевидцев — есть (см. Э. Ховёнен, Й. Сеппянен, c, М.: 1986 — почему-то к этим славным финнам у меня доверия поболе, чем к даже к Грэхему). Это лишний раз доказывает, что интерпретация "единственно правильного поведения" замыкания сильно зависит от.
Ты в очередной раз сморозил глупость и пытаешься выйти сухим из воды. Не выйдет.
Пойми, когда ты ошибившись начинаешь изворачиваться и молоть черти что пытаясь сделать серьезную мину при плохой игре, ты только больше себя дескридитируешь.
Common Lisp, которому ты кого-то тут отсылал, во-первых, не может иметь черти какой давности, так как появился относительно недавно, а во-вторых он изначально был весьма строгой спецификацией с самого начала содержащей определение замыканий в том виде который есть и сейчас.
VD>>CL — это стандарт вышедший таким каким он есть.
ГВ>Диалект под названием "Common Lisp" существовал задолго до принятия стандарта ANSI.
Ты очередной раз бредишь. CL был создан с единственной целью — стандартизовать Лисп.
ГВ>ИМХО, очень даже имело смысл делать такие специфические замыкания. Напоминаю об "иммутабельной природе" функционального программирования.
Твое ИМХО мало кого волнует. Попробуй подтвердить его ссылками.
И кончай изворачиваться. Все твои попытки сделать вид, что ты не говорил глупость делают эту глупость только более четко видной.
CL язык настолько же функциональный, как и императивный. Но замыкания в нем полноценные, в отличии от недоязыков авторы которых думают исключительно о производительности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
NBN>>>>А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами. S>>>Скажи это заказчикам. NBN>>Нормальным заказчикам мелкие программерские дрязги вообще пофигу. S>я не про дрязги, а про скорость разработки.
Суммарная скорость разработки крайне мало зависит от выбранного высокоуровневого языка.
) Х>Тут дотнет во всей красе, и тормозящий интерфейс, и утечки памяти, вобщем всё лучшее — детям :)))
Да уж, такое впечатление что дотнетчики живут в каком-то виртуальном мире, навеянном рекламными проспектами — в мире где нет утечек памяти, где программы летают, а критерием хорошести языка является то, насколько он поддерживает лямбды :) В конце-концов, ну не было в C++ лямбд — ну и черт с ними, вполне можно без них прожить. Что народ к ним привязался? А вот в C# нет деструкторов и переопределения операторов присваивания, например. Я конечно понимаю, что если чего-то нет в текущей версии C# — это не нужно, а если чего-то нет в C++ — это плохой дизайн языка, но все же :)
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, esil, Вы писали:
E>>Здравствуйте, MxKazan, Вы писали:
MK>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Думаете нельзя в C# на стеке данные размещать? MK>>>Думаю конкретно esil имеет ввиду, что нельзя разместить в стеке произвольные данные. MK>>>Массивы, например, туда не засунуть, ибо class
MK>>>А вот что имел ввиду minorlogic я, чесс говоря, тоже не понял. MK>>>Но эт не страшно
E>>Ну он как раз и имеет в виду, что мы можем произвольные типы размещать на стэке, что очень полезно, т. к. позволяет оставаться в рамках ООП-подхода и избегать множества выделений памяти в куче. G>Как будут работать виртуальные методы при размещении объектов на стеке?
После таких вопросов и появляются стереотипы, что С# отупляет
Здравствуйте, criosray, Вы писали:
ГВ>>Рассмотрю предложение на вакансию Тьюринг-тестера. C>Детский сад, вторая группа.
Предложения без вилки з/п не принимаются!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK>- Изначально ты написал: "И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ". MK>- На что получил ответ, что рантайм по прежнему 2.0, что он не менялся со времен второго дотНета, ну нету CLR 3.0 и всё.
А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например?
MK>- Тем не менее, как контраргумент ты выдвинул такое: "Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание."
Человек дал понять, что там ничего и не могло поменяться, ввиду того, что версия CLR не менялась. Я попытался опровергнуть это "мнение", дав немного информации для затравки.
MK>Собственно отсюда и вывод, что сервис-паки каким-то магическим образом повышают версию.
А ну тогда ты прав, ведь .Net Framework 3.5SP1 — это следующая (более высокая) версия после .Net Framework 3.5
Знаешь, вот какая-то сплошная лень и инфатильность прет из форумов последние годы. Раньше достаточно было просто намекнуть, и все всё понимали, а теперь разжевать мало, надо не забыть в рот положить...
Ok, вот ложу еще и в рот:
В Windows версия файла состояит из 4-х полей: major, minor, build, revision. MS для версий своих продуктов тоже использует подобную маркировку, причем версии файлов старается маркировать так же как версии продуктов (не всегда правда, но не суть). Далее, хотя последние 2 поля давно используются по другому назначению, чем значит их перевод на русский, тем не менее для обозначения версии используюся именно целочисленных 4 поля (в классике было по 2 байта на каждое). Так вот, мой оппонент даже не потрудился открыть эксплорер и посмотреть на все 4 поля версии, про которую он так много говорил. Он бы тогда обнаружил, что последнее поле в версии постоянно изменяется, и оно вовсе не одинаковое у всех файлов. (Например сейчас последнее поле версии у разных файлов колеблется от 42 до 3053, а после первого выхода .Net 2.0SP1 номер в этом поле выше 926 не поднимался)
Итого: менялся сам рантайм, и, разумеется, менялись версии файлов, его составляющих (нельзя же было заменить файл, не обновив ему версию).
------------------
Для интереса — как это выглядит с моей стороны:
— я припомнил Владу те времена, когда он регулярно вещал не только про Немерле, но и про .Net, рассказывая как много и как просто будут делать будущие оптимизации. Потом это дело притихло, за год примерно перед выходом .Net 3.0 стала просачиваться сюда инсайдерская инфомация об возможных улучшениях рантайма, привязанная к выходу нового фреймворка, и опять же была куча разговоров о "перспективности" и оптимизациях и святого духа, Аминь.
— тут влазит некто, и озвучивает что-то про версию CLR и тут же озвучил мнение, что я не в курсе этого.
— я спрашиваю: и при чем тут?
— в ответ: ты даже не отличаешь CLR от .Net Framework и по той причине ламер.
Дабы не спугнуть, хотел аккуратными вопросами подвести человека к самостоятельному пониманию глубины поримой им... как бы это... невпопадицы, во.
Но не иначе там оказался кремень... по всему объему тела, не исключая жизненно важного для программиста органа, раз из-за такой, мягко говоря, муйни, вытекло столько постов.
весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
Здравствуйте, VladD2, Вы писали:
VD>Не возьмусь оценить точные проценты применения, но почему-то мне кажется, что C#, а уж тем более Ява применяется гораздо чаще на сегодняшний день. И объясняется это тем, что он применяется для автоматизации предприятий и создания сайтов в интернет. В этих областях есть много нюансов и написать единый коробочный софт для них в принципе невозможно. А это ниша для огромных стад разработчиков.
Ну и? Писали раньше на VB/ASP, теперь C#/ASP.Net. Эти стада заняты разработкой, которую считалось плохим тоном делать на С++ во все времена.
VD>С++ же используется в последнее время больше частью для создания высокотиражных продуктов где стоимость разработки не так важна
Правда твоя, он теперь преимущетсвенно используется для разработки высококачественного софта, и в каждую дырку его теперь не суют, что не может не радовать.
VD>так как окупается количеством продаж (т.е. — игры, ОС, офисные приложения), а меньшее потребление компьютерных ресурсов может увеличить объем продаж.
Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
Здравствуйте, BulatZiganshin, Вы писали:
BZ>в таком случае языка современней машинных кодов, в твоём понимании так и не появилось. но почему-то люди, включая тебя пишут на языках постарее — асме, c++ том же :))
Хорошие компиляторы генерируют достаточно неплохой код и то иногда приходится на ассемблере модули использовать
BZ>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва" :)))
Аналогия вещь хорошая, но обоюдоострая. Представь, что все начнут мусор не в урны кидать, а на землю — все равно дворник потом подберет :) Наверное, это будет не очень хорошо. Продуманная стратегия управления ресурсами в C++ позволяет не заботиться о памяти точно в такой же высокоуровневой манере.
Здравствуйте, dotidot, Вы писали:
D>Здравствуйте, niellune, Вы писали:
D>советую забыть про с++. На нем сейчас пишут почти только игрушки/драйверы за редкими исключениями.
Хмм, да? А как на счет этих:
MSOffice12, Microsoft Silverlight, Windows7, Vista, QT, WinRar, Adobe (Photoshop and Co), QuickTimePlayer, Notepad++. Дофига потребительских прог на C++, помоему, гораздо больше чем на C#. Для разработчика это очень рискованно связываться с C#, т.к. требуется тащить .net runtime и привяжешь себя к Виндам.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>>>Помогают — облегчают рефакторинг и читаемость кода. G>> G>>Шаблоны улучшают читаемость только в самых простых случаях. NBN>Фигня. Заявление аналогично: линк нужен очень редко.
На C++ он вообще не нужен.
А вот с шаблонами все гораздо прозаичнее.
Когда вы пишите vector<string> то читаемость улучшается. А когда идет vector<sometemple<anothertemplate<param> >, anotherparam> > то читаемости не остается вообще. При этом нету вывода типов и вам придется каждый раз писать эту аннотацию. typedef спасает, но далеко не всегда.
Например при ипользовании ФВП с помощью буста затайпдефить все функции не получися.
А еще не дай бог где-нить ошибиться, компилятор моментально вывалит кучу нечитаемых ошибок почему класс не может быть инстанцирован.
NBN>>>Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд. G>>Ну если вашу портануть может и будет тормозить, а если нормально написать на .NET не факт что будут лишние тормоза. NBN>Факт.
Доказательства будут?
NBN>>>>>Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься G>>>>Почему? NBN>>>Потому что у неё будут плохие потребительские качества, хуже чем у конкурентов. G>>Потребительские качества очень мало зависят от языка разработки. NBN>02-25. Зависит. На тормозявых и неоптимальных языках нельзя писать оптимальные приложения. Практика это подтверждает самым что ни есть великолепным образом.
Не надо обвинять язык в том что вы не можете написать на нем нетормозявое приложение. Это не его вина.
NBN>>>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов. G>>За исключением установки .NET CF (один раз) проблем нет. NBN>1. Один раз для каждого нета.
Если у вас одно приложение, то как оно вас волнует?
NBN>2. Это минимум в _2_ раза усложняет процесс инсталляции, это просто недопустимо, даже для писюка.
Какой ужас, как же люди живут...
NBN>>>В добавок, там нет, допустим, линка И встречаются свои глюки. G>>У вас неправильные сведения, там есть Linq. G>>Там нету expression trees, но Linq to Objects и Linq to XML это не мешает. NBN>Ага, самого клёвого нет
Чего?
NBN>>>Плюс, опять же, старый код G>>Ну от него никуда не деться. NBN>Ага, он делает разработку на С++ значительно проще, чем разработка на шарпе и лучший результат в конечном результате.
Он ниче проще не делает, во многих случаях даже делает хуже. Переписывание всего — огромный риск, на который далеко не все идут.
NBN>Тут ведь как — чуть слажал и тебя конкуренты съели
Только от языка это ну вообще никак не зависит.
G>>>>Кстати Linq у вас уже появился? NBN>>>Он довольно тормозявый. G>>Я уже говорил что performance-critical код можно писать на C или юзать unsafe (почти тот же С). NBN>Вот это — настоящее извращение, ка я уже говорил — показатель невладения С++, а следовательно бессмыслености спора.
не смешите, вы уже многократоно показали свое невладение ничем кроме С++, да еще и бравируете этим.
NBN>>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит. NBN>Во-первых, позволяет, а во вторых — начинается GC с использованием диска, а это п..ц и прости-прощай юзабилити
У вас программы столько памяти жрут?
Я под два гига выделял исключительно для рассчетов матириц порядка 1000*1000.
Кстати почитайте как работает выделение памяти для больших блоков в .NET, не будет большого тормозняка.
NBN>>>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество) G>>"Думаю" — слабый аргумент. NBN>Достаточный. Это называется экспертная оценка
Какой из вас эксперт, если вы ниче дальше С++ и шароварок толком не видели.
NBN>>>P.S. NBN>>>Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя. G>>За такой громкой фразой скрываются шаровары? NBN>Программы продающиеся индивидуальным пользователям, те которые живут в конкурентной среде. Игры с бюджетом в 10 мегабаксов для PS3 — это шаровары?
И сколько из этого бюджета ушло на разработку?
Я видел игры с бюждетом в несколько миллионов рублей, там для программиста работы на пару месяцев.
Здравствуйте, criosray, Вы писали:
C>У нас пользователи в госструктурах на компах, которым уже по 2-4 года работают с нашим клиентом на .NET уже больше года в production режиме. Клиент довольно тяжелый: диалоги, графики, отчеты, таблицы, формы — полный комплект. Нареканий на производительность до сих пор не было. "ЧЯДНТ?"
да всё ты делаешь так, я же говорю, VB 21-го века, как бы понимаешь, на примере моего проекта, относительно небольшое приложение, формы, диалоги, отчёты, никто не жалуется, только я вот смотрю на как формочка появляется и меня грусть берёт, вот реально по ощущениям пластилин какой-то, оно то пользователю кажется и ничего, ну полсекунды на форму, или две — а мне то понятно что та же самая форма с теми же самыми контролами будь она писана на MFC например — появилась бы мнгновенно, потому что нет хмля, нет джита, нет гц будь он неладен. Но пипл хавает , ему лишь бы работало, а будет отчёт генерится 5 минут или 5 секунд — неважно, лишь бы не пять часов. Потому что ентерпрайз, другой такой программки у них нет и не будет, сравнивать не с чем. На десктопах ситуация кардинально другая — тут каждый сам за себя, пользователь выбирает, а не как в ентерпрайзах — "мы сейчас к вам прийдём и всё автоматизируем процесс", у пользователя процесс простой — почту почитать, фильму посмотреть, порисовать, поболтать, документ набрать, и тут ты к каждому в дом не прийдёшь с уговором, не создашь индивидуальный софт для каждого десктопа, тебе нужно сделать нацеленый на широкую аудиторию качественный софт, только вот незадача, а качественный нейтив то в этой области уже есть, а лучше качественного нейтива может быть только другой качественный нейтив с большим функционалом, а функционал реально ограничен только одним ресурсом — ресурсом компьютера. Если бы дотнет хотя бы в полтора раза ускорял разработку качественного десктопного софта, за 8 лет на нём бы уже написали немеряно десктоп приложений (посмотрите на C++, когда появился первый промышленный компилятор, и сколько софта писалось на C++ через 8 лет). Однако есть момент. Качественного десктопного софта на C# нет.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Замыкать можно ещё и значения. Значения указателей — в том числе и т.д., и т.п.
Ты бы лучше не говорил о том в чем не разбираемый. А то такой бред несешь, что просто смешно.
Замыкать значения невозможно. Это просто глупость. Значения на то и значения чтобы копироваться. Суть замыканий как раз в том, чтобы иметь доступ к значениям видимым в лексической области видимости. При этом все переменные и поля которые попали в замыкание должны жить не меньше чем область в которой они объявлены и не меньше чем живет замыкание. Любой указатель должен быть верным до момента когда замыкание перестанет существовать.
Это приводит к тому, что образуется граф взаимно-связанных объектов время жизни которых крайне сложно отследить. При наличии GC следить за и не надо. Если GC нет, то требуется или накладывать ограничения, которые сузят область применения ФП и ухудшат удобство пользования им, или вводить какие-то другие механизмы отслеживания времени жизни связанных объектов. Если исключить GC, я знаю только одну такую — подсчет ссылок.
ГВ>Вот это: "Такие как ollv". Если бы ты сказал "некоторые", я бы согласился. А так ты едва ли не прямо сомневаешься в квалификации ollv, что порицается правилами форума.
А я и не сомневаюсь. Он продемонстрировал свою квалификацию самым прямым образом. Прямо и неприкрыто показал, что кроме С++ ничего в жизни толком и не видел.
ГВ>Место ему там или нет — оставь решение этой задачи самим разработчикам сайтов. Полагаю, что их квалификации вполне достаточно для такого выбора.
А я полагаю, что такой выбор сам по себе говорит о квалификации, точнее вменяемости, таких разработчиков.
ГВ> Ты скажи, ты сам много сайтов на C++ написал, а потом переписал их на что-то ещё, чтобы уверенно утверждать, что C++ не даёт никаких преимуществ?
Я не идиот чтобы заниматься таким маразмом. На С++ я пописал не мало, так что имею полное моральное право судить о его возможностях и недостатках. Как говорится не надо быть курицей, чтобы иметь права рассуждать о вкусе яичницы.
ГВ>>>MS и IBM (как и все остальные) вольны поступать так, как им заблагорассудится. VD>>Ага. И выбирают для сайтов Яву и дотнет.
ГВ>И что с того? Выбрали и выбрали. Как это должно сказываться на выборе, который делают совсем другие люди?
Никак, хотя и сказывается на практике. Это просто демонстрирует, что даже компании с слабо ограниченными ресурсами не выбирают С++ для не не тиражных серверных решений.
ГВ>>> И кроме всего прочего, слишком мало критериев для отсечения C++: "в кратчайшие строки получить надежное решение, когда денег на разработку нехватает". Он запросто может оказаться наилучшим выбором с учётом других факторов. VD>>Ага. Но другим фактором может быть только крайняя нужда в достижении высокой вычислительной производительности путем ручной оптимизации.
ГВ>Отнюдь. Решающим фактором может оказаться всё, что угодно, вплоть до наличия под рукой подходящих библиотек и доступности программистов. А ещё фактором может оказаться, например, необходимость тащить .Net FW.
Изумительная логика. Согласен, что на практике именно ею и руководствуются очень многие, но она в корне порочна. Вот представь себе, что речь идет о разработке новой марки автомобиля. Представь себе, что за разработку его берутся не инженеры специализирующиеся на автомабилях, а скажем ракетчики. Они кончено тоже знакомы с аэродинамикой, механикой, физикой, математикой и т.п. и потенциально могут сравиться с задачей. Мало того. В качестве инструментов они берут не заточенные под автомобили кады и т.п., а то на чем они проектировали вертолеты. Вместо двигателей внутреннего сгорания используют ГТД или вообще реактивный двигатель, вместо железа — алюминий и титан и так во всем. В результате автомобиль конечно у них скорее всего получится, но вместо года они потратят пять лет и вместо экономного и относительно недорого автомобиля у них получится монстр который никому не будет нужен на практике.
Маразматическая ситуация? Да, не несомненно! Но почему же такую же ситуацию в сфере разработки ПО ты считаешь само собой разумеющейся?
Если те кто пишет софт берутся за область где С++ не подходит должным образом, то они обязаны владеть альтернативными технологиями. В противном случае им просто не следует браться за выполнение этой работы.
А у нас получается, что людям в лом изучить другие языки, другие технологии, но они все равно берутся за разработку софта в любой отрасли и виде деятельности.
Слава Богу, что такого маразма все меньше и меньше. Но зачем же его защищать?
ГВ>Э... Не так. C++ допускает опасные операции. Но вовсе не требует. А ответственность везде в цене, это от языка не зависит.
Допускать уже достаточно. Но он не только допускает, но и провоцирует их. А зачастую не предоставляет других путей как небезопасные.
К тому же чтобы создать относительно безопасные решения требуется весьма высокая квалификация и немалые силы на выработку стратегии и контроль ее соблюдения. Заметь я не говорю, что речь идет о инструменте в руках ламеров. Он и весьма квалифицированным программистам надевает гандикап.
VD>>Есть такое умное высказывание (не помню чье) — человек не должен делать работу которую может сделать машина. А С++ заставляет человека делать работу которую можно возложить на машину.
ГВ>Не так. C++ позволяет человеку влезть в то, чем обычно занимается машина.
Нет. Он заставляет заниматься человека тем, что может контролировать машина. Он не предаставляет возможности не думать об упрвлении памятью даже если программист этого очень хочет. Он не предоставляет гарантий типобезопасности. Эти аспекты требуется контролировать вручную!
ГВ>1. Ограничения на выбор допустимых абстракции есть у любого языка программирования. Так уж они, засранцы, устроены.
Действительно современные языки предоставляют выбор и довольно широкого круга вариантов. С++ же застрял в 80-ых. ООП и шаблоны. А далее голимый кривой С.
ГВ>2. Шаблоны широко используются в программировании на C++. Не понятно, ты считаешь это негативной чертой? Или — ограничителем в выборе абстракции?
Они средством затычкой с помощью которой люди пытаются обойти ограничения. Но результат неудовлетворительный. И только те, кто кроме С++ ничего не видел, считают это в порядке вещей.
VD>>Причем очень распростронено мнение, что производительность важнее качества.
ГВ>Нередко производительность является составляющей интегральной характеристики "качественно".
Я бы скорее сказал — не часто. Но дело даже не в этом. Решение проблем производительности только путем работы на низком уровне — это не вреный подход. Выигрыш от выбора более оптимальных алгоритмов куда более существеннен нежели от ковыряния в указателях.
Так что более верно было бы сказать, что иногда С++ позволяет решить проблемы производительности, особенно если в приложении есть много тупых вычислительных алгоритмов и нет путей их алгоритмической оптимизации.
VD>>Многие защитники С++ приводят в качестве примера 3D-игры. Мол, "почему их пишут на С++?". А стоило бы посмотреть на другой аспект. Почти все эти игры безбожно глючат. Играть в некоторые до выхода патчей просто невозможно. Большая часть ошибок в этих играх могла бы быть попросту не допущена, будь программа написана на более качественном языке.
ГВ>С чего ты это взял?
Что? Что написаны на С++? Из слов тех кто это приводит к качестве доказательства того, что все подряд надо на С++ писать.
ГВ>Например, известно, что крутоглюкавый Сталкер (который без кучи патчей вылетает в самых неожиданных местах) написан с использованием Lua.
Ты откровенно говоря гонишь. На Луа там написаны только скрипты к сенкам да логика некоторая. А глючащий движок написан на С++. Причем Сталкер то работает еще приемлемо. А вот Кризис вылетал отменно. Особенно если у тебя не дай бок карточка по новее или звуковух по прикольнее. И скрипты там были явно не причем. Там проходы по памяти, потеря ресурсов и т.п.
ГВ>Известна также душещипательная история о скоростной резке Сталкера перед выходом (часть карт порезана, часть выброшена и т.д.) Думается, что вторая причина посущественнее остальных будет.
Внимание, вопрос если бы в Сталкере логика игры писалась бы на С++, а не на скрипте, то код игра стала бы надежнее или наоборот?
ГВ>Не понял. Чьи данные ты проверял?
Лесперов которые кидали ссылки на тесты. Зайди в Декларативное программирование и спроси. Тебе тоже ссылок накидают.
ГВ>О чём не заикаться? Я тебя не понимаю что-то. fold, в общем, до какой-то степени эмулируется accumulate+boost::bind, а у find_if — своё, вполне определённое назначение и она вполне применима к широкому набору типов. Шаблон же, однако.
Уродства получаемого в итоге стыдиться. Сравни.
Вот пример использования find_if:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool IsOdd (int i)
{
return i % 2 == 1;
}
int main ()
{
vector<int> myvector;
vector<int>::iterator it;
myvector.push_back(10);
myvector.push_back(25);
myvector.push_back(40);
myvector.push_back(55);
it = find_if (myvector.begin(), myvector.end(), IsOdd);
cout << "The first odd value is " << *it << endl;
return 0;
}
А вот тоже самое на более современном языке:
using System;
using System.Console;
module Program
{
Main() : void
{
def myvector = Collections.Generic.List([10, 25, 40, 55]);
def it = myvector.Find(x => x % 2 == 1);
WriteLine($"The first odd value is $it");
}
}
И это простой случай без замыкания. С замыканием разница начинает расти намного сильнее.
ГВ>Так... Тогда объясни, что ты считаешь "прямыми", а что "побочными" эффектами шаблонов?
Прямой эффект — это параметрически полиморфизм, т.е. то ради чего шаблоны были введены. А вот вычисления во время компиляции основанные на том факте, что раскрытие шаблонов идет итеративно и может быть остановлено человеком описавшим частный случай шаблона — это использование побочного эффекта. Автор языка не предусматривал подобного использования шаблонов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>>>Может всетаки уже стоит признать что в С++ в обозримом будущем не будет нормальных лямбд. ГВ>>Знаешь, это очень сильное колдунство — признавать отсутствие наличествующего. "Видишь суслика? А его нет!" G>Точно, ты ведь до сих пор не признаешь что нету и не будет в С++ нормальных лямбд, а в других языках есть.
Круто, давно не встречал фраз, построенных таким образом. Ты меня, правда, за ребёнка держишь? Или за подчинённого, которого можно заставить верить в любую ахинею? Ладно, шутка, не обижайся.
Теперь — по топику.
Я признаю наличие в других языках других реализаций лямбд. Но я не считаю "единственно нормальной" реализацию лямбд в каком-то определённом языке, или их наборе. Например, то, что лямбды в "других" языках непременно требуют вовлечения GC я считаю изъяном их реализации, пусть и повсеместно встречающимся. Я, например, знаю, что использование лямбда-выражений не всегда требует отдельного управления жизненным циклом замкнутых переменных. Отсюда, я не думаю, что непременное привлечение GC — "нормально", т.е., сродни эталону.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, niellune, Вы писали:
AVK>Хороший топик для потенциальных работодателей. Участников холивара можно смело на должности выше сеньора не брать
О, спасибо, пополнит мою коллекцию:
Писали ли вы в резюме "C/C++" через слеш?
Придерживаетесь ли вы code-style ядра виндовс?
Знаете формулу площади круга?
Ваше резюме помещается на одну страницу?
Ваше резюме не помещается на одну страницу?
Разберетесь с фиговиой а-ля // wtf????\ etc. ?
Разберетесь с фиговиной а-ля :> etc. ?
Имеете ли опыт работы в аутсорсе?
Отписывались ли вы на рсдн в форуме "О работе" в топике "Работа — с чего начать: С++ или С#?"
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Отсутствие большого объема свободной памяти и отстутствие свободной памяти вообще, сравнивать, как бы, нельзя G>>Это к тому что тормозов дополнительных нету независимот от .NET или native.
H>Реальность с тобой не согласна. Увы.
У тебя видимо альтернативная реальность.
Сильнуе галлюцинации вызванные GC-фобией.
H>>>>>Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное. G>>>>3 раза в секунду это часто? G>>>>На гигагерцовом процессоре за секунду выполняется 1000000000 тактов. При этом если в приложении ничего не происходит, то все поколение становится мксором и не происходит фактически уплотнения кучи. H>>>Это демагогия. G>>Демагогия это делать выводы о производительности основываясь на мифилогизированных представлениях о GC. H>Я делаю выводы исключительно на основе личного опыта работы с .Net софтом.
Ты не написал ни одной строчки production кода на .NET.
А делать выводы, основанные на просмотре каких-то говнопрограмм как минимум глупо, ты ведь даже не знаешь почему они тормозят, если вообще тормозят (про галлюцианации смотри выше).
G>>>>Сборщик мусора на многопроцесорной машине работает в фоновом режиме по большей части. G>>>>Так что влияние на производительность минимальная.
H>>>Сборщик мусора, даже на многопроцессорной машине, даже "серверный", вынужден останавливать выполняющиеся потоки. Concurent GC требует синхронизации, что на производительности не может не сказаться. G>>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение. H>А я этого и не говорил Современным нативным аллокаторам тоже не требуется.
Я привел пример кодаЮ доказывающий обратное.
Можешь конечно повторять свой тезис, но правдивее он не станет.
H>>>Поколения конечно хорошо, но приводимый мною пример с XML-RPC.NET вызывает таки сборку во втором поколении (причем размер кучь у поколений постоянно меняется) G>>Как это влияет на производительность? H>Отрицательно.
Доказательства?
G>>Покажите код (.NET и нативный) и результаты замеров, тогда вам кто-нибудь поверит. H>Код библиотеки XML-RPC.NET можешь скачать с ее домашней страницы. Для мониторинга использовал ProcessExplorer. В итоге, на 170 вызовов XML-RPC метода имеем: 101 сборка во втором поколении, 111 сборок в первом поколении, 295 сборок в нулевом поколении.
А замеры производительности? Без них от этого толку нет. Лучше профайлером, чтобы сразу было видно где и от чего тормозит.
H>>>>>Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения. G>>>>А че, нативное приложение в свом не выгружается? Что ты пытаешься показать этой фразой? H>>>Я говорю о том, что Paint.NET откушавший больше чем Turbo Delphi IDE, отправляется в утиль и остается там навсегда. G>>Такое чувство что кода ты был маленький к тебе приходил дядька из Microsoft и отобрал у тебя конфетку. Теперь ты выплескиваешь свою обиду на форуме. H>Ничего личного. Психоанализ явно не твой конек
Да я просто стебаюсь.
G>>Вообще за все время ты ни разу не привел аргументы почему .NET работает медленнее, все сводилось к каким-то левым наблюдениям (которые еще и не у всех воспроизводятся) и недалеким выводам. H>А как надо наблюдать, чтоб наблюдения стали правыми? Использую, что имеется в наличии (софт т.е.), мониторю чем сам МС велел (perfmon-счетчики, они и в ProcessExplorer'е). Выводы исключительно по результатам
По каким? Ты делаешь вывод о производительености, при этом не приводя ни одного факта, касающегося непостредственно этой самой производительности.
Анализ — явно не твой конек
G>>Кроме того ты очень активно в своих суждениях опираешься на библиотеку XML-RPC.NET, которая вообще непонятно как работает. H>Библиотека XML-RPC.NET используется по нескольким причинам: 1) XML-RPC мне интересен. 2) При его реализации не обойтись без многократных выделений памяти, что в свою очередь позволяет увидеть, как на это реагирует GC. В общем, ссылку на сурсы я дал. Стоит ждать критики?
Где XML-RPC.NET найти я знаю, дай сырцы натвного исполнеия для сравнения.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Ну давайте чтобы не быть голословным приведу код: G>>....поскипано... G>>Собиралось 2008 студией, релиз, запуск из проводника. G>>C++ — 562 мсек, C# — 92 мсек.
G>>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++. G>>#include <windows.h>
Х>маленькая поправка
Х>
Здравствуйте, gandjustas, Вы писали:
G>Ну конечно не избавишься сразу от C++ везде. Есть тонны кода на C++, которые приносят много денег и этот код надо саппортить, есть кучи программистов, которых не выгонишь на улицу в один момент, есть кучи недалеких менеджеров, которые кроме C++ других языков и не слышали. G>Только ни один из этих факторов не говорит что С++ чем-то хорош.
просто удивительно, фраза одинаково верна для всех языков из мэйнстрима
Здравствуйте, COFF, Вы писали:
COF>Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает.
А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций?
А то страшно стало! Быстрее всё всё всё в main переношу...
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
CC>>>Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"? G>>Еще раз: все известные мне реализации так работают. CC>Мы о С++ либо об известных тебе реализациях?
Думаешь я мало компиляторов видел?
Приведи парочку компиляторов С++ промышленного качества, в которых аллокация по кардинально другом алгоритму делается.
CC>>>CRT вижуалки тупо зовёт HeapAlloc. G>>И что? У него внутри такой же хип, на таком же С++. CC>А в С++ на GCC под Linux будет такой же хип?
Похожий.
CC>>>Я уже приводил тебе ответный пример, где GC не был быстрее. CC>>>Напомню: CC>>>[q] CC>>>твой код: CC>>>VS 2003 + ICC 11, C++ : 188 — CRT реализует аллокацию через HeapAlloc CC>>>VS 2008, C# : 117
G>>Твой наколенный непотокобезопасен. CC> CC>Жжошь! CC>Можно узнать с какого перепугу ты так решил? CC>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока.
Значит уже забыл. Пулы интересуют еще меньше, так как они требуют подгонки размеров блоков и пулов.
Как аллокатор общего назначения использовать смысла нету.
Здравствуйте, criosray, Вы писали:
V>>Вопрос стоит вовсе не так, и я дважды пытался поправить постановку вопроса. Видя твою невнимательность, мне крайне неохота что-либо объяснять, ибо опять может уйти в космос... Тем не менее, для истории: C>Ну вот и хорошо. Значит польза все-таки есть. Хорошо, что Вы это осознали. Ну а то, что способы тестирования различаются в виду убогости С++ и native кода — это и так понятно было.
Мда... С такими апологетами .Net в противниках не нуждается...
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK> Не, ну это как-то не хорошо с твоей стороны. Получается ты просто игнорируешь реальные примеры. Зачем тогда спрашивать
Я просто знаком с фанатизмом Влада, чтобы не тратить время на бесполезный для меня разговор (не в обиду Владу). Мастер класса на Nemerle по рантаймом Mono я все равно не дождусь — эта задачка будет посложнее, чем просто мастер-класс на Mono, а вот ресурсов потеряю изрядно.
Здравствуйте, IID, Вы писали:
IID>Возьмём два абсолютно идентичных алгоритма. Что теперь у нас со скоростью ?
Получаются два абсолютно сферических коня в вакууме.
Даже два абсолютно одинаковых алгоритма на одном и том же языке можно реализовать совершенно по разному.
Если же вернуться к реальности (от сфероконей), то тут уже неоднократно замечали, что упрощение разработки позволяет в том числе потратить больше времени на тестирование, выбор подходящих алгоритмов и их оптимизацию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, samius, Вы писали:
VD>>>>Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
H>>>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами. S>>Из чего сделано выделенное предположение?
H>Это не предположение, это этакая параллель... .NET core библиотеки-то насквозь C++'сные.
(я бы сказал, что местами)
Так вот откуда ноги растут у тормознутости дотнета
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
IID>>>У нас в проекте именно так, собственные new/delete, потому что в KernelMode аллокация вовсе не через HeapAlloc делается. Полёт нормальный. G>>Разве C++ в ядре? А что там от C++ осталось то? CC>А что в твоем понимании С++? Очень интересно, просвети.
Полиморфизм, наследование, шаблоны. В принципе если писать код на С для интеропа с другими языками, то и динамическое выделение памяти не нужно.
CC>А то ты в последнее время завел шарманку "в нейтиве С рулит, С++ не нужен", что наводит на некоторые интересные мысли о том, что ты понимаешь под С++.
В нейтиве рулит нэйтив. А в программировании — управляемые языки и мощные платформы.
Здравствуйте, VladD2, Вы писали:
VD>>>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++? O>> на каком конкретно? VD>В высказывании утверждалось, что С++ имеет преимущество. Не говорилось, что преимущество именно перед конкретным языком. Значит выбор из всего списка языков. Так что тебе прийдется или признаться, что ты спорол чушь или привести пример абстракции которая не реализуется на одном из существующих на сегодня языке.
Как ты правильно заметил, Тьюринг-полные языки, в общем, эквивалентны по своим возможностям в смысле выражения абстракций. Всё дело в итоговой цене на билет. Я не сомневаюсь, что абстракцию автоматического управления ресурсами вроде std::auto_ptr можно реализовать и на Хаскеле, и на Лиспе и ещё много на чём. Вопрос остаётся тем же самым: сколько это будет стоить пользователю.
VD>Вопрос этот риторический, так как ты сделал слишком общее утверждение. Оно очевидно не верно.
VD>В прочем если тебя интересует пенисометрия, то очень смешно сравнивать С++ с современными ФЯ. Для примера Хаскель, Немерле или Лисп (который, кстати, существенно старше С++).
Так с современными, или с теми, которые старше и на которых обкатывались идеи, впитанные C++?
VD>Теперь по абстракциям и архитектурным решениям. Если под абстракциями понимаются абстракции программирования, то С++ поддерживает ООП, параметрический полиморфизм и (с горем пополам) метапрограммирование. Все это есть в море языков. Причем во многих реализация отдельных фич, а иногда и всех значительно лучше чем в С++. Кроме того С++ не поддерживает парадигму функционального программирования, что приводит к тому, что писать на нем в функциональном стиле становится крайне неудобно.
В новой версии стандарта — поддерживает.
VD>Если под абстракциями понимаются абстракции прикладной сферы, то это тоже чушь, так как любой язык полный по тьюригу потенциально может реализовать любую абстракцию. Даже скриптовые языки тут ни чем не уступают С++.
Правильно. Только потребуются машины, прогоняющие бесконечный цикл за 5 секунд.
O>> Если языки аля джава или дотнет, или нечто другое из структурных языков, то любой шаблон не привязанный к реальным сущностям является для них недостижимым.
VD>Еще одно утверждение не достойное серьезного человека. Рабивается простым примером. По верх дотнета реализован С++ в котром возоности шаблонов реализованы полностью.
По всей видимости, ollv имеет в виду C#, говоря о .Net. В том же, что кодогенерация C++ перенастроена на IL ничего необычного нет. Тьюринг-полнота, ага. Из C++ можно и Lisp генерировать. И наоборот. Вопрос в практичности такого решения.
VD>Теперь я тебе открою правду о шаблонах.
[skip обнажённая правда, от блеска которой слепит глаза и хочется сморкаться]
Всё это, конечно, правильно, хоть и с некоторыми поправками. Но поправки сейчас не суть важны. Важно другое: что та самая "область" в которой царят все за компанию (кроме C++) магическим образом не пересекается с теми областями, в которых от C++ никак не могут (и не хотят) избавиться по сугубо практическим соображениям. То есть, она как бы есть, но её значимость как бы слегка эфемерна по отношению к тому набору требований, с которым приходится иметь дело C++-никам.
А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо.
O>>дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам). VD>Это кто-то другой не дорос до понимания сути вещей.
Суть вещей — многогранное явление. Для каждого она своя.
O>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков,
VD> Они придают плюсам оттенок помойки. Попиши сначала на полноценном ФЯ, а потом делай такие заявления.
Помойка или нет — это сугубо эмоциональная оценка. Не нравится — не пользуйся, никто не заставляет. Зато нет никакой необходимости любой ценой приводить структуру потока управления в соответствие с некоторой "правильной парадигмой".
VD>[...] С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта.
O>> Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. VD>И и правда мечта. Называется она строгая статическая типизация. Мечта не достижимая в С++. VD>К метапрограммированию, правда, отношения имеет мало.
А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). Пуризм — это ещё одно ругательство, как и BASIC, если ты не в курсе. Есть только два критерия: "удобно написать удобную фишку X" и "иметь возможности для отступления в случае потерь производительности". Теоретические же базисы хороши для формирования общей культуры программиста и исследования теоретических же проблем. Хотя это отнюдь не отрицает, например, того, что Lisp хорош в сфере обработки символических данных. Кстати, обрати внимание — Lisp тоже поддерживает императивный стиль одновременно с функциональным.
O>> Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так) VD>Практика показывает, что есть море невежд которые берутся рассуждать о вещах в которых просто не петрят. Потому и есть множество проектов написанных на С++ хотя для этого нет ни малейшего основания.
Логическая связь этих высказываний остаётся для меня загадкой. Неужели, Влад, ты покушаешься на святое: на миллионы успешных продуктов и вполне успешных программистов? Глазам своим не верю. Грэхема на ночь глядя обчитался, что ли?
VD>Проекты эти зачастую получаются затянутыми, реализуют меньший функционал чем можно было бы добиться и частенько приводят к появлению весьма глючных продуктов.
Я вам не скажу за всю Одессу, но по моей практике язык всегда был самой последней причиной появления этих самых "весьма глючных продуктов". Куда как более существенными выглядят другие возможные причины: неудачный менеджмент, неполная постановка задачи, плохо проработанные требования пользователей, бестолковый маркетинг. А язык...
VD>Еще раз повторяю, что единственным реальным приемущестом С++ является скорость исполняемого кода которой можно добиться за счет усложнения собственной жизни. А все слова про какие-то там великие абстракции — это просто чуешь и бред. Точнее даже лженаучная ересь вроде торсионных полей или религиозной бредятины. Короче, вера она и есть вера.
Ну, что тут скажешь? Я занесу в шпаргалку Абсолютных Противо-C++-ных Аргументов ещё слова: "ересь", "бред" и "вера".
O>>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее
VD>Стандарт не изменялся с 1998 года. Читай по буквам — Д Е С Я Т Ь лет. Разговоры о том, что вот-вот появится новых стандарт не утихают с 2000-го года. Но, насколько мне известно до сих пор он так и не принят.
И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо.
VD>Так что ты просто выдаешь желаемое за действительное. На твоем месте я бы почитал об альтернативных решениях и перестал так бодро гнать пургу.
Нет-нет, Девид Блейн, это ты очень основательно ошибаешься в оценке: что, где и когда должно находиться. Больше того, ты же сам и выдаёшь желаемое за действительное, как это делает тьма критиков C++: сначала они апеллируют к мнимому обилию мемори-ликов, потом к мозголомности, потом — к отсутствию "теоретической чистоты" и т.п. Хорошо, до мирового заговора не все доходят. Нормально, ничего, в сущности, нового. История повторяется с периодичностью, достойной метронома.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
V>>Садись, два. V>>Роутеры и маршрутизаторы с этой же точки зрения тоже разные вещи, использующиеся в разных местах сети.
G>http://www.martinfowler.com/articles/mocksArentStubs.html — курить до просветления.
А головой возле иконы биться не надо?
Привести Фаулера, у которого по жизни большие сложности с формальными определениями и всегда "воды, еще воды" — это разве что с целью замылить любое обсуждение, большое спасибо.
Вот смотри, самое формальное, что у него там есть:
- Stubs provide canned answers to calls made during the test, usually not responding at all to anything outside what's programmed in for the test. Stubs may also record information about calls, such as an email gateway stub that remembers the messages it 'sent', or maybe only how many messages it 'sent'.
— Mocks are what we are talking about here: objects pre-programmed with expectations which form a specification of the calls they are expected to receive.
Может ли мок не являться заглушкой даже в этой предложенной терминологии? После ответа на этот вопрос вышеприведённым уже можно подтереться...
Кстати, а как тебе выделенное курсивом? Товарищ явно сочуствует XP и TDD и не в состоянии скрыть этого факта даже в формулировках.
А вообще, странные пошли времена... Вместо кратких формулировок теперь надо давать ссылки на воду? Ты так хочешь чувствовать себя одним из миллионнов лемингов?
Свернув всю статью и убрав очередные его сопли о TDD, Фаулер просто предлагает называть моками класс тестовых объектов в которые встроены ассерты/логирования, работающие во время вызовов методов, а не постфактум. Использовали раньше эти приемы, до выхода мок-фреймворков? — разумеется, ни один более- менее сложный тест без этого не обходился и не обходится. И как нашей русскоязычной терминологии такие тестовые объекты назывались, так и называются заглушками. Так что, когда появится термин с формальным определением, приходи еще раз.
А пока можно лишь сублиммировать преценденты использования термина, что вовсе не сложно. Т.к. термин относительно новый, можно сказать, что только формируется, нужно "читать" его формирователей, а это доки к ср-вам автомокостроения, форумы и статьи по этим ср-вам. Очевидное в том, что эти ср-ва одинаково позволяют строить как moks так и stubs в терминологии Фаулера, причем явно и декларативно отличить одно от другого можно лишь по совокупности и характеру декларируемых ассертов (опять же в терминологии Фаулера ). Так же, наблюдая обсуждения по этой теме в Сети и просматривая множество статей на эту тему, убедился, что всевозможные авторы пользуются термином "мок" вовсе без того характерного отличия на котором настаивает автор по ссылке. Наиболее частое употребление термина мок на сегодня относится к тестовому объекту, построенному автоматически, имеющему бинарную совместимость с мимикрируемым объектом и снабженному возможностью декларативно/полудекларативно задавать поведение и проверки. ВсЁ, остальное — от лукавого, и разговоры в пользу бедных, по крайней в данный момент жизни этого термина.
Я лично могу поставить на то, что ключевым в формулировке останется "автоматически, имеющему совместимость с мимикрируемым ...", а то термин насколько пошел в массы, что рукописные заглушки стали называть рукописными моками, что малость бред. Бред хотя бы потому, что когда заглушки пишут руками (как было раньше), вот этих "характерных" отличий, на которых настаивает Фаулер просто быть не могло, ибо руками — оно и в Африке руками, т.е. можно написать всё, что необходимо — любые сценарии тестирования. А эти "характерности" сегодня идут от возможностей ср-в автоматизации тестирования, которые, в отличие от рукописного подхода, вовсе не безграничны. С другой стороны, перевод на русский "макет/подражание" — весьма неплох, так что возможна замена одного термина другим, но навряд ли одновременное использование в разных смыслах (ибо термин заглушки и так широк — шире не куда).
G>Как провсетление наступит можно выложить сюда реализацию моков на С++
Для С++ нет проблем декларативно описать поведение и ассерты мока, есть проблемы с автоматическим построением бинарных заместителей. Могу еще раз упомянуть, что для COM возможно автоматическое построение "заместителей", если сигнатуры методов являются OLE-совместимыми. В остальных случаях, до принятия единого ABI, автоматическое построение заместителей возможно лишь в компайлтайм, либо глубоко завязанное на конкретный компилятор и формат его PDB. Так что, как я уже сказал — возможно, но пока что слишком трудозатратно. И говорил уже, что для С++ есть свои наработки для тестирования, т.к. есть возможности, которых нет у управляемых платформ, и обратно тоже верно. Поэтому никто идиотизмом не занимаются, а используют наиболее подходящие ср-ва для своей платформы.
Как я делаю иногда на С++, когда мне надо "вклиниться" в реальный объект в тестовых/проверочных целях? Пользуюсь тем, что декларация и реализация обычно лежат по разным файлам, реализация разных методов классов тоже может находится по разным cpp-файлам, и собирается это вместе только при линковке. Таким образом, в тестовый бинарник вполне можно частично или полностью прилинковывать тестовую имплементацию классов, вместо основной. Но и это не самая популярная мера, скорее вынужденная, когда тестовый код значителен и сложен. Самый популярный вид тестирования в С++ — это использование в качестве моков не заместителей, а самих реальных объектов, именно! Такая технология доступна из-за препроцессинга и условной компиляции. В нужных местах после каждого чиха может стоять куча проверок, которые работают, например, только в дебаг-конфигурации, но отсутствуют в релизе. Это могут быть проверки или логгирование или и то и другое и т.д. На какой стороне это работает? Что там получается, стабы или моки в терминологии Фаулера? Да на любой стороне это работает, на той стороне, где ТРЕБУЕТСЯ проверка. Как насчет изолированности при тестах? То бишь как насчет выключения лишнего "тяжелого" кода, не являющегося целевым для тестирования? Опять же, с помощью условной компиляции делается изоляция любого уровня.
Удобнее такой подход, в сравнении с подходом управляемых платформ или скриптовых языков? Фиг там можно сказать однозначно, можно найти кучу как плюсов, так и минусов и там и там, поэтому сами по себе подобные споры — чистейшей воды холивар. Мне, например, импонирует, что простые тесты можно писать прямо одновременно с кодом в С++, не размазывая функциональность. К тому же, подобные тесты прямо в строках кода являются своего рода документацией, задающей граничные или какие другие условия/ограничения. В общем, тема серьезная, и не на том уровне это надо обсуждать, какой навязывает criosray.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали: G>>>>Если не верите, то попробуйте написать алгоритм решения задачи: "вывести на экран все строки текстового файла, в которых более трех слов, отсортированные по алфавиту". G>>Можете запостить сюда код решения на C++
Х>
Здравствуйте, ollv, Вы писали:
O>>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++? O> на каком конкретно?
В высказывании утверждалось, что С++ имеет преимущество. Не говорилось, что преимущество именно перед конкретным языком. Значит выбор из всего списка языков. Так что тебе прийдется или признаться, что ты спорол чушь или привести пример абстракции которая не реализуется на одном из существующих на сегодня языке.
Вопрос этот риторический, так как ты сделал слишком общее утверждение. Оно очевидно не верно.
В прочем если тебя интересует пенисометрия, то очень смешно сравнивать С++ с современными ФЯ. Для примера Хаскель, Немерле или Лисп (который, кстати, существенно старше С++).
Теперь по абстракциям и архитектурным решениям. Если под абстракциями понимаются абстракции программирования, то С++ поддерживает ООП, параметрический полиморфизм и (с горем пополам) метапрограммирование. Все это есть в море языков. Причем во многих реализация отдельных фич, а иногда и всех значительно лучше чем в С++. Кроме того С++ не поддерживает парадигму функционального программирования, что приводит к тому, что писать на нем в функциональном стиле становится крайне неудобно.
Если под абстракциями понимаются абстракции прикладной сферы, то это тоже чушь, так как любой язык полный по тьюригу потенциально может реализовать любую абстракцию. Даже скриптовые языки тут ни чем не уступают С++.
O> Если языки аля джава или дотнет, или нечто другое из структурных языков, то любой шаблон не привязанный к реальным сущностям является для них недостижимым.
Еще одно утверждение не достойное серьезного человека. Рабивается простым примером. По верх дотнета реализован С++ в котром возоности шаблонов реализованы полностью.
Теперь я тебе открою правду о шаблонах.
1. Шаблон — это не более чем синтаксический препроцессор который позволяет во время компиляции подставить что-то вместо плэйсхолдеров. Так вот есть куда более мощьные системы типов (например, система типов Haskell) на фоне которых препроцессор вроде С++ просто меркнет.
2. Есть куда более мощные синтаксические препроцессоры (например, Nemerle и Лисп) которые по возможностям и удобству рвут С++ как тузик грелку. К примеру, я воспроизвел linq из спецификации C# написав два макроса. С++ такое сделать не может в приципе.
3. Кроме того шаблоны в С++ были задуманы как средство релизации параметрического полиморфизма. Оных намного лучше реализован почти во всех языках в которых он вообще реализован. И те же дженерики тоже лучше шаблонов за исключением пары неудобств. А уж параметрический полиморфизм в современных ФЯ сделан несравнимо лучше шаблонов С++. Опять же курим Хаскель, ОКамл и т.п. Просто использование шаблонов выходит за рамки параметрического полиморфизма и входят в область метапрограммирования. Но в этой области безоговорочно царят макросы. И убогим возможностям С++ тут делать не чего.
O>дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам).
Это кто-то другой не дорос до понимания сути вещей.
O> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков,
Они придают плюсам оттенок помойки. Попиши сначала на полноценном ФЯ, а потом делай такие заявления.
Кстати вместо самопальный (и доволно бессмысленных) терминов вроде "не родственных стурктур" лучше использовать общепринятый термин "параметрический полиморфизм" и "утиная типизация". Тогда станет ясно, что С++ не единственный язык где функции можно применять для разных типов данных. По этому поводу курим таких наследников ML как OCaml.
O>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы.
Вот нести такую чушь как несешь ты должно быть просто стыдно. А говорить, что все это можно реализовать "все можно реализовать в джава или дотнете" не просто можно, а можно смело. Опять же МП на шаблонах С++ доступно в C++/CLI работающем на VM .NET. Но это пример чисто иллюстративный, чтобы и тебе было понятно, что ты заблуждаешься. Если же серьезно говорить о метапрограммировании, то С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
O> Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы.
И и правда мечта. Называется она строгая статическая типизация. Мечта не достижимая в С++.
К метапрограммированию, правда, отношения имеет мало.
O> Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так)
Практика показывает, что есть море невежд которые берутся рассуждать о вещах в которых просто не петрят. Потому и есть множество проектов написанных на С++ хотя для этого нет ни малейшего основания. Проекты эти зачастую получаются затянутыми, реализуют меньший функционал чем можно было бы добиться и частенько приводят к появлению весьма глючных продуктов.
Еще раз повторяю, что единственным реальным приемущестом С++ является скорость исполняемого кода которой можно добиться за счет усложнения собственной жизни. А все слова про какие-то там великие абстракции — это просто чуешь и бред. Точнее даже лженаучная ересь вроде торсионных полей или религиозной бредятины. Короче, вера она и есть вера.
O>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее
Стандарт не изменялся с 1998 года. Читай по буквам — Д Е С Я Т Ь лет. Разговоры о том, что вот-вот появится новых стандарт не утихают с 2000-го года. Но, насколько мне известно до сих пор он так и не принят.
Так что ты просто выдаешь желаемое за действительное. На твоем месте я бы почитал об альтернативных решениях и перестал так бодро гнать пургу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Если кто-то пишет High-load на С++, то это не означает что так надо делать. Кроме того некоторые системы могут бть написаны на С++ по историческим причинам. G>Вообще аппеляции к тому что "кто-то так делает" не показывают равильность такого применения.
Хм, а на что тогда опираться? на победные реляции сан и микрософт? Критерий истины — практика
ГВ>>Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв". G>И что? 2-3 виртуальных вызова вообще незаметны будут ни при каком раскладе. G>Давай конкретно, о каком penality идет речь?
Так скажем, не будут заметны в большинстве случаев. Однако, опираясь на практику как критерий истины :), я могу однозначно сказать, что не только виртуальные, но и обычные вызовы влияют на производительность. Проверяется это очень просто — я интенсивно использую инлайны в проектах на C++, так вот время отклика для релизной версии в несколько раз (если не на порядок) лучше чем в отладочной — скажем 40-50 мс и 300-400 мс. Что это значит для пользователя я думаю объяснять не надо. Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает. На C++ так извращаться не надо — в итоге программы получаются эффективными, но асбсолютно не теряют в читаемости. В принципе, это была изначальная цель при создании C++ и она с успехом достигнута.
У C++ конечно есть недостатки и наверное можно придумать язык лучше, но по моему проблема в том, что вместо лучшего навязывается другое. Скажем, лисп — это отличный язык, но он не лучше и не хуже C++, он просто другой. То же самое с C# и явой.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, COFF, Вы писали:
COF>>Вообще, я против C# и .нет вообще ничего не имею, но массовое отсутствие коммерческих коробочных продуктов на управляемых языках настораживает. Это можно трактовать по разному, но факт налицо. Со статистикой не поспоришь :) При этом .нет на рынке уже почти 10 лет, ява — уже более 15. Средств в них вбухано немерянно. При этом, конечно, свои ниши (и немаленькие) у них несомненно есть. Но так получается, что все интересные темы пишутся на C++. G>Коробочный десктопный софт — самая слаборазвивающаяся область разработки. Удерживает сильно существующий codebase. G>Я вообще не могу вспомнить что новое появилось для широкого круга пользователей. за последний год.
Codebase — это конечно да. Но 10 лет — это достаточный срок, чтобы переписать весь существующий codebase если это переписываение действительно даст преимущества. Я думаю, дело в другом, с одной стороны, управляемые языки не дают того рекламированного преимущества для действительно больших и сложных проектов. С другой стороны, они дают сильную зависимость от поставщика рантайма плюс немалую вероятность в один прекрасный момент упереться в какое-нибудь ограничение этого самого рантайма с неясной перспективой что делать дальше.
Здравствуйте, gandjustas, Вы писали:
G>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем?
Сам пересчитывал?
G>Почему самые высоконагруженные сайты написаны не на С++?
Все переобмерил?
P.S.: Но это всё не аргументы. По устоявшейся RSDN-овской традиции Настоящие Весомые Аргументы Против C++ должны содержать слова из такого ряда: фобия, замшелость, стереотип, мемори лик, проход по памяти, миллионы программистов, википедия, тузик, тряпка, рвать, мозг, затычка, косность. Можно даже шпаргалку составить.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Вдогонку,
У меня был знакомый, который на C++ осознанно писал вот так — for( int i = 0; i < array.GetCount(); i++ ), типа компилятор должен сам такие ситуации разруливать. Ну и в других местах он поступал аналогично. Потом он уволился и мне пришлось в его коде разбираться и оптимизировать. Так вот без всяких алгоритмических штучек, просто вычищением лишних уровней косвенности и выпрямления интерфейсов, мне удалось ускорить его код в несколько раз.
Так что пессимизация кода в малом скорее всего значит и пессимизацию в большом. Это мое твердое убеждение.
Здравствуйте, vdimas, Вы писали:
V>[чушь всякая вырезана цензурой]
V>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
Пример классического ламеризма. Может стоило бы для начала что-то узнать о предмете обсуждения? Например, что версия CLR все еще 2.0.х, а не 3.0
Отвечу за себя
N>В каких областях сейчас применяется C++?
Математические задачи
N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++
Я пишу и на C# и на C++. Проекты на C# и на C++ — "две большие разницы". То, что делается на C++, на C# в принципе нельзя реализовать. Однако, некоторые задачи намного легче и красивее реализовать на C#.
N>Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
Знания/опыт требуются в обоих случаях, специфика у них разная.
N>У меня есть опыт работы на php, причем не только web, а еще что-то вроде создания системы документооборота) N>Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
По C++ : Не слушайте тех, кто пытается его похоронить, глупости это все субъективные. Съездите на конференцию "Параллельные вычисления"(можете заглянуть на parallel.ru), там мужики и не знают наверное, что есть языки другие, кроме C++.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>>>Он ищет язык для дельнейшего развития, так что ваши предпочтения мало отношения к делу имеют. NBN>>>Он просто сам не знает чего ищет. Язык программирования — определяется задачей и ничего не мешает знать хоть десяток языков G>>C#(.NET) и Java в наше время подходят для подавляющего большенства задач. NBN>Для игр и мобильного мира они не подходят. Совсем.
Ну можете продолжать в это верить а другие спокойно клепают игры на XNA и приложения для Windows Mobile.
NBN>Для миддлеваре — тоже.
По запросу "middleware" гугль начал рассказывать про веб-сервисы и серверы приложений. Может я что-то пропустил, но когда их начали делать на C++? Обычно java или .NET.
NBN>>>Есть достаточно много задач, где приоритет С++ — несомненен и зп платятся очень неплохие. Но при этом знание голого С++ тебе ничем не поможет — надо знать и уметь решать задачу — собственно платят то за неё G>>Тогда причем тут C++ ? Большенство задач решаемых на C++ можно решать и на других языках более качественно. NBN>Нельзя. Просто нельзя сделать на яве/шарпе более качественно чем на С++ при прочих равных.
Ну тогда определение "качества" в студию.
Обычно под качеством кода понимают обратную величину плотности ошибок на единицу функционала, C++ по этому параметру очень далек.
Еслим рассматривать удовлетворение пользователя деленное на затраченное бабло, то managed языки тоже впереди.
G>>Платят то за решение задачи, а не "решение задачи на С++". NBN>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
Это также решаемо на mono, причем с меньшими затратами.
Здравствуйте, gandjustas, Вы писали:
NBN>>Для игр и мобильного мира они не подходят. Совсем. G>Ну можете продолжать в это верить а другие спокойно клепают игры на XNA и приложения для Windows Mobile.
На ХНА клепают казуалки. Она для этого приспособлено — быстро склепать казуалку только для хбокса. Я тут даже спорить не буду.
На CF тоже что-то клепают, тоже спорить не буду.
Но факт в том, что их доля — маленькая и использовать их можно далеко не всегда.
Обрати внимание, что и Spb и Paragon (мировые лидеры в своих нишах) делают практически все продукты нативными.
NBN>>Для миддлеваре — тоже. G>По запросу "middleware" гугль начал рассказывать про веб-сервисы и серверы приложений. Может я что-то пропустил, но когда их начали делать на C++? Обычно java или .NET. http://en.wikipedia.org/wiki/Middleware
К миддлеваре относятся всякие движки и самостоятельные программные компоненты. Естественно для веба это как правило вебоспецифично.
G>>>Тогда причем тут C++ ? Большенство задач решаемых на C++ можно решать и на других языках более качественно. NBN>>Нельзя. Просто нельзя сделать на яве/шарпе более качественно чем на С++ при прочих равных. G>Ну тогда определение "качества" в студию.
Определение ниже. G>Обычно под качеством кода понимают обратную величину плотности ошибок на единицу функционала, C++ по этому параметру очень далек.
Бред, это зависит от программиста.
Например при моём стиле (я соблюдаю уйму правил кодингстандарта) программирования мемориликов нет вообще (если они не платформоспецифичны), а логические ошибки — не завият от языка.
G>Еслим рассматривать удовлетворение пользователя деленное на затраченное бабло, то managed языки тоже впереди.
В реальном проекте — нет. Т.е. конечно можно придумать проекты где они зарулят — тут спорить глупо. Но когда разговор заходит о хорошей скорости и кроссплатформенности — С++ практически безальтернативен.
Например, я учавствовал в одном проекте, онлайновый сервис с клиентом средней сложности. Изначально он был сделан на яве. Потом наняли меня, чтобы я перевёл его на С++ и портировал на покеты, симбиан. И, что главное, обеспечил красивый интерфейс. На яве это было сделать невозможно — вылезали за разумные рамки производительности.
G>>>Платят то за решение задачи, а не "решение задачи на С++". NBN>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится. G>Это также решаемо на mono, причем с меньшими затратами.
Это шутка
Здравствуйте, hattab, Вы писали:
H>При аналогичной функциональности, выбор идет в рамках озвученных тезисов. Кстати, в ветке про Avalon, Mamut писал, что отзывчивость Avalon'а лучше чем у "прообраза" (к тому же выглядит для платформ нативным, ну или почти ;) ).
Это ни о чем не говорит — ничто не запрещает написать на C++ сколь угодно тормозную программу :)
Вообще, я против C# и .нет вообще ничего не имею, но массовое отсутствие коммерческих коробочных продуктов на управляемых языках настораживает. Это можно трактовать по разному, но факт налицо. Со статистикой не поспоришь :) При этом .нет на рынке уже почти 10 лет, ява — уже более 15. Средств в них вбухано немерянно. При этом, конечно, свои ниши (и немаленькие) у них несомненно есть. Но так получается, что все интересные темы пишутся на C++.
Соответственно, автору топика, выбор зависит от того, чем хотелось бы заниматься. Если "хардкорным" программированием (коробочные продукты, игры, наукоемкие вещи) — то C++. Если бизнес программированием (веб, базы данных и т.п.) — то C#.
Здравствуйте, gandjustas, Вы писали:
NBN>>Я тут на днях написал программку которая сейчас находится топе5 продаж. G>Продажи к свойствамя языка никакого отношения не имеют.
Имеют достаточно прямые. На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям
NBN>>Я не понял — ты хочешь длинной померяться? Так сразу и говори G>Не хочу меряться, хочу показать что на С++ далеко не все можно сделать с трудозатратами сравнимыми с управляемым языком.
Ага, можно сделать очень клёвую, но никому не нужную феньку (не удовлетворяет клиента) — это да
Здравствуйте, NikeByNike, Вы писали:
G>>>>Кстати Linq у вас уже появился? NBN>>>Он довольно тормозявый. G>>Я уже говорил что performance-critical код можно писать на C или юзать unsafe (почти тот же С). NBN>Вот это — настоящее извращение, ка я уже говорил — показатель невладения С++, а следовательно бессмыслености спора.
NBN>>>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество) G>>"Думаю" — слабый аргумент. NBN>Достаточный. Это называется экспертная оценка
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Игoрь, Вы писали:
G>>>Маленький ликбез: G>>>1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков. И>>Ты сам в это веришь? Это наивная реализация 80-ых годов. Сейчас используются всякого рода оптимизации, позволяющие минимизировать время поиска и частично отказаться от блокировок кучи. Например, в windows heap создается, если мне память не изменяет, на одну кучу 128 ассоциативных однонаправленных списков, не требующих блокировок. G>Эта наивная реализация во многих местах осталась и по сей день.
Это не аргумент, вообще.
G>>>При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию. И>>В С# в целом та же херня. G>Доказательства? Может сначала статью про .NETовский JIT прочитаете. На этом сайте статьи есть.
Еще раз. То, что ты написал в предыдущем посте о преимуществах хипах — ерунда полнейшая. Почему? Да потому что в С++ используется связка стэк + хип. И мелкие часто создаваемые/удаляемые объекты создаются на стэке, а не в хипе. Поэтому все те "преимущества" .net идут лесом. Когда я говорил, что "в C# таже херня", я имел ввиду ситуацию в целом, а не какие-то частные случаи. А именно — работу сборщика мусора и дефрагментатора, который осуществляет перенос объектов в памяти. А это совсем не дешевые операции. Кроме того, если я правильно помню, то при выделении памяти под объект, происходит еще и предварительное обнуление памяти. Далее, все, что ты тут расписал — это касается только мелких объектов. А крупные объекты размещаются в LOH, которая работая скорее по принципу сишной кучи.
G>>>2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным. И>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>Покажите две программы на .net и C++ с эквивалнтной функциональностью сложнее HelloWorld, потом посмотрим кто гонит. G>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены.
Расскажи как сервисы свернуть... Я поищу что-то из публичных прог.
И>>Кроме того, в С++ принято мелкие объекты создавать на стеке. А если нужно в динамической памяти разместить объект, то есть placement new, который позволяет разместить объект в уже выделенной памяти. G>Ага, это все увеличивает энтропию языка, то есть количество свпособов сделать одно и тоже по-разному.
Глупость.
G>>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики. G>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET.
Лучше сам дуй читать про размещение объектов в LOH и ее фрагментацию. G>Про мемори лики хочу узнать поподробнее, как их получить, потом сравните это с простотой получчения лика в unamanged коде.
В unamanaged коде лик легко обнаружить и избавиться от него, в managed его получить гораздо сложнее, но и найти и избавиться сложнее. мемлики в С++ — страшилки для детей. Я вот сейчас глянул в С++ проект — на 10МБ кода 16 явных вызовов new.
G>>>4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация. И>>GC тоже не потокобезопасный, и зачастую требует не просто синхронизации, но и приостановки работы потоков. G>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором.
gc и работы гораздо больше выполняет.
G>>>5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции И>>В С++ такое делают крайне-крайне редко. Потому что И>>а) есть стэк; G>Стек заставляет копировать объекты чаще, чем нужно.
просто глупость.
И>>b) есть placement new; G>Теже яйца что и кастомный аллокатор, только сбоку
Нет, кастомный аллокатор — штука серьезная, который пишется месяцами. А это бесплатная штукенция, которая позваоляет оптимизировать критичный код и уделать .net.
И>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
На С стоит писать код режима ядра, а вот околосистемные сервисы для С++ — самое оно. Например, у меня есть железка на которой крутится линукс под высокой нагрузкой. Нужно написать какой-то демон для него — однозначно С++.
G>>>Теперь о GC G>>>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю И>>Ага, аж десять раз. Это как бог на душу положит. Может и GC запуститься с полной остановкой всех потоков. Веселуха... G>Читайте как работает GC, он не может просто так взять и запуститься.
А я и не говорю, что он совсем от фонаря запускается. Но речь же шла о вызове new, так вот далеко не всегда этот вызов будет сведен к одному инкременту.
G>>>7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть) И>>уже писал про мелкие объекты и про то, что общий оверхед памяти для .net программ хорошо больше цэпэпэ. G>А вы вообще ветку читали перед тем как это постить?
читали
G>>>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна. И>>в c# выделение памяти не более потокобезопасно, чем в с++ G>Полный бред.
взаимно.
G>>>9)такое распределение памяти увелиичивает cache-locality И>>стандартные аллокаторы windows тоже оптимизированы на это дело G>Рад за аллокатор Windows, только зачем он нужен если можно выделять память смещением указателя. Быстрее просто нечего придумать.
Запарил, учи мат часть. Далеко не всегда выделение памяти сводится к простому смещению. И кроме того, в С++ при выделении на стэке для малых объектов это буквально одна инструкция.
G>>>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении И>>по сути это и означает, что когда захочется, особенно если речь идет о более-менее больших системах G>И че? сборка памяти в нулевом поколении работает быстре чем использование алоокатора на списках при выделении-освобождении того же объема памяти.
Того же размера, это какого? Возьмем размер 100 килобайт, быстрее? С учетом того, что такой размер будет выделен не в SOH, а в LOH. А если речь опять про что-то мелкое, так оно и стэке может быть выделено.
G>>>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить. G>>>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь И>>это в общем-то самообман G>Самообман — думать что C++ всегда быстрее.
Не всегда, на каких-то синтетических тестах может быть быстрее. А-ля выделение/удаление мелких объектов.
И>>PS И>>существенное преимущество GC — не надо следить за уничтожением объектов, что облегчает программирование, позволяет использовать всякие инетересные техники программирования, вроде замыканий. Но за эти удобства мы платим скоростью исполнения и большим расходом памяти. Вот собственно и все. G>Тесты будут? Или вы тоже омновываете свое мнение на просмотре пары говнопрограмм?
Ну я от тебя тестов тоже что-то не видел. А мое мнение базируется на трехлетнем опыте работы с .net. Не сильно много, но достаточно, чтобы делать определенные выводы. А ты, похоже, просто фанатик.
... G>В нормальных языках такого не нужно делать в принципе.
Что значит "не нужно"?
В С++ тоже не нужно, пока в каком-то месте не понадобится чтобы было реально быстро...
И вот тогда в том самом месте в С++ так сделать можно.
А в "нормальных" языках можно рассказать, что GC -- это уже верх совершенства, а память стоит дёшево...
А что можно сделать в тех самых "нормальных"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение.
E>Это никому не требуется, кроме древних-предревних кучь...
Ну давайте чтобы не быть голословным приведу код:
На c++
static void Main(string[] args)
{
var sw = new System.Diagnostics.Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++)
{
var arr = new int[64];
arr[0] = arr[1]; //иначе оптимизатор грохает цикл
}
GC.Collect();//чтобы быть уверенным что вся память освободилась
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadKey();
}
Собиралось 2008 студией, релиз, запуск из проводника.
C++ — 562 мсек, C# — 92 мсек.
Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Хвост, Вы писали:
Х>>ну как же, C++ == запредельный перфоманс + надёжный и красивый код G>И то и другое неправда.
правда, вот я прямо сейчас смотрю в реализацию гугловского V8, и вижу как ни странно запредельный перфоманс + надёжный и красивый код, а может тебе указать на библиотечку Blitz++ которая уделала фортран на вычислительных задачах (да, фортран, да, на вычислительных задачах) что не удавалось твоему перфоманс-фавориту Си? другое дело что мало кто так писать умеет, большинству проще на шарпах Linq'ом побаловаться или в WPF'е поформошлёпить )
Х>>надеюсь ты понимаешь разницу между структурой и классом в дотнете, повторяюсь — инстанцировать классы G>Я то как раз отлично понимаю, а вы — видимо нет.
можно прямо сказать, дотнет етого не позволяет, я ето знаю, ты ето знаешь, зачем юлить?
Х>>и на посошок, или я проглядел, или ты не ответил на вопрос — сколько у тебя установлено приложений уровня "десктоп", писаных на дотнете? G>Сколько установлено — не считал, пользуюсь двумя — paint.NET и Windows Live Writer. Это треть софта, который я ставил и пользуюсь им.
у тебя ~6 десктопных программ? клёво
музыку ты наверное не слушаешь, видео не смотришь, документы/таблицы не набираеш, программы не пишешь, гуглы ёрс не смотришь, интернеты не браузишь, скайпы не говоришь, игры не играешь, ну итд по списку 99% софта. ты просто возьми на минутку и задумайся, почему оно так в мире, не правит дотнет.
Здравствуйте, gandjustas, Вы писали:
Х>>Здравствуйте, gandjustas, Вы писали:
G>>>В структуре нет методов? Это точно на C#? Х>>ммм...статические есть, но ето немного не то, правда? G>http://msdn.microsoft.com/en-us/library/ah19swz4.aspx
угу, размести на стеке
G>ЗЫ. Вообзе говоря не верится что вы писали enterprise систему на C# и ни разу не пользовались структурой DateTime.
мне вообще иногда хочется забыть что я писал на C#, кажется карма испорчена навсегда (хотя есть надежда что функциональщина очистит мою душу)
Да, вопрос на засыпку, дотнет коммьюнити не смущает что вещи а-ля Windows Vista Bridge Sample Library выходят с опозданием в 2-3 года после появления новых апи? вы только начали готовить? а мы уже продаём
Здравствуйте, esil, Вы писали:
E>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, gandjustas, Вы писали:
G>>>Думаете нельзя в C# на стеке данные размещать? MK>>Думаю конкретно esil имеет ввиду, что нельзя разместить в стеке произвольные данные. MK>>Массивы, например, туда не засунуть, ибо class
MK>>А вот что имел ввиду minorlogic я, чесс говоря, тоже не понял. MK>>Но эт не страшно
E>Ну он как раз и имеет в виду, что мы можем произвольные типы размещать на стэке, что очень полезно, т. к. позволяет оставаться в рамках ООП-подхода и избегать множества выделений памяти в куче.
Как будут работать виртуальные методы при размещении объектов на стеке?
Здравствуйте, Erop, Вы писали:
G>>Кстати, как на делфи с задачкой про все строки файла... E>Если вдруг ты сможешь понятно описать чего тебе надобно, старче, то она очевидно решается на ЛЮБОМ АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ, даже на FORTRAN И basic!
Ты не понял, это у шарпников новый фетиш такой: острое желание показать как можно выпендриться на шарпе. Синтаксический оверхедЪ у них там меньше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
E>>Считаешь, что выделенное -- это "тяжёлый клиент". C>Да, выделенное это тяжелый интерфейс.
Ну это ты продолжаешь "делать не так"... , то есть упорствовать в заблуждениях...
С какой поры построить график или показать диалог стало "тяжёлым интерфейсом"? А какой интерфейс, тогда, лёгкий?
Тебя не смущает, что показать график, таблицу, форму/диалог и т. п. комп, вроде ZX Spectrum мог МГНОВЕННО? То есть человек не мог заметить время в течении которого этот интерфейс работал? Тебе не кажется, что мощь компов с тех пор настолько возросла, что говорить о том, что "диалоговое окно, показ таблички, списка и графика" -- это "тяжёлый интерфейс" -- СМЕШНО.
Тяжёлый интерфейс -- это 3D отрисовка в кваке!
E>>Кстати, а данные вы из DB берёте, я надеюсь? C>Из БД, вестимо.
Ну вот видишь, сделать запрос в БД, перелопатить и подготовить данные -- фигня вопрос, в в диалоге их показать -- тяжёлый интерфейс?..
Воистину!!! ХиндиС -- мощнее любого компа!!! В смысле как бы не был мощен ваш комп, ХиндиС тормозит ещё мощнее!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Если производительность окажется недостаточной то надо смотреть причны и бороться с ними. G>Причем чаще всего прчиной оказывается применение неподходчщего алогоритма. Очень редко приходится нарываться на ситуацию когда низкая производительность вызвана особенностями платформы.
IMHO, такая ситуация, когда для ускорения надо менять алгоритм, часто говорит о том, что проектировали плохо.
Часто можно сразу выбирать оптимальный алгоритм. Не понятно зачем пессимизировать-то? В большинстве задач оптимальные алгоритмы давно уже известны...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Sinclair, Вы писали:
S>О да. Анализатор логов — это конечно гораздо промышленнее сайта с дневной посещаемостью в сотню тысяч хитов.
S>На всякий случай напомню, что на каждую строчку лога, которую читает анализатор, этот самый сайт успевает авторизовать пользователя, сбегать в базу, раскрасить синтаксис, выдать HTML. И всё это "с GC и аллокацией на каждый чих", и стримами, и регекспами. S>Но нет, конечно же авторы анализаторов логов считают себя гораздо более главными. Удачи.
авторизация — доступ в нативную rdbms, сбегать в базу — аналогично, раскрасить синтаксис — если ты говоришь об уровне расскраски как на рсдне то ето даже не смешно , выдать хтмл — нативный IIS.
где тут твой C#? позвать то, взять ответ, позвать другое и дать ему ответ предыдущего? клей, сопли, грусть. Ты сам-то в какой области на C# пишешь? а то я смотрю тут каждый второй на C# пишет только дальше сайтов и ентерпрайза никто своё рыльце не высовывает, потому что атата.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию. G>>Отличная идея. GC как раз позволяет не думать о выделении и освобождении памяти вообще.
E>Это не правда. Если бы GC позволял не думать о выделении и освобождении памяти, то какой смысл бы был сравнивать производительность GC и стандартного аллокатора С++? Или эти сравнения в топике были бессмысленными?
Сравнения в топике были чтобы показать что выделение и освобождения памяти в случае стандартного аллокатора — далеко не бесплатная операция, как многие думали.
E>Как можно не думать о выделении и освобождении объектов, если из-за этого может оказаться очень низкая производительность приложения?
Спокойно, и произовдительность нормальная будет.
G>>Если производительность окажется недостаточной то надо смотреть причны и бороться с ними. G>>Причем чаще всего прчиной оказывается применение неподходчщего алогоритма. Очень редко приходится нарываться на ситуацию когда низкая производительность вызвана особенностями платформы.
E>А причём здесь алгоритмы, если речь идёт о декомпозиции на объекты? Если бы дело было только в алгоритмах, то тогда не применяли бы ООП, а так бы и писали эти алгоритмы на структурных языках. Алгоритм может быть одним и тем же, но по-разному представляться с помощью объектов, работать с разными объектами. По вашим словам один и тот же алгоритм может быть одновременно "подходящим" и "неподходящим" в зависимости от используемой объектной модели задачи. А если Вы подразумеваете под разными алгоритмами использование разных объектных декомпозиций, то тогда Вы просто ограничиваете доступный набор этих декомпозиций, с помощью которых можно решить задачу, просто называя такие декомпозиции неподходящими из-за скорости выделения памяти.
Я не об объектах говорил, а о производительности вообще.
E>А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав?
Неправ. Слабые выразительне способности C++ не позволяют мере проводить объектую декомпозицию так как хочется.
Здравствуйте, Mamut, Вы писали:
p>> Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
M>Фигня, что дотнету уже 8 лет и он пока никуда не собирается исчезать?
За эти 8 лет вышло три различных дотнета: 1, 2 и 3. Между вторым и третим нет ничего общего, поменялось буквально все. Между первым и вторым различий не так много, но они тоже были. Предполагаю, что 4 дотнет будет доделкой третьего с половиной, после чего выйдет 5 дотнет, который будет кардинально отличаться от третьего, то есть будут преданы анафеме wpf, linq, wcf и так далее. 6 дотнет будет доделкой 5 с половиной, после чего выйдет 7 дотнет, которому сам бог велел кардинально отличаться от пятого дотнета. Предпологаю, что 7 дотнет чем — то будет напоминать первый...
o> с возможностью биндить как аргументы, так и владельцев, так и чуваков
А можноо объяснить на пальцах, что здесь происходит? По-моему, тут написана какая-то реально нечитаемая фигня, в которой сам автор не разберется уже через полгода
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Как ты правильно заметил, Тьюринг-полные языки, в общем, эквивалентны по своим возможностям в смысле выражения абстракций. Всё дело в итоговой цене на билет. Я не сомневаюсь, что абстракцию автоматического управления ресурсами вроде std::auto_ptr можно реализовать и на Хаскеле, и на Лиспе и ещё много на чём. Вопрос остаётся тем же самым: сколько это будет стоить пользователю.
Стоимость прямо пропорциональна человеко-часам, затраченым в процессе разработки и в этом плане С++ уже давно в отстающих, при чем иногда очень-очень сильно отстающих...
VD>>Теперь по абстракциям и архитектурным решениям. Если под абстракциями понимаются абстракции программирования, то С++ поддерживает ООП, параметрический полиморфизм и (с горем пополам) метапрограммирование. Все это есть в море языков. Причем во многих реализация отдельных фич, а иногда и всех значительно лучше чем в С++. Кроме того С++ не поддерживает парадигму функционального программирования, что приводит к тому, что писать на нем в функциональном стиле становится крайне неудобно.
ГВ>В новой версии стандарта — поддерживает.
Поддерживает 1% от ФЯ? Замечательно.
ГВ>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо.
Представьте себе, среди всего многообразия задач очень мало таких, для которых важно выжимать максимальную производительность.
Лучшее — враг хорошего.
O>>>дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам). VD>>Это кто-то другой не дорос до понимания сути вещей. ГВ>Суть вещей — многогранное явление. Для каждого она своя.
Особенно, если Вы смотрите на вещи сквозь призму непонимания и иллюзии.
VD>>[...] С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
ГВ>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта.
А вот это иллюзии. В программировании крайне важно сохранять "читабельность кода". Ради этого придумывают много умных терминов вроде SRP, DRY, SoC, Open/close principle, cohesion и т.д. и т.п.
ГВ>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++).
и это заметно. Чистота вообще не шибко кого заботит в мире С++ и появляются на свет уродливые творения, где над каждой строкой кода надо раздумывать так же долго, как при чтении Ницше...
VD>>Еще раз повторяю, что единственным реальным приемущестом С++ является скорость исполняемого кода которой можно добиться за счет усложнения собственной жизни. А все слова про какие-то там великие абстракции — это просто чуешь и бред. Точнее даже лженаучная ересь вроде торсионных полей или религиозной бредятины. Короче, вера она и есть вера.
ГВ>Ну, что тут скажешь? Я занесу в шпаргалку Абсолютных Противо-C++-ных Аргументов ещё слова: "ересь", "бред" и "вера".
Занесите, т.к. Влад абсолютно прав. С++ уродливый и непродуктивный язык и жив он все еще только потому, что у него есть ниша, в которой у него нет достойных конкурентов.
VD>>Стандарт не изменялся с 1998 года. Читай по буквам — Д Е С Я Т Ь лет. Разговоры о том, что вот-вот появится новых стандарт не утихают с 2000-го года. Но, насколько мне известно до сих пор он так и не принят.
ГВ>И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо.
Это очень плохо. Язык должен развиваться. Посмотрите на С# — кому плохо, что за эти 7 лет на пороге уже 4ая версия языка, где каждая версия — серьезный шаг вперед?..
Здравствуйте, CreatorCray, Вы писали:
VD>>Для особо одаренных повторяю. Нет никакого С++0х. С++0х — это рабочее название черновика. CC>Камрад, от того, что ты твердишь "нету его" он не исчезнет. CC>Он есть, и используется. Это факт.
Есть он только в твоем воображении. То что кто-то использует черти что созданное на основе черновиков — это их личная инициатива. Не более того.
VD>>А в "кампилирах" есть еще свойства и поддержка COM. И что с того? CC>Это к терапевту.
Умора, клиенты психиатров отправляют к терапевтам.
Ладно, разговоры в подобном ключе меня не интересуют.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>>>А с асинхронным вводом-выводом работал? COF>>А причем тут это? G>При том. G>Асинхронный ввод-вывод ломает "линейную" структуры программы, это очень сильно сказывается на том как управлять ресурсами.
Ну и? Да я работал с асинхронным вводом-выводом, правда на C++, где он ничего не ломает. Странно...
Здравствуйте, FR, Вы писали:
FR>Ассемблер сейчас дает меньший простор, кроме нескольких узких случаев, и даже для них удобнее править выхлоп сишного компилятора.
Это чушь. По той же логике, что предъявляют фанаты С++ ассемблер как раз дает больше возможностей для оптимизаций. Например, самые новые инструкции можно заюзать и т.п. Когда там компиляторы до них подтянутся.
FR>К тому же ассемблер средство другого класса, трудоемкость разработки на нем (даже учитывая чудеса макроассемблеров) на порядок ниже чем на C++.
О том я и говорил. Именно трудоемкость. То есть приципиально повышения производительности добиться конечно можно, но если сравнить затраты и получаемый выхлоп мало кого это заинтересует.
FR>Шарп и С++ по трудоемкости разработки в одном классе.
Это чушь. Трудоемкость на С++ выше очень значительно. Разница не такая огромная как в сравнении С++ и ассемблера, но тоже очень велика. А если учесть, что есть языки сильно мощнее C#, то она уже становится очень значительной. При этом с точки зрения скорости, для большинства задач разница как раз не велика (если вообще есть).
Посему если у тебя много бабла (проект высоко рентабельный), то С++ может быть подходящим, так как увеличение трудоемкости окупается конкретными преимуществами — меньшими требованиями к ресурсам компьютера, а значит расширением базы аудитории. Если же проект низкотиражный или вообще штучный, то разработка на С++ — это чистейшей воды идиотизм и бездарная трата ресурсов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
C>>Элементарно средствами RhinoMocks.
V>Во-первых, мне гораздо больше по душе TypeMock, по сравнению с которым рино курит, во вторых даже на нем это не элементарно.
Раньше у меня были сомнения, что Вы возможно имеете представление хоть примерно о сути разговора... Увидев ЭТО, понял, что я сильно ошибался.
Здравствуйте, VladD2, Вы писали:
VD>Чушь — твое ИМХО.
Твоё ИМХО бред.
VD>От уровня языка зависят и проектные решения
Чушь.
VD>и объем кода который требуется написать
Единственный реальный фактор, правда переоцениваемый некоторыми религиозными ребятами.
VD>отладить
Основная часть времени отладки (и той же настройки) не зависит от языка (если конечно код писали не совсем нубы, а они могут запороть любой проект, вне зависимости от любого языка).
VD>и документировать.
Объём документации так же не зависит, если конечно какой-то не слишком грамотный ПМ не заставляет документировать собственно исполняемый код.
Объём интерфейсов и функциональности всёравно будут одинаковым и требовать схожего времени на документирование.
Здравствуйте, criosray, Вы писали:
ГВ>>Ты с топика-то не съезжай. Я тебе тут давеча вопрос про тестирование задал. Ответ будет? C>Я даю ответы только тем, кто хоть что-то понимает в теме. В Вашем случае не вижу смысла тратить время и силы, т.к. все-равно канут в лету.
Шикарно!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Anton Batenev, Вы писали:
AB>Судя по хамско-истеричному тону твоего сообщения и отсутсвию комментариев по очевидным тезисам, прилетело тебе кучно.
Хамский тон? Дык я со всеми говорю тем тоном который они зауживают. Ты не стоишь того, чтобы проявлять к тебе уважение.
А что до истерик. Гы. Не умеешь ты диагнозы по почерку выставлять. Мне от твоих понтов ни тепло, ни холодно.
VD>> Ты слил спор и теперь бредишь пытаясь перевести разговор на что-то не относящееся к делу.
AB>Ты спрашивал, как показать мастер-класс — я тебе ответил. При чем, подобрал задачу как раз под тебя. Или я был слишком хорошего мнения?
Да причем тут мастер-класс? Я о другом говорил. Ты банально обосрался в споре и пытаться свести все к флэйму, перевести тему, перейти на личности и т.п. Ну, так тут таких как ты пруд пруди и на такие примитивные приемы я не поддаюсь.
VD>> При этом даже в теме на которую ты пытаешься перескочить ты не понимаешь ровным счетом ничего.
AB>Ты очень хочешь, но стесняешься мне поведать историю про rocket science сайта RSDN типа "каталог статей" + "форум" с суточным количеством хитов в районе 100-200 тыс и временем жизни кэша в районе минуты? Чтож, удиви меня.
Я не вижу никакого отношения между твоим ламерством в обсуждаемых вопросах и нашим сайтом.
Ну, и разговаривать о проблемах сайта с теоретиками мне по-попросту не интересно. Когда создашь сайт хотя бы в десять раз меньше популярный можно будет поговорить.
VD>> В общем, сплошное ламерство и не умелая демагогия с твоей стороны. Постыдился бы.
AB>Мне-то почему за то, к чему я не имею никакого отношения, должно быть стыдно?
Тебе должно быть стыдно за свое ламерство и ту дерьмовую демагогию что ты тут разводишь.
В прочем, понятие совести для таких как ты вряд ли применимо, а значит разговоры о совести бессмысленны.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, esil, Вы писали:
E>А тут случаем баг не закрался? E>CreateBySimilarityCasesensitive возвращает временный объект, на который потом берётся ссылка.
Нет, временный объект просуществует до конца видимости ссылки. С указателем такая фишка не сработает.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, samius, Вы писали:
S>>Ты просил пример, где программа на C++ сольет в разы. Я привел. Пример, где сольет дотнет я не просил.
IID>Ссылку с C# кодом подтрудись привести, в ворохе твоих сообщений сходу не нашёл. И учти, я не буду писать абсолютно идентичный вариант, если используется кодогенерация. Мне моё время дорого. Раз этого не хочешь сделать ты — я сам зафиксирую один (произвольный) вариант исполнения алгоритма. Не факт что он будет оптимальным для тебя.
Собрался доказывать что интерпретируемый вариант быстрее компилированного? Маньяк!
Ссылки на исходники небыло.
Вобщем так:
Примерно такого рода DSL, придуманный под string.Replace, чтобы без парсинга
Далее рисуем на растре плоскость Z = 0 в квадрате -1<x<2; -1.5<y<1.5
Должно получиться что-то типа болта, вкрученного в стену.
Непременное условие — возможность изменения описания поверхностей в рантайме.
Примерная скорость реализации на шарпе 5.9 млн запросов по цвету в секунду на одном ядре.
На днях выложу картинку в блоге.
Учти, твое время я оплачивать не буду!
S>>Доказывать что md5 на С будет немного быстрее C# мне не надо.
IID>НЕМНОГО ?!! Ты уверен что это действительно будет НЕМНОГО? (кстати, что такое НЕМНОГО? пара процентов ? или, может быть, разы ?)
Уверен, что разница будет не такая, как между выполнением кода и интерпретацией
Здравствуйте, Sinclair, Вы писали:
E>>А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные? S>Меня всегда умиляла способность читать книгу и ничерта не понимать. S>Ты не заметил, что паттерн позволяет заменить часть программы так, чтобы уменьшить накладные расходы до приемлемых? S>При этом основным алгоритмам наплевать, один и тот же там объект или разные. S>Это как раз пример того, что мы S>а) сначала пишем систему так, как нам удобно — все алгоритмы (например, разбиения на строки и страницы) пишутся очевидным и красивым образом S>б) при помощи профайлера выясняем источник проблемы S>в) заменяем нехорошую часть алгоритма. S>Например, для текстового редактора мы бы всего лишь изменили маленький фрагмент кода, тот, где фабрика Char-ов. Возможно, закомментировали бы метод Char.Equals (чтобы использовать дефолтный ReferenceEquals, который быстрее). И всё! Где тут "заранее проектировать с учетом быстродействия"?
Меня тоже много чего умиляет... Хочешь аналогию на примере парсинга XML-RPC пакетов (ну, оно мое родное и близкое)?
a) сначала пишем систему так, как нам удобно — все алгоритмы (например, парсинг XML, валидация и маппинг) пишутся очевидным и красивым образом. -- Используется XML ридер с DOM. По DOM делается валидация модели пакетов XML-RPC и маппинг на языковые типы.
б) при помощи профайлера выясняем источник проблемы. -- Им оказывается именно построение DOM (там и по памяти оверхед получаем и по перформансу).
в) заменяем нехорошую часть алгоритма. -- Выкидываем DOM и переписываем на SAX (при этом меняется весь алгоритм вообще)
S>И всё! Где тут "заранее проектировать с учетом быстродействия"?
И все! Приплыли. Выкинули весь парсинг, валидацию, маппинг и переписали. Лень было проектировать заранее.
Здравствуйте, gandjustas, Вы писали:
G>То что С++ (именно с плюсами) нах не нужен. Для быстрых числомолотилок берем код на C и нормально зовем его из любого языка.
Я уже не первый раз вижу это мнение, но не могу понять мотивы, может объяснишь? Наилучшие по оптимизации компиляторы — это С++, и они умеют коомпилировать С-код. Вот смысл мне не пользоваться возможностями более высокоуровневого языка, если у мня все-равно будет использован компилятор, который прекрасно компилит оба языка. Смотри: в чистом С ссылочный тип не строго типизирован, нет инлайна, нет инициализации по месту, недоступна ОО-декомпозиция (а в этом миксере участвует около десятка классов, и кое-какая шаблонность есть, правда без претензий на МП) и т.д и т.п. Поэтому поинт не понятен совершенно, по мне С++ в стиле "С с классами" все равно гораздо мощнее С. Я бы советовал ровно наоборот, там где можно, вместо С использовать С++.
G>Для более высоких абстракций берем более подходящие языки.
Дело в вышине абстракций, а вычислительной модели. Для задачи надо брать подходящую вычислительную модель. Да, на GC многие задачи решаются проще, даже если брать языки с убогим синтаксисом просто в силу подходящей вычислительной модели.
G>Кроме того уже не за горами запуск числомолотилок на GPU, там тоже высокоуровневые языки будут более уместны, так как позволят генерить код для GPU в рантайме.
Фиг его знает, что будет. При количестве ядер, больше 16/32/64, сам факт наличия GPU будет под вопросом. В любом случае, обсуждать сегодня то, что может быть завтра, в контексте сделанной вчера задачи — юморно.
Здравствуйте, gandjustas, Вы писали:
G>Эта наивная реализация во многих местах осталась и по сей день.
Это проблемы тех мест а не С++ в целом.
И>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>Покажите две программы на .net и C++ с эквивалнтной функциональностью сложнее HelloWorld, потом посмотрим кто гонит. G>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены.
Ты не в тот таскманагер смотришь, тебе уже сообщали.
G>>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики. G>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET.
Кстати, как там на данный момент обстоит дело с GC в условиях наличия за-pin-ованых объектов?
G>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором.
Это как напишешь. В unmanaged в реальном коде где надо performance выделение/освобождение памяти выносят "за скобки" и делают крайне редко.
И>>а) есть стэк; G>Стек заставляет копировать объекты чаще, чем нужно.
С чего бы вдруг?
И>>b) есть placement new; G>Теже яйца что и кастомный аллокатор, только сбоку
Только без затрат на выделение памяти. Т.е. совсем бесплатный считай.
И>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
Как показывает практика — есть. В таком контексте С++ от С мало чем отличается, только поудобнее разве что. Не надо только на нём александрескить и говнокодить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали: H>Я делаю выводы исключительно на основе личного опыта работы с .Net софтом.
Личный опыт — штука субъективная. Вот, к примеру, что пишут ведущие собаководы:
As user-interface folks know, perceived performance and actual performance can often be different things. I [Steven] remember when I was writing a portion of the Windows UI for Visual C++ and when I benchmarked against Borland C++ at the time, we were definitely faster (measured by seconds). However the reviews consistently mentioned Borland as being faster and providing feedback in the form of counts of lines compiled flying by. So I coded up a line count display that flashed a lot of numbers at you while compiling (literally flashy so it looked like it couldn't keep up). In clock times it actually consumed a non-zero amount of time so we got "slower" but the reviewers then started giving us credit for being faster. So in this case slower actually got faster.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, COFF, Вы писали:
COF>>Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает. MK>А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций? MK>А то страшно стало! Быстрее всё всё всё в main переношу...
Продолжу: вместо свойств публичные поля, использовать только структуры (на классы и GC — табу), которые выделять только на стеке, или в крайнем случае распределенные с помощью самописного аллокатора (массив структур тоже не пойдет, т.к. проверяет диапазон индекса). Все методы только статические, в них структуры передавать через ref параметр, дабы избежать копирований на стеке, ну и на всякий случай все под /unsafe компилить.
Чуть не забыл выкинуть все циклы foreach, а все остальные переписать в манере
for (i/*глобальная переменная*/ = items.Count -1; i >= 0; --i /*непременно префиксная форма*/)
Если кто так не сделает, то его код будет работать медленнее, чем C++ и ему никак не догнать плюсы по перфомансу, что означает конец карьеры программиста
Здравствуйте, MxKazan, Вы писали:
_>>Знаний для работы под С++ надо больше, но это изучается один раз в жизни. Много библиотек уже существуют по 10-20 лет и до сих пор актуальны. А самой CRT уже лет 40. MK>Вот те раз. Оказывается на C++ ничего нового за 10-20 лет не придумали? Ну ващеееее
C++ всего-то 20 лет от роду, CRT благополучно унаследована от C. И, например, "сокеты", которым уже около 30, до сих пор живее всех живых. Ещё и WCF переживут.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
H>>Во времена DOS'а, когда только начали появляться графические и псевдографические интерфейсы, а "мыши" были большой редкостью, в одном журнале прочитал интервью с каким-то разработчиком. Он отвечая на вопрос журналиста об использовании "мышки" в качестве единственного средства управления, ответил: "Если вы делаете "мышь" единственным средством управления, будьте готовы обеспечить им ваших пользователей". Вот, когда мне говорят о дешевых гигабайтах, я всегда эту фразу вспоминаю Не нужно забывать, что техника бывает очень разной, и часто бывает так, что купив ноутбук с распаянными на плате 512 метрами, заапгрейдить его можно только выкинув и купив новый. MK>Я, конечно, согласен, но только в определенной степени. Речь все-таки не о гигабайтах и 512 мегов сейчас уже редкость.
Полгода назад у Ровера вышла очень удачная машинка класса UMPC, там распаяно 768 и установлена Виста. В свое время Compaq выпустил очень удачный планшетник TC-1100 (HP'шники, суки, убили эту линейку) с Windows XP Tablet PC с которым сразу обнаружились проблемы с "заиканием" стандартной распознавалки вполть до отказа пользователей от ее использования (массово ставили Квартовскую или Парагоновскую). Причина проста -- стандартная распознавалка Tablet PC является/являлась .Net приложением (видимо GC и давал эффект заикания. На хоботе исследование вопроса проводили, но я детали не помню).
MK>Managed проги хоть и требуют памяти больше нативных, но все же не по 200 мегов на каждую фенечку. Тот же Creative Docs не отобрал у меня больше 120 Мб и при открытии всех сэмплов в поставке (я их покрутил/повертел/поперетаскивал).
Тут ведь какое дело, если софтина работает одна, так и не жалко. Но когда их много, а ресурсы ограничены... Просто выберет человек продукт конкурента и всех делов
Здравствуйте, gandjustas, Вы писали:
G>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
И вот таки да, предположим у нас получилость так, что из-за частых выделений/освобождений памяти наш продукт на С++ работает недопустимо медленно. Что можно с этим сделать? Для начала собрать профиль размеров выделяемых блоков, который нам покажет, что большинство выделяемых блоков имеют размер 256 байт. А дальше можно сделать например так:
Запустите это наколеночное решение и прослезитесь. И всё. Пользователи довольны, менеджеры счастливы, программисты радуются, фанатики С++ бъются в экстазе.
Что Вы будете делать с продуктом на С#? Судорожно тыкать в разных местах gc.collect? Срочно переписывать куски кода с использованием структур?
P. S. Я понимаю, что наверняка любители писать свои менеджеры памяти сейчас найдут в моём коде, который был написан за 20 минут, и не тестировался на реальных приложениях, тысячи багов, косяков, неоптимальностей и т. д. Суть этого примера в том, чтобы показать, что есть пути решения проблемы, которые можно успешно применять.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором.
Очень мало таких ситуаций. На практике оказывается что там где подходит С++ на самом деле нужно что-то вроде C_ _ классами. Высокоуровневые абстакции С++ идут лесом, упор делается на вычисления.
ГВ>Ты, почему-то, додумываешь, что это является призывом использовать C++ где ни попадя, вопреки здравому смыслу.
Ну попытка использвания C++ для сайтов или High-load сценариев — вопреки здравому смыслу.
Хотя многие тут уверены в обратном.
ГВ>>>Не так. C++ позволяет человеку влезть в то, чем обычно занимается машина. VD>>Нет. Он заставляет заниматься человека тем, что может контролировать машина. Он не предаставляет возможности не думать об упрвлении памятью даже если программист этого очень хочет. Он не предоставляет гарантий типобезопасности. Эти аспекты требуется контролировать вручную! ГВ>Прям, не язык, а монстр. (отсмеяшись) Знаешь, где самые страшные монстры? В воображении!
Сарказм здесь не уместен. C++ действительно заставляет программиста работать на очень низком уровне, даже если ему этого не хочется.
Это огромная проблема для языка.
ГВ>Есть ещё abstraction penalty. AFAIK, Java и .Net на данный момент справляются с ним несколько хуже, чем C++. Возможно, что когда-нибудь ситуация изменится, я это вполне допускаю. Только не надо читать мне лекцию по JIT-компиляции и возможностях этого подхода, я их отлично представляю.
О каком конкретно abstarction penality идет речь?
VD>>Так что более верно было бы сказать, что иногда С++ позволяет решить проблемы производительности, особенно если в приложении есть много тупых вычислительных алгоритмов и нет путей их алгоритмической оптимизации. ГВ>Угу: в частности, если в приложении есть много тупых... Далее по тексту.
ГВ>>>Например, известно, что крутоглюкавый Сталкер (который без кучи патчей вылетает в самых неожиданных местах) написан с использованием Lua. VD>>Ты откровенно говоря гонишь. На Луа там написаны только скрипты к сенкам да логика некоторая.
ГВ>И что характерно — она глючит похлеще движка. Если прикинуть, то ИМХО, плотность глюков на единицу скриптового кода получается поболе, чем в движке.
Только глюк в движке на С++ приведет к AV и падению, а глюк в игрологике может остаться незамеченным совсем.
ГВ>>>Известна также душещипательная история о скоростной резке Сталкера перед выходом (часть карт порезана, часть выброшена и т.д.) Думается, что вторая причина посущественнее остальных будет. VD>>Внимание, вопрос если бы в Сталкере логика игры писалась бы на С++, а не на скрипте, то код игра стала бы надежнее или наоборот? ГВ>Я думаю, что на этот вопрос нет ответа. Единственно, что будь игровая логика написана на C++, её было бы не так легко модифицировать моддерам.
На самом деле на С++ она не была бы написана никогда.
ГВ>Синтетика не показательная. Например, что касается C++-ного фрагмента, то он может быть и вот таким: ГВ>
Здравствуйте, criosray, Вы писали:
ГВ>>Где сказано, что мок обязательно изолирует тестируемый объект от окружающих? C>Даже и не знаю как Вам объяснить, что 2+2=4.
Никак, потому что в упомянутом мной фрагменте из фаулеровской писанины ни о каких изоляциях речи не было.
C>Даю наводящий вопрос: С какой целью создаются "objects pre-programmed with expectations which form a specification of the calls they are expected to receive"?
Очевидно, чтобы задать спецификацию для последовательности вызовов и отследить её выполнение. Обрати внимание, полная изоляция при этом вовсе не обязательна — мок может оказаться очень сильно перегруженным функциями стабов.
C>Можете мне не отвечать. Я ответ знаю. Ответьте себе. Если сможете, то поймете о чем идет речь. А не сможете — ну да и Бог с Вами.
Ну и как, смог?
C>>>Само собою. Весь этот спор о том, что на С++ нет даже близко сравнимых по удобству инструментов для тестирования.
ГВ>>Ну, если сводить "удобство тестирования" к автоматической генерации пустых объектов — соглашусь. А если не сводить, то тут очень сильно бабка надвое сказала. C>Тестируются не пустые объекты, а поведение объектов в фиксированных (изолированных) условиях.
"Пустые объекты" в смысле "тестовое окружение из пустых объектов". Ну или вырожденные до шлюзов к стабам (фейкам) и другим объектам окружения.
ГВ>>>>vdimas прав в том смысле, что если логика достаточно сложная, то и полные тесты достаточно трудно записывать. Вот тебе простейший пример (псевдокод): C>>>И что тут сложного?
ГВ>>А я и не говорю, что это сложно. Я о сопоставлении сложности теста и тестируемого кода. C>И? Не вижу к чему Вы клоните.
Прямо к тому, о чём сказал — к сравнению сложности теста и тестируемой программы. Поднимись на пару сообщений вверх, там всё написано. Тест иной раз принципиально не может быть проще тестируемой программы.
C>>> Элементраный тест (в условиях дотнет) с условно установленными моками.
ГВ>>Мммм... Дотнет его сам сгенерирует? Полностью? А за пивом он сгоняет? C>Полностью. Сгенерирует. Не вижу причину сарказма.
Что он сгенерирует и на основе чего? Как сгенерировать пустой мок — понятно (пробежались по списку внешних вызовов и ссылок, и автоматом получили "пустой мок"). Вопрос — как сгенерировать наполнение этого мока, представляющее собой ту самую спецификацию, которую мок ожидает.
ГВ>>[...]
ГВ>>Даже если говорить о приведённом примере, то где здесь тестирование сети/жёсткого диска/...? Тестируется соответствие реального и предполагаемого протокола работы (form a specification, итить!). Или ты думаешь, что под sendMessage имеется в виду send в сокет?
C>Если не предполагается, то RhinoMocks прекрасно справится с мокингом в этом случае. В чем проблема?
Все нужные Expect(sendMessage ...) RhinoMocks сам напишет?
ГВ>>А потом, модульным тестированием называется тестирование модулей. Что именно мы так называем — зависит от структуры программы. Запросто может быть тестирование модуля по имени "модуль сетевого интерфейса", который запросто может предполагать одновременный запуск тестов на нескольких машинах и в то же время другой модульный тест может проверять одну-единственную функцию. C>Демагогия. Вы пытаетесь рассуждать логически, строя ложные выводы, основываясь не на реальных знаниях и опыте, а на дедукции и том, что Вы считаете логичным в меру Ваших познаний.
Интересно, откуда уверенность в оценке моих реальных знаний и опыта? Считай, что мне это просто любопытно.
C>Почитайте Мартина Фоулера, почитайте Бекка... Да хотя бы, потратьте 10 минут да прочтите http://en.wikipedia.org/wiki/Unit_testing
Хорошо. Википедия ближе всего для цитирования:
Модульное тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода.(Глупость в википедии никогда не надо искать долго, достаточно двух предложений. — прим. Г.В.) Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже написанных и оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Собственно, вот здесь даны несколько более корректные объяснения феномену модульного тестирования. Почитай на досуге.
ГВ>>Если TDD предполагает, что это неправильное употребление термина "модульное тестирование", то тем хуже для самого TDD.
C>Тем хуже для Вас, а не для TDD.
Да нет, именно что для TDD. Жонглирование и произвольная реинтерпретация терминов ещё никого до добра не доводила.
C>>>Да, тестируемые участки кода должны быть простыми. [...] ГВ>>А если пользователь поставил задачу, которая не имеет простого решения? C>Знакомы с понятием "декомпозиция"?
Я надеюсь, тебе не придёт в голову отсылать меня в википедию по этому поводу?
ГВ>>Значит, я не смогу написать простой тест и не смогу руководствоваться современными правилами программирования? C>Сможете.
Группа маленьких модулей логически объединена в общий модуль, с которым программа работает через некоторый интерфейс. Этот сборный модуль тестируется отдельным набором тестов... Как называется это тестирование?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>>>Кроме того, повышается переносимость кода. При удачном стечении обстоятельств можно взять код на С и запустить его на видеокарте с помощью CUDA. CC>>Снимай уже розовые очки. CC>>На CUDA перенести удается только хорошо параллелящиеся алгоритмы. Все остальное превращается в УГ. G>Читай внимательнее выделенное.
Ты в выделенном забыл написать слово "очень" после "при".
Далеко не все алгоритмы ложатся на CUDA. Далеко не все объемы данных выгоднее считать на CUDA. Пока еще слишком много "но" в этой технологии.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
D>>советую забыть про с++. На нем сейчас пишут почти только игрушки/драйверы за редкими исключениями. S>Хмм, да? А как на счет этих: S>MSOffice12, Microsoft Silverlight, Windows7, Vista, QT, WinRar, Adobe (Photoshop and Co), QuickTimePlayer, Notepad++.
Дада, его сразу возьмут писать Windows7
S> Дофига потребительских прог на C++, помоему, гораздо больше чем на C#. Для разработчика это очень рискованно связываться с C#, т.к. требуется тащить .net runtime и привяжешь себя к Виндам.
А иначе есть вы можете заразиться линуксом, а там и до opensource недалеко. И войдёт у вас в привычку работать бесплатно
зы. niellune, C#. У вас хоть будет возможность не выбрасывать ваш прошлый опыт + переосмыслить ваши старые проекты.
Здравствуйте, MxKazan, Вы писали:
MK>>>Я А Qt Software самая святая :)) O>>Ой насмешили :) Нету такого — Qt Software. Есть лишь библиотека Qt, написанная Trolltech. MK>Люблю доставлять людям радость :)
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали: MK>>>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>>>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы? MK>>А тем, что она все-равно зависима. ГВ>Начинаем спор о словах. Что такое "платформа"? Традиционное понимание — это что-то масштаба операционной системы. В этом смысле Qt предоставляет вполне приличную переносимость, в отличие от.
И тем не менее мы приходим к тому, что ваша "независимая" Qt'шная прога так или иначе, но зависит от библиотек и от API ОС. Реши производитель операционки радикально что-то поменять, вся ваша платформонезависимость полетит к чертям, пока та же Qt не будет доведена до поддержки нового API. Так вот тоже самое и с утверждениями про зависимость .Net от MS.
Здравствуйте, shrecher, Вы писали:
S>Здравствуйте, MxKazan, Вы писали:
S>>>Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи. MK>>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было
S>Заметь, "улучшает" в кавычках. Почему нельзя было сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями? Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия.
А вы сразу пишете гововые программы без глюков?
А ядра линуксов не штапмуются как блины последние 20 лет?
Вообще любой продукт (не только касаемо компов) делается один раз и навсегда?
Надеюсь вы поймете всю глупость утверждения "сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями".
И даже несмотря на все рассказы о "стабильности" С++ (хотя это уже признак деградации), постоянно выходят новые версии библиотек типа Qt, Boost и прочих, а тут еще следующий стандарт C++ на подходе.
Здравствуйте, NikeByNike, Вы писали:
NBN>Я не понял, ты что думаешь что в С++ нет GC?
Да в общем-то видел я GC++. У Элджера. Алгоритм Бейкера, итд.
Но на демона он, эта, не тянет. То есть, может и взлетит, но низэнько, низэнько
NBN>Мы тут вроде обсуждаем С++ и C# А эта портянка написана индусом на мракобесном С.
Знал бы ты, кто этот индус и откуда я это скопипастил..
Кстати, не С. Там есть шаблон, да не один!
NBN>Как тут уже верно замечали — выбор языка определяется задачами. Я вот уже пару раз изучал шарп — но так и не нашёл куда его применить в своих задачах Реально смог применить только один раз — для прототипа.
А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился.
Здравствуйте, gandjustas, Вы писали:
G>Да хватит уже кросплатформенностью меряться. Самые кроспалформенные GUI-фреймворки уже давно придуманы это HTML+CSS+Javascript, чуть меньшей кроссплатформенностью обладают Flash и Silverlight. С++ c Qt даже рядом не валялся.
Ну, если xML — это путь кроссплатформенных GUI, то чем дальше C++/Qt от них, тем оно лучше.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, NikeByNike, Вы писали:
G>>>>Ну вам может и не стоит, а другому может быть интересно. NBN>>>В том то и дело, что _интересно_. А мы тут делом занимаемся G>>Вопрос автора топика в чем был? G>>Он ищет язык для дельнейшего развития, так что ваши предпочтения мало отношения к делу имеют. NBN>Он просто сам не знает чего ищет. Язык программирования — определяется задачей и ничего не мешает знать хоть десяток языков
C#(.NET) и Java в наше время подходят для подавляющего большенства задач.
NBN>Есть достаточно много задач, где приоритет С++ — несомненен и зп платятся очень неплохие. Но при этом знание голого С++ тебе ничем не поможет — надо знать и уметь решать задачу — собственно платят то за неё
Тогда причем тут C++ ? Большенство задач решаемых на C++ можно решать и на других языках более качественно. Платят то за решение задачи, а не "решение задачи на С++".
Здравствуйте, gandjustas, Вы писали:
G>>>Он ищет язык для дельнейшего развития, так что ваши предпочтения мало отношения к делу имеют. NBN>>Он просто сам не знает чего ищет. Язык программирования — определяется задачей и ничего не мешает знать хоть десяток языков G>C#(.NET) и Java в наше время подходят для подавляющего большенства задач.
Для игр и мобильного мира они не подходят. Совсем. Для миддлеваре — тоже.
NBN>>Есть достаточно много задач, где приоритет С++ — несомненен и зп платятся очень неплохие. Но при этом знание голого С++ тебе ничем не поможет — надо знать и уметь решать задачу — собственно платят то за неё G>Тогда причем тут C++ ? Большенство задач решаемых на C++ можно решать и на других языках более качественно.
Нельзя. Просто нельзя сделать на яве/шарпе более качественно чем на С++ при прочих равных.
G>Платят то за решение задачи, а не "решение задачи на С++".
Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
Здравствуйте, COFF, Вы писали:
COF>Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков?
а ты следишь за всеми процесами в системе и напрягаешься от мусора в памяти?
в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких
Здравствуйте, gandjustas, Вы писали:
G>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. И GC не будет. G>А если кончится реальная физическая память, то страницы будут вытеснены, а освободившая память отдастся тому кому оно нужно.
Я не хочу вдаваться в детали, можно дискутировать об особенностях выделения памяти с gc или без него сколь угодно долго, но факт налицо — управляемые приложения на десктопе тормозят и жрут память. В теории возможно они хороши, а C++ плох, но практика пока этого не показывает.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>точно. а продуманная структура управления регистрами и явное использование адресов памяти в программе ещё круче, вот только несколько дороговато в разработке. язык — это средство описания алгоритма, а не детального расписывания того, что должен процессор делать каждый из 3 миллиардов циклов в секунду если ты так нацелен контролировать свой процессор, то тебе нужны машкоды и что-нибудь неспекулятивное
COF>Язык должен быть в состоянии и описать алгоритм на высоком уровне, и дать возможность распределить регистры если это нужно (а это иногда бывает нужно). Дать возможность использовать сборку мусора, где удобно, или отказаться от нее. Вот это идеал, с моей точки зрения. Сейчас C++ по сравнению с другими распространенными языками наиболее близко подходит к нему, поэтому и популярен. А когда говорят, что ручное распределение памяти вам не нужно, регистры вам не нужны, ваше дело высокоуровнево алгоритмы описывать, то сразу же возникает вопрос, а как тогда эти задачи решать и кто их будет решать? Инопланетяне?
Язык C++ не обладает возможностью описать алгоритм на высоком уровне.
Если не верите, то попробуйте написать алгоритм решения задачи: "вывести на экран все строки текстового файла, в которых более трех слов, отсортированные по алфавиту".
Причем это долно быть не наколеночное решение, а production-quality код, в котором можно без особых услий убрать условие, или сделать вывод только уникальных строк, или вывод строк через одну.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>читай внимательно. в языках с gc гарантия — на 3x, можно и меньше. в C++ — гарантий никаких, расход может быть каким угодно прсто потому что память усеяна мелкими дырками
NBN>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался.
Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его.
На C++ такое получится?
Здравствуйте, gandjustas, Вы писали:
G>Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ?
Здравствуйте, gandjustas, Вы писали:
H>>Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
G>Только общее увеличение потребления памяти получим. G>А кто-то еще ругается что .NET много памяти жрет.
Конечно получим, куда же мы денемся. Только оверхед сильно меньше, чем у .Net . Это я про общий случай, и по реальным приложениям это видно.
Здравствуйте, NikeByNike, Вы писали:
NBN>На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям
Зависит от требований. Вообще у каждого языка есть своя ниша, определяемая пересечением требований с возможностями и ограничениями языка.
ЗЫ: Щас конечно вылезет кто нить из святой кучки апологетов и начнет кричать что у языка Х возможности безграничны, а ограничения несущественны.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
G>Маленький ликбез: G>1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков.
Ты сам в это веришь? Это наивная реализация 80-ых годов. Сейчас используются всякого рода оптимизации, позволяющие минимизировать время поиска и частично отказаться от блокировок кучи. Например, в windows heap создается, если мне память не изменяет, на одну кучу 128 ассоциативных однонаправленных списков, не требующих блокировок.
G>При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию.
В С# в целом та же херня.
G>2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным.
Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. Кроме того, в С++ принято мелкие объекты создавать на стеке. А если нужно в динамической памяти разместить объект, то есть placement new, который позволяет разместить объект в уже выделенной памяти.
G>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров.
Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики.
G>4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация.
GC тоже не потокобезопасный, и зачастую требует не просто синхронизации, но и приостановки работы потоков.
G>5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции
В С++ такое делают крайне-крайне редко. Потому что а) есть стэк; b) есть placement new; c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части;
G>Теперь о GC G>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю
Ага, аж десять раз. Это как бог на душу положит. Может и GC запуститься с полной остановкой всех потоков. Веселуха... G>7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть)
уже писал про мелкие объекты и про то, что общий оверхед памяти для .net программ хорошо больше цэпэпэ. G>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна.
в c# выделение памяти не более потокобезопасно, чем в с++ G>9)такое распределение памяти увелиичивает cache-locality
стандартные аллокаторы windows тоже оптимизированы на это дело G>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении
по сути это и означает, что когда захочется, особенно если речь идет о более-менее больших системах G>11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора.
пофиг, в С++ частое выделение/удаление мелких объектов стараются делать на стэке. G>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить. G>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь
это в общем-то самообман
PS
существенное преимущество GC — не надо следить за уничтожением объектов, что облегчает программирование, позволяет использовать всякие инетересные техники программирования, вроде замыканий. Но за эти удобства мы платим скоростью исполнения и большим расходом памяти. Вот собственно и все.
Здравствуйте, Игoрь, Вы писали:
G>>Маленький ликбез: G>>1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков. И>Ты сам в это веришь? Это наивная реализация 80-ых годов. Сейчас используются всякого рода оптимизации, позволяющие минимизировать время поиска и частично отказаться от блокировок кучи. Например, в windows heap создается, если мне память не изменяет, на одну кучу 128 ассоциативных однонаправленных списков, не требующих блокировок.
Эта наивная реализация во многих местах осталась и по сей день.
G>>При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию. И>В С# в целом та же херня.
Доказательства? Может сначала статью про .NETовский JIT прочитаете. На этом сайте статьи есть.
G>>2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным. И>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь.
Покажите две программы на .net и C++ с эквивалнтной функциональностью сложнее HelloWorld, потом посмотрим кто гонит.
Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены.
И>Кроме того, в С++ принято мелкие объекты создавать на стеке. А если нужно в динамической памяти разместить объект, то есть placement new, который позволяет разместить объект в уже выделенной памяти.
Ага, это все увеличивает энтропию языка, то есть количество свпособов сделать одно и тоже по-разному.
G>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики.
Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET.
Про мемори лики хочу узнать поподробнее, как их получить, потом сравните это с простотой получчения лика в unamanged коде.
G>>4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация. И>GC тоже не потокобезопасный, и зачастую требует не просто синхронизации, но и приостановки работы потоков.
Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором.
G>>5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции И>В С++ такое делают крайне-крайне редко. Потому что И>а) есть стэк;
Стек заставляет копировать объекты чаще, чем нужно.
И>b) есть placement new;
Теже яйца что и кастомный аллокатор, только сбоку
И>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части;
Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
G>>Теперь о GC G>>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю И>Ага, аж десять раз. Это как бог на душу положит. Может и GC запуститься с полной остановкой всех потоков. Веселуха...
Читайте как работает GC, он не может просто так взять и запуститься.
G>>7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть) И>уже писал про мелкие объекты и про то, что общий оверхед памяти для .net программ хорошо больше цэпэпэ.
А вы вообще ветку читали перед тем как это постить?
G>>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна. И>в c# выделение памяти не более потокобезопасно, чем в с++
Полный бред.
G>>9)такое распределение памяти увелиичивает cache-locality И>стандартные аллокаторы windows тоже оптимизированы на это дело
Рад за аллокатор Windows, только зачем он нужен если можно выделять память смещением указателя. Быстрее просто нечего придумать.
G>>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении И>по сути это и означает, что когда захочется, особенно если речь идет о более-менее больших системах
И че? сборка памяти в нулевом поколении работает быстре чем использование алоокатора на списках при выделении-освобождении того же объема памяти.
G>>11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора. И>пофиг, в С++ частое выделение/удаление мелких объектов стараются делать на стэке.
Ну и пусть стараются.
G>>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить. G>>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь И>это в общем-то самообман
Самообман — думать что C++ всегда быстрее.
И>PS И>существенное преимущество GC — не надо следить за уничтожением объектов, что облегчает программирование, позволяет использовать всякие инетересные техники программирования, вроде замыканий. Но за эти удобства мы платим скоростью исполнения и большим расходом памяти. Вот собственно и все.
Тесты будут? Или вы тоже омновываете свое мнение на просмотре пары говнопрограмм?
Здравствуйте, gandjustas, Вы писали:
И>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
Такое предложение заставляет заподозрить недостаточное владение С++.
Здравствуйте, hattab, Вы писали:
H>Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление. Делаем простой эксперимент. Запускаем Paint.NET, который откушал сразу 35Mb (судя по твоим словам, большая часть этой цифры -- резерв, который будет возвращен в систему по первому требованию). Теперь начинаем запускать много тяжелого софта: две Delphi IDE, Open Office Writer, Abode Reader, Opera (она у меня жрет в районе 160Mb, из-за размера почтовой базы), VirtualBox. Все система ушла в своп. Смотрим на потребление Paint.NET... оно снизилось ровно на 300Кб. Выводы?
Блин, вот что правда 100 или 200 мегов оперативы сейчас кому-то принципиально? Я когда приводил скриншот с Creative Docs, там еще Оракл светился. Жрал 250 мегов, но при этом он у меня вообще никак не юзается. Я его однажы установил и всё. И вот оно тяпает 200 мегов при запуске и оно нативное. Но чесс говоря, что есть оно, что нет, мне фиолетово. На компе 1 Гиг оперативы. Ххах. А было бы оно managed, наверняка бы и эти 200 мег припомнили
Здравствуйте, gandjustas, Вы писали:
G>Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много?
От программы зависит. Для тачки с 512 Мб на борту это больше половины доступного RAM...
Так что, если прога -- это часы, например, то привет...
Но если проге реально нужно МНОГО памяти, то всё ещё хуже. Особенно если её надо много, но небольшими блоками. Вот в моих С++ прогах часто заканчивается адресное пространство 32-й винды, например. И всякие прототипы на С# показывают радикально худшую производительность/эффективность по памяти
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Да, в C++ надо думать о том когда и как выдеоять и освобожать память.
Нет, это нужно в С.
Ну или в С++ если программист им не владеет.
G>Обычно ручная возьня с ресурсами очень сильно увеличивает время разработки программ. Такую возьню могут позволить себе только очень крупные фирмы.
Не очень сильно.
Здравствуйте, gandjustas, Вы писали:
G>Незнаю во что у тебя меню упирается, только что проверил — все летает.
Ну у тебя всегда всё летает. Это не ново.
подумалось мне тут, что не на память-там-шмамять и на камни деньгу тратить надо, чтобы "все летало", а на траву позабористее, что-то типа лайт-версии чёрно-белого плана...
Ганджустас! (И как я раньше тайну ника-то не просёк!!!) Будь человеком, отсыпь кораблик?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Собиралось 2008 студией, релиз, запуск из проводника. G>>C++ — 562 мсек, C# — 92 мсек.
G>>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
H>Несмотря на всю бессмысленность синтетики,
Работа с динамической памятью является основной операцией в большенстве программ .
H>скажи, на какой машинке делал замер? Процессор (частота), память (тип, PC...)?
Ноут, Intel Core2Duo 1800 или около того, памяти 2 гб DDR2, ОС — виста.
Для сравнения запустил на домашнем компе, у него одноядерный Athlon 64 (GC точно не concurrent), 3 гига памяти, ОС — Windows Server 2008 x64.
Замеры C++ — 562 мсек, C# — 135 мсек.
Опять даже если учесть что в реальном случае .NET может работать в два раза медленее, то все равно не в пользу C++.
Приложение на C# запустилось как 64-битное, что многло дать задержки на операции присваивания.
Здравствуйте, gandjustas, Вы писали:
G>Ну давайте чтобы не быть голословным приведу код: G>....поскипано... G>Собиралось 2008 студией, релиз, запуск из проводника. G>C++ — 562 мсек, C# — 92 мсек.
G>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++. G>#include <windows.h>
маленькая поправка
int _tmain(int argc, _TCHAR* argv[])
{
DWORD ticks = GetTickCount();
for(int i=0; i<1000000; i++)
{
int arr[64]; // вот ето действительно стандартный "аллокатор" на С++
}
printf("%d", GetTickCount() - ticks);
getchar();
return 0;
}
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Невопрос
Х>
Х>staticunsafevoid Main(string[] args)
Х>
Х>ого! тебе осталось сделать совсем небольшой шаг до С++, решайся!
Зачем? Для запредельного перфоманса есть С, для надежного и красивого кода есть C#, F#.
А С++ в этом уравнении места нет.
Х>P.S. ну и что ты со своими байтами будешь делать? а как насчёт того чтобы классы на стеке инстанцировать?
Если уж очень надо стеке, то воспользуюсь структурами.
Здравствуйте, hattab, Вы писали:
H>Сказать-то чего хотел?
Что люди, которые для решения задачи "Получить от сервера картинку" выбирают формат BMP-over-XML/RPC, мягко говоря, не имеют права критиковать дотнет за производительность.
Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)?
Вина, естественно, в том, что для адекватных задач нужно применять адекватные средства.
Ну, а в целом по больнице, нужно не смотреть всякую фигню в таскменеджере, а ставить перед собой задачи и смотреть, как они решаются. В частности, к примеру, профилировать, сколько времени занимает "забрать картинку с сервера" в нативном и управляемом клиенте и укладывается ли это в заданные параметры.
В частности, брать тестовую среду, близкую к реальной, и смотреть, по прежнему ли всё укладывается.
Не имеет смысла сравнивать распределенную память у двух программ, когда еще полтора гига свободно. Нужно запускать, к примеру, обе программы на 512 метрах памяти, с открытым в параллель офисом или чем еще там требуется по задаче, и мерить, мерить, мерить, мерить.
Без этого прогибания пальцев типа "да у меня нативный клиент отъедает всего пять метров" примерно то же самое, что и "а вот у меня прога вообще регистр EBX не использует". В том смысле, что никому не интересно, что там твоя прога "использует" внутри. Если она работает так, как нужно заказчику, то всё в порядке. Никаких других критериев в природе нет.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, criosray, Вы писали:
H>>> New(Arr); H>>> Dispose(Arr);
H>>>Pentium M 1.7GHz. Память PC2700. Время: 67ms.
C>>Если компилятор не дурак, то он вообще не станет выделять память по пусту, раз Вы ее не используете и пустой цикл тоже не станет крутить по чем зря.
C>>Впрочем, это ж Делфи.
H>Вай-вай, говнодельфи укопал мегашарпа... Смотри не лопни, от злости
Кстати, как на делфи с задачкой про все строки файла...
Здравствуйте, gandjustas, Вы писали:
Х>>Так вот, в С++ в стек можно положить как объект-инстанс класса, так и объект-инстанс POD-структуры, в сишарпе же только второе. G>В C++ клас и структура — одно и тоже. В C# — разные вещи.
G>Вопрос возник видимо из-за непонимания этого факта.
Здравствуйте, Хвост, Вы писали:
C>>Отличное от реальности? Х>изначально разговор был о массиве структур на стеке, ликбез про боксинг/анбоксинг читать не стоило, читал давно, в зелёной книжке.
Да нет, стоило. Иначе Вы бы продолжали в пустую гонять воздух, не зная почти ничего о теме разговора.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>потому что я был уверен что struct в C# ето только данные и все операции с ним аля положить в массив и вызвать метод происходят только в его боксовом представлении MK>Угу. Еще ты был уверен про уровень
разработчиков .Net. MK>Что теперь мешает и мне написать подобный пост про тебя?
ну, давай по-порядку, на С# я писал давно и немного, на С++ на порядок больше, и есстествено что-то могло забытся, к тому же если ты проследишь начало темы про структуры, то она была о размещении их в массиве, и тут без ансейфа вариант действительно только один — боксинг. Теперь по-поводу "подобный пост про тебя", пиши пожалуйста, ведь ето ты будешь писать обо мне как о разработчике на C#, что ещё раз подтвердит мои слова , C# (особенно в версии 3.5) ето очень мощный язык, но для приложений требующих производительности, малой затраты ресурсов, быстрой реакции интерфейса ето просто моветон. Прототипы писать одно удовольствие, но тут как говорится — хоть на питоне. Дотнетчики же говорят "ааа, да ты чего, купи 4 ядра, возьми 16 гб" меня просто умиляют, вы поймите, что достойная производительность ето дополнительный функционал, ето когда спеллчекер подчёркивает красным не через две секунды после набора слова а сразу, ето когда в CAD'ах скролл рабочей области работает плавно, ето когда скриптовый google docs интерфейс не лагает, ето когда ты можешь в корелдро видеть тридцать слоёв одновременно а не пять, или когда диаграмму в таблице можно увидеть не только в плоском виде а в 3д и повращать, т.е. ещё раз, дополнительные ресурсы — дополнительный функционал. Вся ета дотнетчина на десктопах ето от бедности, когда нет денег нанять высокопрофессиональных программистов на С++ чтобы сделать проект и планка качества невысока, сойдёт и сишарп. Ентерпрайз лично у меня никогда не ассоциировался с качественным кодом, имхо там главная цель — лишь бы правильно работало, а уж быстро ли, медленно ли, интерфейс кривой или прямой — ето уже волнует в пятую очередь. Что насчёт дотнета на серверах — я только за, там дотнет ето просто клей, логика, вся тяжёлая работа лежит на сиквел-серверах + если надо какие-либо нейтив компоненты для обработки чего-нить быстрого (звук/картинки/видео). Заменить слово C# например на Python и ничего не поменяется, абсолютно. C# это клей, полный аналог VB конца 90-х по своему назначению, и плз, не надо его пихать в десктопы, точнее у вас ничего не выйдет, т.к. вы десктопы на C# не пишете, если вы разумны или у вас разумный руководитель.
Здравствуйте, Хвост, Вы писали:
Х>ну, давай по-порядку, на С# я писал давно и немного, на С++ на порядок больше, и есстествено что-то могло забытся, к тому же если ты проследишь начало темы про структуры, то она была о размещении их в массиве, и тут без ансейфа вариант действительно только один — боксинг. Теперь по-поводу "подобный пост про тебя", пиши пожалуйста, ведь ето ты будешь писать обо мне как о разработчике на C#, что ещё раз подтвердит мои слова , C# (особенно в версии 3.5) ето очень мощный язык, но для приложений требующих производительности, малой затраты ресурсов, быстрой реакции интерфейса ето просто моветон. Прототипы писать одно удовольствие, но тут как говорится — хоть на питоне. Дотнетчики же говорят "ааа, да ты чего, купи 4 ядра, возьми 16 гб" меня просто умиляют, вы поймите, что достойная производительность ето дополнительный функционал, ето когда спеллчекер подчёркивает красным не через две секунды после набора слова а сразу, ето когда в CAD'ах скролл рабочей области работает плавно, ето когда скриптовый google docs интерфейс не лагает, ето когда ты можешь в корелдро видеть тридцать слоёв одновременно а не пять, или когда диаграмму в таблице можно увидеть не только в плоском виде а в 3д и повращать, т.е. ещё раз, дополнительные ресурсы — дополнительный функционал. Вся ета дотнетчина на десктопах ето от бедности, когда нет денег нанять высокопрофессиональных программистов на С++ чтобы сделать проект и планка качества невысока, сойдёт и сишарп. Ентерпрайз лично у меня никогда не ассоциировался с качественным кодом, имхо там главная цель — лишь бы правильно работало, а уж быстро ли, медленно ли, интерфейс кривой или прямой — ето уже волнует в пятую очередь. Что насчёт дотнета на серверах — я только за, там дотнет ето просто клей, логика, вся тяжёлая работа лежит на сиквел-серверах + если надо какие-либо нейтив компоненты для обработки чего-нить быстрого (звук/картинки/видео). Заменить слово C# например на Python и ничего не поменяется, абсолютно. C# это клей, полный аналог VB конца 90-х по своему назначению, и плз, не надо его пихать в десктопы, точнее у вас ничего не выйдет, т.к. вы десктопы на C# не пишете, если вы разумны или у вас разумный руководитель.
Стена текста и все не по делу...
У нас пользователи в госструктурах на компах, которым уже по 2-4 года работают с нашим клиентом на .NET уже больше года в production режиме. Клиент довольно тяжелый: диалоги, графики, отчеты, таблицы, формы — полный комплект. Нареканий на производительность до сих пор не было. "ЧЯДНТ?"
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, esil, Вы писали:
E>>Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию. Кому-то такой подход кажется нормальным, кому-то нет. Но по крайней мере есть выбор. Хотя наличие выбора может кому-то тоже показаться плохой идеей. ))
E>Тут есть ещё одна тонкость. спец. аллокатор таки эффективнее для своей задачи. В этом нет ничего удивительного, так как специализированные решения часто лучше обобщённых E>А дальше возникает вопрос насколько тебе это надо. Если ты шахматные часы пишешь, то и фиг с ним. А если, скажем, делаешь ты С-300, и надо, чтобы система управления быстрее чесалась, так как чем быстрее и точнее она чешется, тем на дальше хватает изделию топлива. И тем больше есть времени, соответственно, "на выстрелить"...
E>И вот ты разрабатываешь, разрабатываешь, и упираешься. С С++ у тебя будет ещё один шаг, практически до субмакисмльного быстродействия, а в GC архитектуре ты остановишься на просто большом быстродействии и всё. И в результате ракета у амеров летает на 250, а у РФ на 350 км... И привет арифметике...
Зато у амеров этих ракет хоть попой кушай
Вообще если готовы бабло платить, то можно написать суперкомпилятор, который будет специализировать программу под входные данные, тогда она будет лететь 3 раза вокруг земли.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Если производительность окажется недостаточной то надо смотреть причны и бороться с ними. G>>Причем чаще всего прчиной оказывается применение неподходчщего алогоритма. Очень редко приходится нарываться на ситуацию когда низкая производительность вызвана особенностями платформы.
E>IMHO, такая ситуация, когда для ускорения надо менять алгоритм, часто говорит о том, что проектировали плохо.
Обычно так и делают.
E>Часто можно сразу выбирать оптимальный алгоритм.
А еще чаще — нельзя. Потому что решение задачи кроется не в одном алгоритме, а в дестятках. Подобрать оптимально каждый из них нереально, кроме того заранее обычно даже не думают как данные выглядеть будут.
E>Не понятно зачем пессимизировать-то? В большинстве задач оптимальные алгоритмы давно уже известны...
Ну если у вас задачи такие что под нее сразу можно оптимальный алгоритм подобрать, то хорошо.
В реальной жизни приходит заказчик и говорит: "сделайте мне песдато!"
Здравствуйте, Sinclair, Вы писали:
S>Вы перемешали логику реализации с логикой задачи. Конечно вы в итоге огребли. Это стопроцентная гарантия.
Она частенько перемешивается.
S>А вот если бы у вас маппинг был описан декларативно (см. XmlRootAttribute, XmlElementAttribute, XmlAttributeAttribute и т.п.), то вы бы легко заменили DOM-based serializer на SAX-based serializer.
Давай будем честными сами с собой. Реализовать оторванный от API парсинг ХМЛ-я очень не просто.
Как, например, описать такое отображение (маппинг) на Шарпе и потом связать его с реализациями на основе DOM и MxlReader?
Не получится ли код интерпретации отображения больше основной задачи (в несколько раз)?
Ведь очень легко сказать, что для решения задачи Х "просто" нужно создать подходящий фрэймворк или библиотеку, а потом "просто" использовать его. Но создание таких фрэймворков само по себе не простая задача. Особенно когда язык для этого не предоставляет должных средств.
S>Аналогичные примеры приводят всякие умники про "изначальный выбор алгоритма сортировки" и прочую ботву. Их проблемы — ровно аналогичны.
Не. Разные алгоритмы могут сортировки могут иметь общий интерфейс. А вот разные АПИ — нет.
Декларативное решение — это сдорово. Но ты должен с самого начала продумать свою реализацию, чтобы сделать ее декларативной. И ты должен иметь подходящий инструмент позволяющий сделать реализацию декларативной. Иначе ты можешь так и подвиснуть на стадии реализации средств для реализации основной задачи.
И даже имея такой инструмент не так то просто заменить одну реализацию преобразования декларативного описания в рабочий код в другую.
Так что подумать перед реализацией было бы не лишним. Главное не зацикливаться на этом. А то может статься, что работа подвиснет на стадии оптимизаций и выбора самого оптимального решения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ppp222, Вы писали:
P>Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
Это не плохо, это замечательно. зучать новые технологии интересно, они зачастую дают другой взгляд на решаемые проблемы, что очень положительно влияет на общий уровень развитя программиста.
Кроме того новые технологии зачастую позволяют применять существующие знания в новых областях.
Сейчас у .NET охват областей разработки значительно шире, чем у C++, и только продолжает расти. В это время C++ники все еще воюют с проблемами языка и утечек памяти и пользуются средствами десятилетней давности.
Здравствуйте, gandjustas, Вы писали:
G>Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
Сборщик мусора противопоказан С++. Стихия С++ — это эффективный код, где строки — это массив символов, завершающийся нулём, а не вызов библиотечных функций. И не потому, что стандарт С++ какой — то недоразвитый, а потому, что работая таким образом мы получаем прирост производительности от десятков до сотен процентов.
Здравствуйте, ollv, Вы писали:
O> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков
ржунимагу. шаблоны позволяют сделать то что уже есть в других языках
O>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы
Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают.
А вот наоборот — редко бывает.
O>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы.
Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает.
Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код.
O>Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так)
Какой гибкой архитектуры? C++ не умеет интеропать ни с какими другими языками, даже при интеропе с другой либой на С++ могут возникнуть проблемы.
O>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее
За последние 5 лет какое развитие было?
Здравствуйте, criosray, Вы писали:
ГВ>>И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо. C>Это очень плохо. Язык должен развиваться. Посмотрите на С# — кому плохо, что за эти 7 лет на пороге уже 4ая версия языка, где каждая версия — серьезный шаг вперед?..
язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь.
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>У тебя проблемы с терминологией. std::auto_ptr — это помощник упрощающий ручное управление памятью. В языках с автоматическим управлением памятью они ненужны. Меж тем сделать их не сложно.
ГВ>GC научился удалять строго указанные объекты (освобождать занятую память) в строго указанный момент времени? Он же, вроде, с точностью до поколения может работать?
GC бывают разные, но их объединяет одно — при наличии GC не надо управлять жизнью объектов вручную.
ГВ>>>В новой версии стандарта — поддерживает. VD>>1. Где эта версия? Стандарт уже зарелизили? А то мне про него последние 10 лет рассказывают, рассказывают...
ГВ>Ну... Комитет (tm).
Ага. Комитет — это жизненная форма, наделённая шестью или более ногами, и лишенная мозга. (с) Роберт Хайнлайн. Потому и развитие С++ такое бурное.
VD>>2. Без GC толку от этого будет не много.
ГВ>ИМХО, ты ошибаешься.
Да? Объясни тогда оду простую вещь. Для эффективного использования замыканий сами замыкания и все на что они замкнуты (т.е. имеют ссылки) должно жить столько сколько живет само замыкание. А замыкание может быть передано в ФВП которая так же может передать его в другие ФВП. Как не имея системы автоматического управления памятью реализовать безопасные (не приводящие к UB ошибкам времени выполения) замыкания?
VD>>Ошибаешься! Такие как ollv по незнанию или из фанатических побуждений применяют С++ там где ему совсем не место и в условиях где он противопоказан.
ГВ>Это слишком сильное утверждение, насчёт незнания и фанатизма. Так что, тут я согласиться не могу.
Что в нем сильного? Оно не противоречит утверждению, что есть люди использующие С++ осознанно и для задач где он является конкурентно-способным.
ГВ>Не надо переворачивать с ног на голову. Сайты бывают разные, и требования — тоже разные.
Ага. Не надо. Не надо разглагольствовать о разных задах сайтов. С++ там по любому не место. Если только в виде какого-то там драйвера или мелкого компонента вроде ISAPI-фильтра.
ГВ>MS и IBM (как и все остальные) вольны поступать так, как им заблагорассудится.
Ага. И выбирают для сайтов Яву и дотнет.
ГВ> И кроме всего прочего, слишком мало критериев для отсечения C++: "в кратчайшие строки получить надежное решение, когда денег на разработку нехватает". Он запросто может оказаться наилучшим выбором с учётом других факторов.
Ага. Но другим фактором может быть только крайняя нужда в достижении высокой вычислительной производительности путем ручной оптимизации.
ГВ> Тут проблема в другом: почему-то те, кто ругают C++ приписывают ему какую-то имманентную глюкавость, запредельную трудоёмкость и т.п. чуть ли не по всем аспектам, тогда как на самом деле это а) не так и б) зачастую обусловлено тем же контекстом, т.е. постановкой задачи, анализом требований и т.п.
Глюкавость приписывают не языку, а коду на нем написанном. И не почему-то, а исходя из общирного опыта и объективных логических рассуждений. Язык не типобезопасен, возлагает на программиста массу ответственности.
Есть такое умное высказывание (не помню чье) — человек не должен делать работу которую может сделать машина. А С++ заставляет человека делать работу которую можно возложить на машину. Все остальное последсвия. Ну, и С++ как раз очень сильно сковывает программиста в выборе абстракции. По сути, большинство С++-программистов, начинают решать все задачи с помощью шаблонов. Причем очень распростронено мнение, что производительность важнее качества.
Многие защитники С++ приводят в качестве примера 3D-игры. Мол, "почему их пишут на С++?". А стоило бы посмотреть на другой аспект. Почти все эти игры безбожно глючат. Играть в некоторые до выхода патчей просто невозможно. Большая часть ошибок в этих играх могла бы быть попросту не допущена, будь программа написана на более качественном языке.
ГВ>>>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо. VD>>Когда-то давно производительность Лиспа была огромной проблемой. Но сейчас есть высокопроизводительные компиляторы.
ГВ>AFAIK, на данный момент Lisp примерно на 5-20% проигрывает C++, пробегало где-то на www.franz.com.
Твой AFAIK. Высосан из пальцев. В прочем я не Лиспер и дать тебе точных данных не могу. Но я проверял их данные и скорее соглашусь с ними, а не с тобой. Кстати, проигрышь в 20% это вообще смешно. Отдельные компиляторы С++ проигрывают друг-другу в разны на разных задачах.
В прочем можно посмотреть здесь.
ГВ>Про SBCL я знаю, но сильно с ним не возился.
Я его пробовал. Очень быстрый, но глюкавый и не очень стандартный. Главная проблема в том, что для Винды его делают в последнюю очередь. Верся для Винды значительно отстает. Но для пенисометрии идеален. На многих тестах рвет С++-ные компиляторы как тузик грелку.
ГВ>Тоже неплохо.
Еще как не плохо. И это технологии про которые уже забыл. А ведь им 50 лет!
ГВ>Да нет, она эмоциональная по сугубо формальным признакам. find_if и Co вполне решают свои задачи в рамках STL/C++. Понятно, что это не filter/fold, но тем не менее.
Офтоп — Люблю русский "да нет".
Если понятно, то лучше помалкивать про find_if и компанию. И уж точно не заикаться о "применимости к объектам разного класса" или как там?...
ГВ>>>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта. VD>>Забавно, что ты даже не понимаешь о чем идет речь. Речь же идет о побочных эффектах воплощения шаблонов. Эти эффекты позволяют заниматься метапрограммированием во время компиляции. Но как и все, что достигается не предусмотренными для этого средствами, данное решение является очень неудобным и ограниченным.
ГВ>Удивительно, но именно шаблоны я и имел в виду.
Да? Иди прочти еще раз свои слова. Если ты говорил о шаблонах, то они вообще теряют смысл.
ГВ>>>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). Пуризм — это ещё одно ругательство, как и BASIC, если ты не в курсе. Есть только два критерия: "удобно написать удобную фишку X" и "иметь возможности для отступления в случае потерь производительности". VD>>Это как раз тот случай где отсутствие чистых и грамотных решений толкает на использование кривых.
ГВ> Скажем так, это квинтэссенция практических мотиваций.
Это э....ыы... жопа, если одним словмо.
VD>>Ты с книгами Александеску хорошо знаком?
ГВ>Наизусть не помню, конечно. А что?
Но знаком? А с метапрограммированием в Лисп или Немерле ты знаком?
Если знаком, то должен понимать, что это как небо и земля. В случае шаблонов С++ трудоемкость офигительная, сложность высокая, результат так себе и при этом все еще совсем плохо по ресурсам потребляемым компилятором. А в результате метапрограмма деже не может выдать сообщение об ошибке или обратиться к внешнему файлу. Ну, куда это годится?
VD>>Да, да, да. Зачем наука в программировании? Ты давно всем доказал, что программирование особая отрасль и мозг в ней не нужен. Главное трясти по сильнее. То ли дело автомобили. Вот там наука важна. Ведь на автомобилях ездеем мы сами, а софт используют какие-то ламеры.
ГВ>Да ну?! Вроде как я обычно доказываю прямо противоположное. Мозг как раз нужен и теоретическая подготовка — тоже. Так что, что-то ты перепутал.
Я перепутал? Ну, не знаю. Я тебя читал.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>Замыкать можно ещё и значения. Значения указателей — в том числе и т.д., и т.п. VD>Ты бы лучше не говорил о том в чем не разбираемый. А то такой бред несешь, что просто смешно. VD>Замыкать значения невозможно. Это просто глупость. Значения на то и значения чтобы копироваться. Суть замыканий как раз в том, чтобы иметь доступ к значениям видимым в лексической области видимости. При этом все переменные и поля которые попали в замыкание должны жить не меньше чем область в которой они объявлены и не меньше чем живет замыкание. Любой указатель должен быть верным до момента когда замыкание перестанет существовать.
Ты бы за логической связью последил. Если копирование — это не один из приёмов, который может использоваться для построения замыкания, то... То я прям, не знаю, даже.
VD>Это приводит к тому, что образуется граф взаимно-связанных объектов время жизни которых крайне сложно отследить. [...] Если исключить GC, я знаю только одну такую — подсчет ссылок.
Это всё понятно, и никто с этим не спорит. Равно как никто и не пытается объявить C++ "чистым ФЯ".
ГВ>>Вот это: "Такие как ollv". Если бы ты сказал "некоторые", я бы согласился. А так ты едва ли не прямо сомневаешься в квалификации ollv, что порицается правилами форума. VD>А я и не сомневаюсь. Он продемонстрировал свою квалификацию самым прямым образом. Прямо и неприкрыто показал, что кроме С++ ничего в жизни толком и не видел.
Оснований для такого утверждения нет. Мораль? Тебе это всё показалось.
ГВ>>Место ему там или нет — оставь решение этой задачи самим разработчикам сайтов. Полагаю, что их квалификации вполне достаточно для такого выбора. VD>А я полагаю, что такой выбор сам по себе говорит о квалификации, точнее вменяемости, таких разработчиков.
Я полагаю, что рассуждать о вменяемости совершенно не знакомых тебе людей, как минимум, самонадеянно.
ГВ>> Ты скажи, ты сам много сайтов на C++ написал, а потом переписал их на что-то ещё, чтобы уверенно утверждать, что C++ не даёт никаких преимуществ? VD>Я не идиот чтобы заниматься таким маразмом. На С++ я пописал не мало, так что имею полное моральное право судить о его возможностях и недостатках. Как говорится не надо быть курицей, чтобы иметь права рассуждать о вкусе яичницы.
О вкусах не спорят, как известно. Только не надо путать рассуждения о вкусах и выбор в рамках ограничений.
ГВ>>>>MS и IBM (как и все остальные) вольны поступать так, как им заблагорассудится. VD>>>Ага. И выбирают для сайтов Яву и дотнет. ГВ>>И что с того? Выбрали и выбрали. Как это должно сказываться на выборе, который делают совсем другие люди? VD>Никак, хотя и сказывается на практике. Это просто демонстрирует, что даже компании с слабо ограниченными ресурсами не выбирают С++ для не не тиражных серверных решений.
Некоторые компании. Ты же у всех со свечкой не стоял, верно? Кроме того, выводов из этих фактов можно сделать много и разных.
ГВ>>Отнюдь. Решающим фактором может оказаться всё, что угодно, вплоть до наличия под рукой подходящих библиотек и доступности программистов. А ещё фактором может оказаться, например, необходимость тащить .Net FW. VD>Изумительная логика. Согласен, что на практике именно ею и руководствуются очень многие, но она в корне порочна.
Она продиктована практикой, и ничего с этим не поделаешь. Я тоже недолюбливаю такие рассуждения, но иной раз деваться от них некуда.
VD>Вот представь себе, что речь идет о разработке новой марки автомобиля. Представь себе, что за разработку его берутся не инженеры специализирующиеся на автомабилях, а скажем ракетчики. Они кончено тоже знакомы с аэродинамикой, механикой, физикой, математикой и т.п. и потенциально могут сравиться с задачей. Мало того. В качестве инструментов они берут не заточенные под автомобили кады и т.п., а то на чем они проектировали вертолеты. Вместо двигателей внутреннего сгорания используют ГТД или вообще реактивный двигатель, вместо железа — алюминий и титан и так во всем. В результате автомобиль конечно у них скорее всего получится, но вместо года они потратят пять лет и вместо экономного и относительно недорого автомобиля у них получится монстр который никому не будет нужен на практике. VD>Маразматическая ситуация? Да, не несомненно! Но почему же такую же ситуацию в сфере разработки ПО ты считаешь само собой разумеющейся?
Действительно, ситуация неоднозначная. Из-за вагона логических ошибок в твоём рассуждении. Например, ты не учитываешь, что проектирование автомобиля и проектирование вертолёта выполняется в рамках определённых массогабаритных, прочностных и прочих технических и нетехнических ограничений, накладываемых на конечный продукт. Если вертолётчики спроектируют автомобиль, то так или иначе они будут вынуждены вписаться в ограничения, заданные для автомобиля — хоть с титаном, хоть с алюминием, хоть с пластилином. Какие CAD они будут использовать — дело десятое, хоть на счётах вычислять. Это только программисты могут считать, что конечные характеристики автомобиля решающим образом определяются используемым CAD.
VD>Если те кто пишет софт берутся за область где С++ не подходит должным образом, то они обязаны владеть альтернативными технологиями. В противном случае им просто не следует браться за выполнение этой работы. VD>А у нас получается, что людям в лом изучить другие языки, другие технологии, но они все равно берутся за разработку софта в любой отрасли и виде деятельности. VD>Слава Богу, что такого маразма все меньше и меньше. Но зачем же его защищать?
Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором. Ты, почему-то, додумываешь, что это является призывом использовать C++ где ни попадя, вопреки здравому смыслу.
ГВ>>Э... Не так. C++ допускает опасные операции. Но вовсе не требует. А ответственность везде в цене, это от языка не зависит. VD>Допускать уже достаточно. Но он не только допускает, но и провоцирует их. А зачастую не предоставляет других путей как небезопасные.
Это — проблема и ответственность самих "спровоцировавшихся". Подвержен провокациям — не зямай C++.
VD>К тому же чтобы создать относительно безопасные решения требуется весьма высокая квалификация и немалые силы на выработку стратегии и контроль ее соблюдения. Заметь я не говорю, что речь идет о инструменте в руках ламеров. Он и весьма квалифицированным программистам надевает гандикап.
Судя по всему, ты очень слабо представляешь себе, что именно является самыми трудными проблемами в формулровке и поддержке стратегии. Поверь на слово, вопросы "безопасности" и связанные с ними сложности — величина исчезающе малой трудоёмкости в сравнении с остальными. Эти самые "остальные" относятся к декомпозиции задачи и от языка реализации зависят в очень небольшой степени.
Собственно, поэтому действительно опытному и квалифицированному програмисту ни один язык никакого "гандикапа" на голову не наденет по определению. Просто такой програмист никогда не поставит в своём сознании язык програмирования на такое место, откуда голова будет доступна для надевания хоть горшков, хоть гандикапов.
VD>>>Есть такое умное высказывание (не помню чье) — человек не должен делать работу которую может сделать машина. А С++ заставляет человека делать работу которую можно возложить на машину. ГВ>>Не так. C++ позволяет человеку влезть в то, чем обычно занимается машина. VD>Нет. Он заставляет заниматься человека тем, что может контролировать машина. Он не предаставляет возможности не думать об упрвлении памятью даже если программист этого очень хочет. Он не предоставляет гарантий типобезопасности. Эти аспекты требуется контролировать вручную!
Прям, не язык, а монстр. (отсмеяшись) Знаешь, где самые страшные монстры? В воображении!
ГВ>>1. Ограничения на выбор допустимых абстракции есть у любого языка программирования. Так уж они, засранцы, устроены. VD>Действительно современные языки предоставляют выбор и довольно широкого круга вариантов. С++ же застрял в 80-ых. ООП и шаблоны. А далее голимый кривой С.
ООП, между прочим, несколько более молодая концепция, чем ФП.
ГВ>>2. Шаблоны широко используются в программировании на C++. Не понятно, ты считаешь это негативной чертой? Или — ограничителем в выборе абстракции? VD>Они средством затычкой с помощью которой люди пытаются обойти ограничения. Но результат неудовлетворительный. И только те, кто кроме С++ ничего не видел, считают это в порядке вещей.
А если без эпитетов и метафор? Если ты полагаешь шаблоны ограничивающим фактором, то уточни, пожалйста, каков характер накладываемых ограничений?
VD>>>Причем очень распростронено мнение, что производительность важнее качества. ГВ>>Нередко производительность является составляющей интегральной характеристики "качественно". VD>Я бы скорее сказал — не часто. Но дело даже не в этом. Решение проблем производительности только путем работы на низком уровне — это не вреный подход. Выигрыш от выбора более оптимальных алгоритмов куда более существеннен нежели от ковыряния в указателях.
Есть ещё abstraction penalty. AFAIK, Java и .Net на данный момент справляются с ним несколько хуже, чем C++. Возможно, что когда-нибудь ситуация изменится, я это вполне допускаю. Только не надо читать мне лекцию по JIT-компиляции и возможностях этого подхода, я их отлично представляю.
VD>Так что более верно было бы сказать, что иногда С++ позволяет решить проблемы производительности, особенно если в приложении есть много тупых вычислительных алгоритмов и нет путей их алгоритмической оптимизации.
Угу: в частности, если в приложении есть много тупых... Далее по тексту.
VD>>>Многие защитники С++ приводят в качестве примера 3D-игры. Мол, "почему их пишут на С++?". А стоило бы посмотреть на другой аспект. Почти все эти игры безбожно глючат. Играть в некоторые до выхода патчей просто невозможно. Большая часть ошибок в этих играх могла бы быть попросту не допущена, будь программа написана на более качественном языке. ГВ>>С чего ты это взял? VD>Что? Что написаны на С++? Из слов тех кто это приводит к качестве доказательства того, что все подряд надо на С++ писать.
Нет, вот это: "Большая часть ошибок в этих играх могла бы быть попросту не допущена"? Откуда такая уверенность?
ГВ>>Например, известно, что крутоглюкавый Сталкер (который без кучи патчей вылетает в самых неожиданных местах) написан с использованием Lua. VD>Ты откровенно говоря гонишь. На Луа там написаны только скрипты к сенкам да логика некоторая.
И что характерно — она глючит похлеще движка. Если прикинуть, то ИМХО, плотность глюков на единицу скриптового кода получается поболе, чем в движке.
ГВ>>Известна также душещипательная история о скоростной резке Сталкера перед выходом (часть карт порезана, часть выброшена и т.д.) Думается, что вторая причина посущественнее остальных будет. VD>Внимание, вопрос если бы в Сталкере логика игры писалась бы на С++, а не на скрипте, то код игра стала бы надежнее или наоборот?
Я думаю, что на этот вопрос нет ответа. Единственно, что будь игровая логика написана на C++, её было бы не так легко модифицировать моддерам.
ГВ>>О чём не заикаться? Я тебя не понимаю что-то. fold, в общем, до какой-то степени эмулируется accumulate+boost::bind, а у find_if — своё, вполне определённое назначение и она вполне применима к широкому набору типов. Шаблон же, однако. VD>Уродства получаемого в итоге стыдиться. Сравни. VD>Вот пример использования find_if:
[skip overquoting]
VD>И это простой случай без замыкания. С замыканием разница начинает расти намного сильнее.
Синтетика не показательная. Например, что касается C++-ного фрагмента, то он может быть и вот таким:
it = find_if (myvector.begin(), myvector.end(), _1 % 2 == 1);
Это с примитивными, в общем-то, бустовыми лямбдами. А то, что find_if не внесён в vector, так это хорошо есть и хорошо весьма.
ГВ>>Так... Тогда объясни, что ты считаешь "прямыми", а что "побочными" эффектами шаблонов? VD>Прямой эффект — это параметрически полиморфизм, т.е. то ради чего шаблоны были введены. А вот вычисления во время компиляции основанные на том факте, что раскрытие шаблонов идет итеративно и может быть остановлено человеком описавшим частный случай шаблона — это использование побочного эффекта.
Понятно. Хотя, наличие таких побочных эффектов естественно следует из логики разворачивания шаблонов.
VD>Автор языка не предусматривал подобного использования шаблонов.
Ну и что?
P.S.: В предыдущем постинге я тебя спросил:
Просто любопытно: из чего ты сделал вывод, что я считаю, что "мозг не нужен" и "главное — трясти"?
Вопрос остаётся в силе.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK>А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций? MK>А то страшно стало! Быстрее всё всё всё в main переношу... :user:
Пожалуйста, не поленился и специально нашел такой пример
Здравствуйте, criosray, Вы писали:
C>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
Да дело даже не в этом. COFF приводит пример частной задачи, которая к самому .Net мало имеет отношения.
Так что написано:
For example, the code generated by the Forms Designer for setting the location and size of a control uses two method calls for setting these properties, like this
Т.е. это проблема Forms Designer, а никак не .Net.
И если бы дизайнер генерил не очень удачный C++ код, к нему можно было бы предъявить точно такие же претензии.
Здравствуйте, VladD2, Вы писали:
VD>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов.
ой ли, ты часто передаёшь лямбды после выхода из scope? как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага). Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.
Здравствуйте, criosray, Вы писали:
ГВ>>Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
C>Это то о чем Вам говорил Влад. Лямбды С++ — неудобные недолямбды. Потому ими и не пользуются.
Дело не в удобстве, а в культуре программирования.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Умора, клиенты психиатров отправляют к терапевтам.
Во!
Теперь узнаю старого доброго ВладД2.
VD>Ладно, разговоры в подобном ключе меня не интересуют.
Симметрично.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, niellune, Вы писали:
N>Здравствуйте! Нужен ваш совет)) N>Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию? N>В каких областях сейчас применяется C++?
N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++ N>Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
N>У меня есть опыт работы на php, причем не только web, а еще что-то вроде создания системы документооборота) N>Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
Моё мнение C# не очень хорошее решение, если вы не собираетесь связать свою судьбу с виндовс на каком-то относительно непродолжительном участке времени. C++ поддерживается всеми платформами. Ждёт его судьба бейсика. Это моё виденье данной проблемы.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>>>В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC. ГВ>>>Величина этого оверхеда — вопрос с трудно предсказуемым ответом. G>>Тем не менее он есть. ГВ>Он везде есть — больше или меньше.
О как, а только пару страниц назад было утверждение что в С++ нет оверхедов.
G>>>>Не получится сделать в C++ сборщик мусора, сравнимый по быстродействию с .NETовским. ГВ>>>Ой, сомневаюсь. G>>Не сомневайся. Если бы можно было на С++ сделать хороший сборщик мусора, то его давно бы уже сделали.
ГВ>Дык, он как неуловимый Джо:
ГВ>
ГВ>- Что, никто написать не может?
ГВ>- Да кому он нужен?
Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен.
G>>>>В итоге пришли к тому же: С++, даже в новом стандарте, позволяет эффективно использовать только подмножество лямбд. ГВ>>>Угу, то есть тезис о неполноценности лямбд в C++ снимается повестки дня. Уже что-то. G>>Ничего не снимается. Лямбды и там и есть неполноценные. Возможность сымитировать полноценные лямбды эту ситуацию не меняют. ГВ>Понятно. Библиотечная философия C++ тебе претит. Ну что ж, на вкус и цвет...
Не в библиотеках вопрос, лексическое замыкание накакими библиотечными функциями не заменишь, там нудно по-другом управлять временем жизни объектов.
ГВ>>>А то, что там где-то что-то побыстрее, где-то что-то помедленнее — так на то они и разные языки: C++, C#, Java, Haskell... Чтобы где-то выигрывать по отношению друг к другу, где-то проигрывать. G>>Тут вопрос не только в скорости работы. Имитирование полноценных лямбд будет порождать громоздкий и\или ненадежный код.
ГВ>Понятно. Но эту сказку про C++ рассказывают с регулярностью, достойной лучшего применения, всё то время, пока я на нём программирую — все 14 лет. Тут, знаешь, что ни язык, так непременно его апологеты апеллируют к тому, что на C++ всё глюкаво, громоздко и ненадёжно. Так что, не ты первый, не ты последний.
Так действительно на С++ все глюкаво и ненадежно. А то что ьты 14 лет на нем пишешь чести тебе не делает.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>А Microsoft с Intel-ом и не знают, что они отсебятину несут. VD>>Можно ссылку на место где я могу купить компилятор от Microsoft реализующий черновик стандарта?
ГВ>Дык. Гугль тебя спасёт, ключевые слова "VC10 CTP download". Это действительно бета, как ты правильно заметил (вернее — CTP, я не знаю, как он соотносится с альфа/бета/RC по обычной классификации). Про интеловский компилятор спроси у CreatorCray.
Если бы я не знал тебя и твою любовь к демагогии, то подумал бы что ты или не умеешь читать, или торонулся рассудком. Я же кажется четко написал "ссылку на место где можно купить компилятор".
VD>>Если нет, то предлагаю вам всем прекратить нести пургу.
ГВ>Чья б корова...
Твоя, твоя. Заняться тебе не чем. Разводишь демагогию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Нет такой ссылки, потому что компилятор от MS ещё не продаётся. VD>>Значит и обсуждать не чего.
ГВ>Так и не обсуждай. Тебя кто-то заставляет?
Обсуждал, ты а теперь откровенно гонишь. Учись признавать свою неправоту.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно.
для интенсивных операций существует пулы/арены G>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении.
ну ето просто неправда
Х>>>>в случае с с++ лямбдами исполнено на 100%, G>>>На 200%, лямбд просто нету Есть только жалкое подобие. Х>>может ты найдёшь определение lambda в интернет и перестанешь нести ахинею? G>Ты прочитай 3 предыдущие страницы. Нормальные лямбды подразумевают лексические замыкания, которых нету и не будет в С++.
во-первых: лямбды не подразумевают замыкания, ето замыкания подразумевают лямбды.
во-вторых: лексическое замыкание есть, прочитай теперь ты 3 предыдущие страницы.
Х>>да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед. G>Не разводи демагогию, давай факты.
зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
Х>>>запомнил? G>>Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
ГВ>Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую)
Не надо такие умные слова говорить. Говори честно — копирование значения. Копирование лексическим замыканием не является.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Хвост, Вы писали:
Х>>>Здравствуйте, gandjustas, Вы писали:
G>>>>>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) Х>>>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает G>>>>20 тысяч векторных примитивов с прозрачностью? Х>>>круто, да? G>>Слабо верится. Х>т.е. тебе и в современные 3д игры слабо верится, да? а там ведь покруче будет.
В играх многое делается на видеокарте, кроме того всегда стараются рисовать поменьше. В ГУИ фреймворках общего назначения так сделать не получится.
C>Еще интересно было бы увидеть что-то вроде RhinoMocks — библиотеки для мокинга объектов (свойства, методы, события).
Нууу, просить генерировать код в рантайм не совсем корректно, хотя и для С++ таким макаром иногда поступают. И вообще, в С++ принятно тестировать в юнит-тестах сам код, а не бинарные сборки, что в свою очередь легко делается через инклюды и прочий развитый препроцессинг. В общем, подход к юнит-тестированию совсем другой и нет смысла тратить время на неприменимый и безбенифитный (для С++) способ юнит тестирования, предназначенный для совсем других условий.
ГВ>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
Рефлексия она и в африке рефлексия. Развитый подобный фреймворк под нейтив — это разве что COM и пляски вокруг typelib-ов и prog ID. ActiveX site — как раз своего рода "конфигурируемый" в рантайм IoC-контейнер, правда в ограниченном множестве интерфейсов.
Здравствуйте, vdimas, Вы писали:
C>>Еще интересно было бы увидеть что-то вроде RhinoMocks — библиотеки для мокинга объектов (свойства, методы, события).
V>Нууу, просить генерировать код в рантайм не совсем корректно, хотя и для С++ таким макаром иногда поступают. И вообще, в С++ принятно тестировать в юнит-тестах сам код, а не бинарные сборки,
Вы вообще понимаете о чем говорите? Что такое модульное тестирование? Что значит "тестировать код, а не сборки"? Это, простите, бред.
Модульное тестирование подразумевает: а) тестирование состояния объектов, б) тестирование операбельности объектов. Препроцессингом ничто из перечисленного протестировать не возможно.
V>что в свою очередь легко делается через инклюды и прочий развитый препроцессинг. В общем, подход к юнит-тестированию совсем другой и нет смысла тратить время на неприменимый и безбенифитный (для С++) способ юнит тестирования, предназначенный для совсем других условий.
Почему он вдруг стал безбенефитным? Чем С++ такой особенный? Модульное тестирование программ на С++ как минимум не менее полезное, чем модульное тестирование программ на С#, Java, Python, и т.д.
Если код покрыт тестами, то его гораздо проще рефакторить и модифицировать.
ГВ>>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
V>Рефлексия она и в африке рефлексия. Развитый подобный фреймворк под нейтив — это разве что COM и пляски вокруг typelib-ов и prog ID.
А COM тут при чем вообще?
V>ActiveX site — как раз своего рода "конфигурируемый" в рантайм IoC-контейнер, правда в ограниченном множестве интерфейсов.
Я очень надеюсь, что Вы пошутили...
Здравствуйте, criosray, Вы писали:
C>Вы вообще понимаете о чем говорите? Что такое модульное тестирование? Что значит "тестировать код, а не сборки"? Это, простите, бред. C>Модульное тестирование подразумевает: а) тестирование состояния объектов, б) тестирование операбельности объектов. Препроцессингом ничто из перечисленного протестировать не возможно.
Похоже, ты не понял основной посыл насчет тестирования исходников в С++ в противовес тому, что и как тестируется с помощью моков.
V>>что в свою очередь легко делается через инклюды и прочий развитый препроцессинг. В общем, подход к юнит-тестированию совсем другой и нет смысла тратить время на неприменимый и безбенифитный (для С++) способ юнит тестирования, предназначенный для совсем других условий.
C>Почему он вдруг стал безбенефитным? Чем С++ такой особенный?
Моковский подход и не был для С++ никогда бенефитным. Вложения труда не окупятся, поэтому там немного по-другому.
C>Модульное тестирование программ на С++ как минимум не менее полезное, чем модульное тестирование программ на С#, Java, Python, и т.д.
А это ты кому и о чем? Просто лозунги?
ГВ>>>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
V>>Рефлексия она и в африке рефлексия. Развитый подобный фреймворк под нейтив — это разве что COM и пляски вокруг typelib-ов и prog ID. C>А COM тут при чем вообще?
При том, что популярные IoC контейнеры для .Net до компиляции в глаза не видели оперируемые интерфейсы и конструкторы реализующих их классов. Такие шутки делаются лишь через метаинформацию, пример которой для нейтива есть typelib из COM, так же как и ср-ва для построения проксей для OLE-совместимых сигнатур.
V>>ActiveX site — как раз своего рода "конфигурируемый" в рантайм IoC-контейнер, правда в ограниченном множестве интерфейсов. C>Я очень надеюсь, что Вы пошутили...
Здравствуйте, Pepel, Вы писали:
P> весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок
Что-то слишком много чести им в последнее время... Хотя до сих пор наиболее популярные во всем мире моки — это ручные моки, они же заглушки и этому способу тестирования учат у нас вроде на 3-м курсе.
Просто надо четко понимать, что автоматически-генерённые моки — это костыль по сути, для ситуаций чудесного дизайна, когда одно гвоздями прибито к другому. А так, там где можно обойтись в юнит-тестах классичесскими ассертами — это и синтаксис нагляднее, и проще поддерживать.
У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась. Так что лично мне они как стразы на ж-пе, модно, но не практично.
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, MxKazan, Вы писали: MK>> Я только сразу оговорюсь, что сам на Mono не разрабатываю, т.к. мы пишем только под Windows. AB>С этого было надо начинать... и этим надо было заканчивать (см. мое предыдущее
сообщение).
Да брось. То, что в разделе КСВ форума RSDN нет людей, которые разрабатывают на Mono, совершенно не означает, что этот проект какой-то не юзабельный и его нельзя приводить в качестве аргументов. Тебе были даны все нужные ссылки. В форуме Работа встречалось обсуждение Mono и вакансии даже были. Я вот, например, и на Compact Framework не пишу, так что же, если меня спросят "что есть у .Net для мобильников", я должен буду отвечать "ничего"?
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
G>>Пример не приведу, ибо очень большо получится. Но основная суть в том, что в .NET можно генерировать код в рантайме.
IID>Неужели кратко продемонстрировать скоростные возможности языка никак не получается ?
Кратко — это полюбому синтетика. В таких тестах пожно взять ассемблерный выхлоп любого кода, заоптимизировть под конкретный процессор и порвать кого угодно в какашки.
Но в real wolrd такой сценарий не работает даже сотых долях процентов случаев.
IID>Если уж сильно хочется генерировать код в рантайме и чтобы не скатываться в сторону "я сейчас наворочу динамическую кодогенерацию, её в С++ нет, и никто со мной связываться не захочет" можно поступить очень просто: берём (фиксируем) один любой, наперёд заданный, результат этой самой генерации, и меряем скорость.
Не надо жопой вилять. Как раз динамическая кодогенерация позволяет написать программу так чтобы она работала в общем случае быстрее нативной.
Если взять один конкретный случай (набор входных данных), то смотри выше про ассемблер.
ЗЫ. Я уже писал в этой теме тест, который меряет выделение памяти стандартным аллокатором. .NET выигрывает.
Здравствуйте, VladD2, Вы писали:
FR>>Да ладно меряли уже не раз, даже если писать шаблоный qsort один в один с сишным плюсовый все-равно выигрывает, за счет агрессивного инлайнинга.
VD>Это чушь хотя бы потому, что компиляторы С и С++ — это в большинстве случаев одни и те же компиляторы. По крайней мере лидеры MS и Intel поступают именно так.
Угу только в Си приходится пользоватся как параметром указателем на функцию, который умеют инлайнить только последние компиляторы и то не всегда, а в C++ параметр шаблона, который инлайнил даже VC 6.
Ну и частичную специализацию тоже не стоит сбрасывать со счетов.
VD>>>Кстати, на пример C vs. C++ можно можно спроецировать все сказанное о C++ vs. C#. Ведь на С всегда можно написать код не медленнее чем на С++. Проблема только в трудоемкости.
FR>>Можно, и кстати не мало пишут, но опять таки разница между C++ и Си тоже не так велика, хотя и больше чем между С++ и шарпом.
VD>Опять вопрос оценок. Я считаю, что ка раз разница примерно сравнима. В одном случае нам дают ООП и обобщенное программирование, в другом компонентность, автоматическое управление памяти, встроенные в язык запросы, полноценные лямбды.
Ну шаблоны многое компенсируют или хотя бы сглаживают.
VD>В прочем, важен сам факт, что ты согласился по существу и оспариваешь только коэффициенты влияния.
Здравствуйте, criosray, Вы писали:
c> Влад, я пришел к выводу, что спор с господами типа Антона Батенева, вдимаса, Геннадия Васильева и т.д. — местных аппологетов С++, это пустая трата времени и сил.
Мне, конечно, приятно, что меня причисляют к апологетам С++, хотя я к таковым себя не отношу, однако...
c> К тому же спорят-то они о вкусе устриц...
... вот кто бы это говорил из заводящих разговор про моно.
Здравствуйте, VladD2, Вы писали:
VD> Какой удар ниже какого пояса?
Судя по хамско-истеричному тону твоего сообщения и отсутсвию комментариев по очевидным тезисам, прилетело тебе кучно.
VD> Ты слил спор и теперь бредишь пытаясь перевести разговор на что-то не относящееся к делу.
Ты спрашивал, как показать мастер-класс — я тебе ответил. При чем, подобрал задачу как раз под тебя. Или я был слишком хорошего мнения?
VD> При этом даже в теме на которую ты пытаешься перескочить ты не понимаешь ровным счетом ничего.
Ты очень хочешь, но стесняешься мне поведать историю про rocket science сайта RSDN типа "каталог статей" + "форум" с суточным количеством хитов в районе 100-200 тыс и временем жизни кэша в районе минуты? Чтож, удиви меня.
VD> В общем, сплошное ламерство и не умелая демагогия с твоей стороны. Постыдился бы.
Мне-то почему за то, к чему я не имею никакого отношения, должно быть стыдно?
MK>>>- Изначально ты написал: "И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ". MK>>>- На что получил ответ, что рантайм по прежнему 2.0, что он не менялся со времен второго дотНета, ну нету CLR 3.0 и всё. V>>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например? MK>Видимо, потому что ты говорил о JIT-е, который таки является частью именно CLR. Ты картинку то поглядел? Мы за последнее время привыкли к незнанию предмета со стороны *упорно голосующих*, так что подобное непонимание не удивительно.
Не тратье время на него. Человек привселюдно опозорился, теперь пытается "съехать", будучи не в состоянии признать свою неправоту. Классический юношеский максимализм на лицо...
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, CreatorCray, Вы писали:
CC>CPUID: Intel(R) Pentium(R) D CPU 2.66GHz
А вот на той же машине скорость аллокации через ThreadPoolAlloc, склепаный "по-быстрому, на коленке" интереса ради для проверки теории Тормозящей Синхронизации
Суть: отдельный пул на каждый поток с возможностью deferred delete из другого потока.
VS 2003 + ICC 11, C++ : 0 или 16 (видимо разрешения GetTickCount не хватает)
Заменил на вывод времени в секундах, замеренное через RDTSC
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>А подробности будут? E>>>Я всё равно не верю, что, Ada и С++ имеют одинаковый показатель. G>>Можете не верить. E>Дык данные-то есть? Методика, что и как измеряли? На каких примерах? Какая получилась статистика?
E>>>Кроме того, на чём же тогда статистика для С# собрана, если только КРУПНЫЕ проекты идут в счёт? На сингулярити, что ли? G>>На C# очень много крупных проектов, с миллионами строк кода. E>"Очень много" -- это наверное больше 10? Не затруднит привести 5 C# проектов, которые на миллион строк тянут? E>Кстати, миллион строк кода -- это не очень крупный проект... E>Крупный проект, это от 100-300 человеколет, например...
Могу привести пример ediEnterprise ЕРП система для логистики(подробностей не знаю). Штат разработчиков — около 90 человек, полностью написано на C#, тянет на 300-400 человеколет =)
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Может вот это (документация к ICC) поможет:
Lambda Function Object
The compiler creates an anonymous function object upon evaluating a lambda expression.
This function object, created by a lambda expression, may live longer than the block in which it is created. You must ensure that it does not use variables that were destroyed before the function object is used.
The following example shows how a function object created by a lambda expression can outlive the function that creates it.
struct Base {
virtual bool test(int x) = 0;
};
template<typename F>
struct Derived: Base {
F f;
bool test(int x) {return f(x);}
Derived(F f_) : f(f_) {}
};
template<typename F>
Base* MakeDerived( F f ) {
return new Derived<F>(f);
}
Base* Foo( int k ) {
return MakeDerived( [k](int x) {return x%k==3;} );
}
bool Bar() {
Base* b = Foo(3);
return b->test(6);
}
In the above example, Bar invokes Foo, which copies the function object generated by a lambda expression into an instance of template class Derived. The lambda expression refers to a local variable k. Although the code destroys k before using the copied function object, the code is safe because k was captured by copy.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Mamut, Вы писали:
g>> В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
M>Кстати, а есть таки примеры, где это так? Вроде, где-то в КСВ приводили примеры, я сейчас не найду
Вот здесь на графиках видны примеры, где C++ уступает C#.
В исходниках не ковырялся
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Если программист недостаточной квалификации, то само использование unmanaged становится большой проблемой (видел такое на Delphi), не говоря уже о С++ с его примудростями. CC>Managed от идиотов все равно не спасает.
А кто-то говорил что спасает?
А самое главное что вообще ничего не спасает от идиотов-менеджеров, которые думают что managed спасает от идиотов-программистов.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Моки и заглушки — разные вещи, использующиеся в разных сценариях тестирования. V>Садись, два.
Я спорить не буду, если мосье интересно в чем разница, он найдет где почитать.
S>>Разве речь о Вас в совокупности с тупым диспетчером сообщений?
V>Так не меня спросил?
Я спросил "А моки вообще не в почете?" в ответе на пост где Вы (не против если на ты?) отвечали как бы за всех:
Таким образом, в подавляющем большинстве случаев на С++ в юнит-тестах тестируется...
А ответ на мой вопрос перескочил на частности вроде
У нас в последней системе в центре тупой диспетчер сообщений
и про стразы, что цитировать я не буду.
V>и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась.
По поводу этого — я как бы не понял, как отсутствие автоматизированного инструмента ставится в преимущество.
На дотнете никто совать генераторы моков во все щели не заставляет. Нужен рукописный мок — пожалуйста. Но при наличии средств генерации моков, надобность в ручном мокировании практически отпала.
Следствием использования мокогенов является значительное сокращение времени на рефакторинг.
Да, кстати... рефакторинг тоже предпочитаете ручной, а не автоматические костыли?
Что касается теста с заглушкой с логикой произвольной сложности, которая не снилась — то это не предмет гордости.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, criosray, Вы писали:
C>>Так вот, ликбез: мокинг выполняется с целью изолировать тестируемый объект от внешних зависимостей.
ГВ>Ух ты! А я-то думал, что мокинг нужен для отслеживания последовательности внешних вызовов.
+1. Изоляция здесь в качестве средства. Но она сама-по себе хороша, потому изоляцию, достигнутую в целях обеспечения возможности тестирования возводят в бенефиты.
V>>>Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. C>>Элементарно средствами RhinoMocks.
ГВ>И неужто будет проще, чем аналогичная заглушка? Это если учесть, то заглушка реализуется в естественном синтаксисе, а мок — перехватом вызовов. Второе будет почти гарантированно сложнее.
Здесь vdimas говорит о FAKE-двойниках. Только они обладают собственным поведением, и эта категория двойников ну никак не генерится мокогенами. Но никто их не запрещает использовать под дотнетом рукописные Fake-и.
Здесь же мы обсуждаем именно мокогены — фреймворки, генерящие двойники без логики, а именно dummy, stub-ы, spy, mock-и. Точнее генерят они как правило стабы и моки, которые можно использовать как dummy и spy. И даже как Fake, но для этого нужна некоторая акробатика:
Fake двойника можно надстроить над генерированным моком, но это оправдано только в том случае, когда объем кода, с помощью которого можно прикрутить логику fake-а к моку не превышает объем рукописного fake-а (Для средних и больших интерфейсов — почти всегда оправдан). Потом, логику fake-а можно поместить в TestFixture, а сгенерированный мок науськать на ту логику. Не обязательно все пихать в тело теста в синтаксисе накачивания двойника констрейнтами .
В чем прелесть мока, сгенерированного мокогеном по сравнению с рукописным? Рассказываю. В отличии от рукописного мока, сгенерированный не требуется писать руками; сгенерированный мок реализует все что надо для отслеживания фактов вызовов, их порядков, и их параметров.
Представим простой пример кода, работающего с интерфейсом IList<int>. Допустим, код работает только со свойством Count и индексатором (а так часто и бывает). Для создания рукописного мока требуется реализовать порядка 10 методов просто. Для каждого теста своих.
Да, можем создать ListMockBase и переопределять нужные методы для каждого теста. Теперь представим, что интерфейс меняется в процессе разработки (а так часто быывает с интерфейсами, не определенными в стандартной библиотеке). Потребуется переписывать все моки и/или карежить базовый рукописный мок. Мокогенератор решает эти проблемы + наполняет моки функциональностью для тестирования (уже говорил).
V>>>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое.
Да, фэйки со сложной логикой через моки не пишут. А в моках логики быть не должно.
C>>Выглядит преотлично. На много лучше, чем то, что у вас есть (а точнее нет) в unmanaged C++. lambda выражения и fluent interface дают прекрасную читабельность.
C>>
ГВ>Можно подумать, что в документации приводят сложные нечитабельные примеры. Наверное, там ещё должны были написать о нерешённых проблемах, в том числе — фундаментальных.
Я бы не согласился, что это выглядит отлично. Но создавать для проверки каждого параметра отдельное утверждение с логикой — кошмар.
Здравствуйте, gandjustas, Вы писали:
O>>>>т.к. хочется сделать красиво, а не можется G>>>Красиво это как? Нафигачить шаблоков? G>>>И как на плюсах сделать красиво IoC-контейнер? ГВ>>Какой именно? В смысле — под какое использование? G>Например как MSовский Unity.
OK, теперь давай выясним, что такое "красиво". Желательный интерфейс набросаешь кратенько?
ГВ>>Значит, если отсутствующую фичу реализовали средствами языка — это, типа, недостаток языка. Ясен пень — язык будет плох до тех пор, пока в него не будет прямо включено всё-всё известное на данный момент во всех доступных комбинациях. А то не ровён час — библиотеку писать придётся. Логика жжот напалмом! Сила слова, да. G>C# развивающийся язык, за 5 лет в него включили столько фич, сколько С++ не снилось за всю историю существования. И при этом C# не превратился в помойку.
И как это опровергает сказанное мной? Что если фича реализована средствами языка — это не недостаток самого языка?
G>В С++ развивать языковые средства можно, но очень осторожно, новый стандарт это показывает.
ИМХО, новый стандарт показывает ещё и вполне традиционный подход: зачем менять язык, если свойства некой фичи можно реализовать имеющимися средствами? Собственно, это много раз сказано в D&E.
G>Кстати, когда очередной раз планируется его принятие?
Шут их знает. Не то в этом году, не то в следующем.
ГВ>>Какая ещё дилемма? C++ плохо интеропится с C++-ными либами при несогласованном ABI. Проблема и понятна, и решена в большей или меньшей степени. Через старый добрый C-интерфейс он прекрасно связывается с чем угодно. G>Угу, и вся "мощь абстракций" упрется в вызовы GetSomeHandle в итоге. Потрясающий язык.
Почему? Компоновку вызовов GetSomeHandle в классы никто не отменяет.
ГВ>>Кстати, а две виртуальных машины .Net (в смысле — два активных экземпляра .Net FW) разных версий свяжутся друг с другом "естественным" порядком? Или тоже с бубном и интеропом поплясать надо? G>Сейчас два СДК разных версий не уживаются в одном процессе, то есть нельзя запустить сборку с FW1.1 в процессе FW2.0, но такое очень редко случается. Разные версии FW хорошо совместимы по исходному коду и пересобрать под второй фреймворк (и 3.0 и 3.5) не представляет проблем. G>Следующая версия CLR будет нормально работать в одном процессе с предыдущими. ГВ>>А .Net с Java естественно стыкуются? G>только интероп через C или средства межпроцессного взаимодействия.
Вопросы были риторическими. Иными словами, на самом деле проблем с совместимостью и интероперабельностью хватает у всех, так что выпячивать аналогичные недостатки C++ как некие особенные тут нет никакого смысла.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
S>Дело не в том как написано и что тестируется и даже не в конкретном экспериментаторе (который думает что разница в контроле типов в рантайме), а в интерпретации результата. S>Победил C# — недоумение S>Победил С++ — значит C# — тормоз
Не, ну все правильно. Победил C# значит надо разбираться где в C++ коде косяк :)
Здравствуйте, VladD2, Вы писали:
VD>Это махровое ламерство. Собственно данная беседа для меня потеряла всяческий интерес.
Для меня эта беседа потеряла интерес когда я покрутил приложение, которое (по словам одного из обвинителей меня в ламерстве) якобы летает. Оказалось, что мало того, что оно тормозит, так еще и память утекает, причем со свистом — так, что средней C++-ной программе надо постараться такую утечку организовать. В общем, гладко было на бумаге, да забыли про овраги — практика пока теорию не подтверждает. Лепите уважаемые свои лямбды дальше :)
Вообще, все это я могу объяснить только профессиональной абберацией у дот-нетчиков, которые настолько привыкли, что все тормозит, что просто перестают тормоза эти замечать. На данный эффект в будущем буду делать поправку, а может вообще спорить на эти темы не буду — бессмысленно :)
Хм. Уж, по-моему, если у кого резьбу и срывает, то это у хулителей C++. Тебе цитаты привести или сам найдёшь? И вообще говоря, называть рекомендации Microsoft "какашками" — это сильно, да. Учту, что ссылка на MSDN может быть приравнена к хулению.
C>Вроде никто не утверждал, что управляемые языки есть серебрянной пулей, но они дают разумный компромис и с учетом того, что компьютерное время все более и более дешево в сравнении с человеко-часами, затрачиваемыми на разработку, будущее — однозначно за управляемыми языками.
Отлично, очень рад. Кто-то утверждал обратное (обратное "разумному компромиссу", а не "будущему за...", разумеется)?
C>Более того, я уверен, что нам предстоит еще увидеть полностью управляемые ОС типа Singularity.
Ну и отлично ещё раз, возьми с полки пирожок. Думаешь, я собираюсь спорить с твоей уверенностью?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
ГВ>>Напротив. Это как раз полное классическое замыкание с некоторой спецификой, свойственной C++ (явное разделение ссылок и значений, const/mutable, далее по тексту). То, что лямбда не навязывает обязательной модификации жизненного цикла контекста — есть хорошо, и хорошо весьма.
S>Срок жизни такого замыкания ограничен блоком, в котором объявлена лямбда. А значит за пределами этого блока при обращении к лямбде ждет UB.
С передачей переменных (собственно — замыканием) дело обстоит точно так же, как и с передачей фактических параметров в функции, возвратом значений, формированием объектов и т.п. То есть можно, например, создать объект, один из членов которого будет ссылаться на локальную переменную:
class A {
A(int *p) : p_(p){}
int *p_;
};
A foo() {
int a;
return A(&a);
}
Но если так сделать, то ты сам себе недобрый Буратин. Аналогичное ограничение с лямбдами.
S>Т.е. лямбду можно передать аргументом, но вернуть в качестве результата ни лямбду, ни что-то ее использующее нельзя.
Возвращать лямбду как функцию, судя по всему, тоже можно. Вот фрагменты из примеров, которые приведены по той ссылке, что я давал:
function<void (int)> g = [](int n) { cout << n * n * n << " "; };
vector<int> a;
vector<int> b;
// ...auto prime = [](const int n) -> bool {
if (n < 2) {
return false;
}
for (int i = 2; i <= n / i; ++i) {
if (n % i == 0) {
return false;
}
}
return true;
};
keep_if(a, prime);
keep_if(b, prime);
Вполне себе функции со вполне себе распознаваемой сигнатурой.
S>Как можно говорить о классическом замыкании то что работает как замыкание только в одну сторону?
ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)?
пул потоков обычно нативный, причём здесь С++? зелёные треды очень хороши для серверов, ага))) хип за O(1) ? в С++ можно аллоцировать память в хипе вообще один раз и на всю жизнь, и обеспечить свой микроменеджмент, при етом рефакторинг кода сведётся фактически к find/replace.
Х>>ух-хаха, я вообще не использую shared_ptr, представляешь? удивительно, да? G>И что же ты используешь?
для шареных объектов? ты знаешь, если грамотно реализовывать софт, и продумывать время жизни, то оказывается и не так уж много мест где одним и тем же объектом владеют (именно владеют) сразу несколько других, в подавляющем большинстве случаев есть какой-то холдер объектов, который раздаёт объекты другим, причём время жизни етих других много меньше времени жизни холдера. Всё ето потому что shared_ptr ето недетерминизм, т.е. время жизни объекта не определено, нельзя взглянуть на код и сказать — вот в етом месте объект мёртв. Ето плохо. Довольно редко но всё же такие ситуации возникают, тогда можно взять shared_ptr или лично я использую обёртку вида intrusive_ptr над ручным вызовом mySubsystem->release(object). Но есчё раз — ети ситуации очень редки. 99.9% объектов в хипе у меня живёт в std контейнерах, auto_ptr'ах, пулах и аренах. Шарятся множество объектов разных типов, но вот шарятся с семантикой владения пара-тройка, и то ето не необходимость, а скорее кривость.
G>>>А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed. Х>>есть статистика, что на десктопах пользователей подавляющее большинство приложений — unmanaged, ето на мой взгляд самая лучшая статистика. G>Эта статистика очень слабо связана с техническими аспектами. Обсуждали уже сотню раз.
конечно, ты вот наверное не застал времена былинные, а вот я тебе расскажу, в году едак в 96-м, когда вышла жава, С++ хоронили все кому не лень, в 98-м, когда вышла студия с J++, миллионы мух кинулись на жаву, "С++ устарел, на дворе Pentium II с 32 мб, а жаве и 4 мб с головой, и не надо думать об утечках памяти, тысячах реализаций строк, системной работе с потоками, с гуём, всё межплатформенно, блаблабла.... рай на земле... етц", был и свой сильверлайт, только назывался java applet, так вот, жаве уже второй десяток давно пошёл, а на десктопах её всё как-то не особо, и жаваапплетами интернет не полон, а десктоп полон нативными С++ приложениями, а интернет нативным С++ флешем, хотя вот жава она ведь по-твоему намного лучше с++, верно? задумайся почему всё ето так, пойми и осознай, что производительность — ето ресурс, и будет им во веки веков, и процессор, который быстрее в два раза другого, стоит в 3 раза дороже, и юзер выберет программу которая может выполнять три функции параллельно а не две.
Здравствуйте, gandjustas, Вы писали:
G>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно.
Ты пожалуйста ссылку дай на стандарт С++, где написано что именно так работает "стандартный аллокатор С++".
G>Не разводи демагогию, давай факты.
Симметрично!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, VladD2, Вы писали:
ГВ>>Дык. Наследия нет, а наблюдения очевидцев — есть (см. Э. Ховёнен, Й. Сеппянен, c, М.: 1986 — почему-то к этим славным финнам у меня доверия поболе, чем к даже к Грэхему). Это лишний раз доказывает, что интерпретация "единственно правильного поведения" замыкания сильно зависит от.
VD>Ты в очередной раз сморозил глупость и пытаешься выйти сухим из воды. Не выйдет.
Узнаю старого доброго VladD2!
VD>Пойми, когда ты ошибившись начинаешь изворачиваться и молоть черти что пытаясь сделать серьезную мину при плохой игре, ты только больше себя дескридитируешь.
Изволь. Вот цитата из вышеупомянутой книги (т. 1, с. 261-262):
_(setq y 10)
10
_(setq s (function (lambda (x) (+ x y)))
(LEXICAL-CLOSURE ...)
Здесь переменной S присваивается в качестве значения замыкание, в котором переменная y свободна. Значение переменной y сохраняется в замыкании, и поэтому возможны более поздние присваивания на это значение не повлияют. Теперь замыкание можно использовать как функциональный аргумент вместо имени функции или лямбда-выражения. Его можно, например, вызвать с помощью формы FUNCALL:
_(funcall s 2) ; в замыкании y = 10
12
_(setq y 100)
100
_(funcall s 2) ; значения связей в
12 ; замыкании сохраняются
Обращаю твоё внимание, что этот пример не повторяется один-в-один на Allegro CL 8.1 — второй вызов даст 102.
Ещё одна цитата из того же, первого тома, но с.15-16:
Основой изложения нами выбран диалект Коммон Лисп, ставший "де-факто" промышленным стандартом языка Лисп. В книге представлены все важнейшие языковые формы и свойства конструкций Коммон Лиспа, а также типы функций и данных.
Лексика и транслитерации — как в оригинале.
VD>Common Lisp, которому ты кого-то тут отсылал, во-первых, не может иметь черти какой давности, так как появился относительно недавно, а во-вторых он изначально был весьма строгой спецификацией с самого начала содержащей определение замыканий в том виде который есть и сейчас.
Может быть. Языков без спецификаций не бывает. Факт остаётся фактом — стандарт ANSI Common Lisp принят в 1994, тогда как диалект под названием Common Lisp уже существовал на момент выхода в свет финского оригинала "Мира Лиспа" — где-то 85-86 гг. Как видишь, в случае Lisp комитет тоже не особо торопился.
VD>>>CL — это стандарт вышедший таким каким он есть. ГВ>>Диалект под названием "Common Lisp" существовал задолго до принятия стандарта ANSI. VD>Ты очередной раз бредишь. CL был создан с единственной целью — стандартизовать Лисп.
Разве это отменяет факт существования диалекта до того, как был принят стандарт?
ГВ>>ИМХО, очень даже имело смысл делать такие специфические замыкания. Напоминаю об "иммутабельной природе" функционального программирования. VD>Твое ИМХО мало кого волнует. Попробуй подтвердить его ссылками. VD>И кончай изворачиваться. Все твои попытки сделать вид, что ты не говорил глупость делают эту глупость только более четко видной.
VD>CL язык настолько же функциональный, как и императивный. Но замыкания в нем полноценные, в отличии от недоязыков авторы которых думают исключительно о производительности.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Не совсем так. Дело в том, что GC для C++ не должен решать задачи управления абсолютно всеми объектами и никто ничего такого и не предлагает. Но для каких-то отдельных моментов он вполне может оказаться приемлемым решением, лучшим, чем reference counting. Ключевое слово: "какие-то отдельные моменты".
Пока в С++ не будет введено понятие "управляемого GC указателя/ссылки" ничего путного в С++ сделать не удастся. Только не строгий GC который крайне не практичен.
Проблема проста до банальности. С++ спроектирован в расчете на то, что адреса в указателях неизменны. А качественный GC предполагает, что как раз таки объекты можно перемещать, а значит их адреса изменятся. В этих условиях GC должен иметь возможность определить в каких ячейках памяти лежат адреса управляемых GC объектов, а в каких просто данные (возможно совпадающие по значению с адресами). GC Явы и дотнета спроектированы в расчете на использование метаданных генерируемых компиляторами и определенные ограничения в языках. Таких ограничений в С++ нет. Посему реализация эффективного GC для него невозможна.
Пример доработки С++ — это C++/CLI и Menaged C++. Там были введены специальные типы указателей которые описываются в метаданных и контролируются рантаймом. По другому никак.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Erop
VD>>утиная типизация. E>А это что обозначает?
Если что-то крякает как утка — это можно зажарить, даже если это был дядя вася с манком.
Гуглить duck typing.
Если тупо на пальцах и неправда — то это динамическое приведение типов по совпадению имён/сигнатур членов класса.
Здравствуйте, shrecher, Вы писали:
S>В контекте этого топика, как раз C++ стандарт сделан очень удачно и существует без изменений.
Ага, конечно. Особенно удачно сделаны шаблоны (привет > >)и отсутствие вывода типов.
Также очень удачно сделано delete и delete [].
Кроме того стандарт С++ полностью никто не поддерживает, наверное потому что очень удачный этот стандарт.
Здравствуйте, StandAlone, Вы писали:
NBN>>Я не понял, ты что думаешь что в С++ нет GC? SA>Да в общем-то видел я GC++. У Элджера. Алгоритм Бейкера, итд. SA>Но на демона он, эта, не тянет. То есть, может и взлетит, но низэнько, низэнько
Да он реально не очень нужен при соблюдении некоторых правил.
NBN>>Мы тут вроде обсуждаем С++ и C# А эта портянка написана индусом на мракобесном С. SA>Знал бы ты, кто этот индус и откуда я это скопипастил.. SA>Кстати, не С. Там есть шаблон, да не один!
Тем не менее за такой стиль нужно сразу же гнать, а лучше просто не брать на работу.
NBN>>Как тут уже верно замечали — выбор языка определяется задачами. Я вот уже пару раз изучал шарп — но так и не нашёл куда его применить в своих задачах Реально смог применить только один раз — для прототипа. SA>А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился.
Игры, ембеддед, миддлеваре, шаровары. Ну и всё что с ними плотно пересекается — например сильно кросплатформенные программы требующие высокого качества исполнения.
Кроме того — части серверных решений требующие перформанса.
Здравствуйте, alsemm, Вы писали:
G>>Теперь о GC G>>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю A>Это, если память есть свободная.
Это всегда так. память перед инкрементом свободная.
G>>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна. A>Конечно потокобезопасно, еще бы. Только потокобезопасность — не бесплатная.
Любая потокобезопасноть небесплатная, но пока быстрее intelokcedAdd не существует.
G>>9)такое распределение памяти увелиичивает cache-locality G>>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении G>>11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора. G>>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить. A>Реальный недостаток GC — это его непредсказуемость. Эта сущность не управлется из клиентского кода никак.
Управляется: есть классы GC и GCSettings. только практика показывает что чем больше лезешь в ручное управление GC, тем хуже все работает.
A>Она может проснуться когда посчитает нужным.
Он работает по строгому алгоритму, если вы не будете писать код, который завтавляет срабатывать GC очень часто, то все будет хорошо.
A>Если бы GC давал равномерную нагрузку на CPU, то никто бы от него не плевался.
Ага, его бы просто не использовали.
Сейчас GC такой что при правльном использовании можно добиться высокого быстродействия, выше чем со всеми стандартными аллокаторами для unmanaged языков, причем без каких-либо трудозатрат. А при неправльном использовании можно просадить производительность в разы.
A>У идеального GC не должно быть "всплесков" и "провалов" активности, он должен просыпаться через фиксированные промежутки времени и отрабатывать каждый раз фиксированный квант времени, а не "залипать" разгребая образовавшиеся завалы.
Странные у вас представления о CG. Кстати описанный вами GC вполне можно сделать на C++, почему до сих пор не применяют?
G>>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь A>Это все ужимки и бег на месте, навроде java.lang.System.gc(), который ничего не гарантирует.
Ну тогда единственный правльный путь — писать на ассемблере и выделять память ручками.
A>К сожалению, имидж управляемых сред был сильно подпорчен первыми версиями Java. Так что вы тут хоть 1000 аргументов в пользу C# приведите, стереотипы забороть очень тяжело.
Меня стериотипы не итересуют уже давно. Я тут факты привел.
A>Еще одна проблема C# — низкий порого вхождения для новичков. Собственно это не проблема — это вроде как его преимущество, теоретически.
Да и практически. Формаклепание и написание говнокода будет востребовано еще очень долго.
Причем чем дешевле обходится написание говнокода, тем более востребованно.
Для критических по производительности или потреблению памяти задач надо еще и головой думать.
A>На C++ писать надо аккуратно, чтобы хотя бы как-то работало. В управляемой среде писать дерьмовый код проще — утечки памяти (не все знают что такое WeakReference и зачем они нужны) маскируются мусоросборщиком, никих тебе AV и прочих мерзостей которые заканчиваются crash dump.
+1
E> M>Известно, что количество ошибок на 100 строчек кода в среднем одинаково, вне зависимости от языка программирования. Вывод — надо писать на языке программирования, который помогает мысли выражать более коротко и ясно
E> Откуда это известно-то? Я в это не верю, например!
Надеюсь кто-то найдет ссылку и скинет. Проводила иследования то ли Моторолла, то ли Эрикссон.
Здравствуйте, Хвост, Вы писали:
Х>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода?
Легко. Эти структуры размещаются не на стеке, а в полях класса, который и лямбду оборачивает.
Здравствуйте, Хвост, Вы писали:
Х>ну ещё раз, их либо пересчитывать в псевдо-екранные нужно при каждом сдвиге/масштабировании карты (ето если у нас есть псевдоекранные координаты только видимой области) либо пересчитать все координаты (т.е. и те что вне зоны видимости) во внеекранные заранее, тогда можно пользовать аксселлерированые преобразования, но ето как я уже писал шило на мыло.
Еще раз. Если мы в "плоском" режиме, не проецируя геометрию на шарик, либо проецируя на шарик текстуру, то псевдо-экранные координаты считаются один раз. Сдвиг и масштабирование не потребует полного пересчета, т.к. позволит домножить на матрицу, что можно отдать железу. Для того чтобы понять, лежит объект на экране или нет, пересчитвать его координаты в экранные нет нужды! Достаточно иметь рамку экрана в псевдоэкранных координатах и пространственный индекс в родных координатах объекта.
В случае с шариком тоже поможет промежуточная система координат. Однако, она уже не будет аффинно преобразовываться в экранную, но экономия в расчетах все еще будет при повторе прорисовки объекта.
S>>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке. Х>дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку.
А, вона ты о чем Так- конечно. Тут и зумать не надо. Потаскал карту мышкой в режиме пана и объекты разбежались кто-куда (набежала погрешность на сдвигах).
Такой эффект решается запоминанием предыдущего положения и направления "наблюдателя" и применения коэффициентов к нему. Тогда при 1000 зумов или 1000 панах меняются туда-обратно не коэффициенты матрицы, а коэффициенты, которые требуется применить к предыдущему положению "наблюдателя", фактически к запомненной ранее матрице вида. Сразу про накопление ошибки в матрице на множестве итераций туда-обратно можно забыть.
S>>Но повторить худо-бедно такой пролет на векторных данных можно. Естественно, будет зависеть от обилия данных и способа проекции (либо проекция текстуры, либо плоский рендеринг по спроектированным с шарика на плоскость координатам). С шарика на плоскость тоже можно схалтурить и поручить железу. Х>да, можно, если учесть неточности железки и соответственно с этим написать алгоритм пролёта.
Какие неточности железки? Пиксель туда-сюда?
S>>Софтовые трансформации тоже можно сократить введением промежуточной системы координат. Даже на шарике. Х>про проблемы с промежуточную систему координат вроде написал
Нету там проблемы. Одна экономия в расчетах координат повторной прорисовки примитива при смене вида. Что на железе что на софте.
S>>Так что запас по производительности есть и значительный. Потому не вижу неподъемных для C# задачь. Х>В принципе задачу можно реализовать и на C#, но куча визуальных ништяков отомрёт.
Например?
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, samius, Вы писали:
S>>http://www.google.com/trends?q=c%2C+c%2B%2B%2C+c%23%2C+java&ctab=0&geo=all&date=ytd&sort=0
NBN>Ценность данного графика в контесте данного спора близка к нулю NBN>Например, на том же RSDN вопросы по покетам задают восновном в контестке CF. Однако вопросы задают восновном нубы (создают статистику), а профи пишут на С++ (реальность).
Из этого утверждения следует:
1)Профи не задают вопросов
2)Все профи раньше писали на CF.
3)Пишуших софт на CF несоизмеримо больше, так как далеко не каждый нуб становится профи, а сами по себе профи не появляются
G>Это C++ники так пишут код на шарпе. Не надо так писать. Пишите нормально i<data.Length и будет счастье.
А мне надо именно i<buffLen.
Поймешь сейчас, или еще одну итерацию прогоним?
это для тех же числомолотилок, которые переливают из предвыделенных буферов в буфера нереальный сценарий
Например, пришли в декодер сжатые данные, их заведомый размер априори неизвестен. Примеров туевы хучи, вообще-то. Просто поверь, что там где можно было размер массива заведомо подогнать под размеры данных, то это было сделано еще до нашей оранжевой революции.
G>А причем тут пиннинг, он имеет значние только когда выделяется память.
Если я правильно тебя понял, ты предлагаешь выделить память и тут же навсегда запинить. А вот все соккеты работают через кратковременный пиннинг буферов, и, если я держу постоянно запиненными несколько тысяч буферов, то мои соккеты начнут тормозить (оно так и есть, кстати).
V>>Это зависит от характера вычислений. Например, фильтрация — это крайне примитивные вычисления, там затраты на проверку на границу цикла сопоставимы с полезными вычислениями (сопоставимы потому, что джиттер даже не кеширует в регистре длинну массива, а каждый раз лезет за ней через коссвенную адресацию), и вместо непосредственного приращения указателя каждый раз вычисляет адрес элемента (что вполне понятно, у нас же GC). Итого, мы сможем сделать таких простых вычислений в 2-3 раза меньше. G>Фильтрация чего?
Ээээ... сигналов.
G>Еще раз нужен быстрый линейный проход по массиву — используйте unsafe.
Да понял, заклинило. Ты им пользовался "по-взрослому", или на форуме тут нахватался? Если последние, то ищи лучше мои посты о предмете и еще об интеропе за последние года 3, т.к. похоже больше меня тут с этим вряд ли кто возился.
V>>В моей задаче распараллеливание одного вычисления не нужно, у меня их и так конкуррентно тысячи идут, я борюсь за эффективность каждого из них. G>Будешь бороться за каждого — производительности не будет. Компутер гораздо лучше умеет шедулить задания, чем ты сам.
И что сказать хотел? Что на наш двухядерник тысячи конкурентных вычислений мало, надо еще в несколько раз распарралелить и, соотвественно, еще уменьшить гранулярность блокировок? Ты хоть глубину это чуши понимаешь? Вот когда будет отношение кол-ва ядер к количеству конкурентных вычислений хотя бы 1/10, то тогда я шедуллеру с радостью всё и поручу, а пока что, только лишь пересмотрев сценарии и укрупнив гранулярность блокировок, повысил емкость системы раза в полтора (кол-во одновременно обслуживаемых абонентов).
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Здравствуйте, astral_marine, Вы писали:
_>>Знаний для работы под С++ надо больше, но это изучается один раз в жизни.
KV>Гениальная фраза. А можешь дать пример знаний, которые необходимо получать дважды, трижды и т.д?
Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи.
Здравствуйте, MxKazan, Вы писали:
S>>Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи. MK>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было
Заметь, "улучшает" в кавычках. Почему нельзя было сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями? Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, shrecher, Вы писали:
S>>Заметь, "улучшает" в кавычках. Почему нельзя было сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями? MK>Да ё-мае, вообще не понимаю, чего нельзя было сразу с появленияем ПК сделать его идеальным раз и навсегда. MK>
В контекте этого топика, как раз C++ стандарт сделан очень удачно и существует без изменений.
S>>Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия. MK>Ну ты же не переживаешь, например, что Intel радикальным образом изменит набор инструкций своих процессоров.
У Intel-a была такая попытка — Itanium64. Так был послан далеко и надолго, вернулись на Amd64.
MK>И с появлением тех же MMX и SSE их тоже приходилось осваивать. И чего? Любая версия .Net поддерживает предыдующие. Изменения делаются в новой версии.
Ха, ошибочное мнение. Так или иначе, с выходом новой версии, чтобы продуктивно работать, к примеру поддержка, выход обновлений и пр, требуется переход на последнюю версию. Весь маркетинг и пропаганда этого торгового гиганта MS упорно работают на продвижение последний версий.
_>>Главное что бы работа нравилась, а язык — второстепенен. _>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы.
Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак?
Как много веселых ребят, и все делают велосипед...
Здравствуйте, kochetkov.vladimir, Вы писали:
KV>Не, ну если у программера появляется непреодолимое желание впихнуть в проект все новоиспеченные фишки от MS, как только они появляются в виде CTP, то тогда оно конечно да. Что мешает использовать в проекте заранее оговоренный набор технологий/библиотек и т.п?
Щас пойдут стандартные мантры: маркетинг, домохозяйки, бла-бла-бла...
Здравствуйте, gandjustas, Вы писали:
G>разработка для мобильных устройств (Compact Framework), разработка игр (см XNA)
По факту это остаётся в рамках приколов, их доля крайне несущественна.
G>4)Зная C# вполне можно писать кросплатформенные приложения с помошью Mono (только десктоп), которые запускаются под Windows, Linux, Mac и iPhone.
Можно, только не стоит.
Здравствуйте, NikeByNike, Вы писали:
SA>>А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился. NBN>Игры
GTA 4 вроде как на XNA сделали.
NBN>ембеддед
эмбед обычно на голом С делают, я пару раз встречался с эмбедом с разными контроллерами, C++ компилеры для них в полном ужасе.
NBN>миддлеваре
это что за зверь такой?
NBN>шаровары
Я так понимаю что на С++ пришут с целью усложнения взлома, реже с целью уменьшения размера.
NBN>Ну и всё что с ними плотно пересекается — например сильно кросплатформенные программы требующие высокого качества исполнения.
Что такое "качество исполнения", как оно с C++ связано?
NBN>Кроме того — части серверных решений требующие перформанса.
А примеры такого есть?
Здравствуйте, gandjustas, Вы писали:
SA>>>А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился. NBN>>Игры G>GTA 4 вроде как на XNA сделали.
Маловероятно. Пруфлинк?
Я знаю, что есть на хна игры — но это как правило маленькие казуалки конкретно для хабокса.
NBN>>ембеддед G>эмбед обычно на голом С делают, я пару раз встречался с эмбедом с разными контроллерами, C++ компилеры для них в полном ужасе.
Эмбеддед разный бывает. Например те же покеты и смарты — где пишут на самом распрекрасном С++ с бустом и прочим.
И к мониторам, холодильникам, кандеям — тоже софт на плюсах пишут (сам участвовал или ходил рядом).
NBN>>миддлеваре G>это что за зверь такой?
middleware->Google
NBN>>шаровары G>Я так понимаю что на С++ пришут с целью усложнения взлома, реже с целью уменьшения размера.
Нет. Пишут на С++ чтобы хорошо продавалось. Причём тут взлом — вообще непонятно.
NBN>>Ну и всё что с ними плотно пересекается — например сильно кросплатформенные программы требующие высокого качества исполнения. G>Что такое "качество исполнения", как оно с C++ связано?
Качественный софт пишется на С++. Остальные решения скорее всего менее качественны.
NBN>>Кроме того — части серверных решений требующие перформанса. G>А примеры такого есть?
Ну к примеру в одном из холиваров рассказывали про серверные решения для дойчебанка. Ищущий — да обрящет.
Здравствуйте, NikeByNike, Вы писали:
NBN>>>Качественный софт пишется на С++. Остальные решения скорее всего менее качественны. G>>Что значит качественный? G>>С++ имеет чуть ли не самый высокий показатель по плотности багов на единицу функционала при разработке. NBN>Во-первых, такие высказывания нужно обосновывать ибо это очевидный бред.
Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
NBN>Во-вторых, качественный — значит качественный, софт который легко ставится, имеет нативный интерфейс и тормозит незаметно.
Офигеть, то есть пофиг чего софт делает, лишь бы нативный интрефейс и "тормозил незаметно".
Странные у вас предстваления о качестве.
Другие под качеством обычно понимают удовлетворение заказчика(соответсвие требованиям и отсуствие багов) деленное на трудозатраты. По такой метрике С++ тоже далеко не лидер.
NBN>Проблемы программистов или тестировщиков меня мало интересуют. Кроме того — в реальной разработке, доля программирования в общих человекомесяцах обычно незначительна -> влияние языка на срок разработки — тоже.
Что такое "реальная разработка"?
В то разработке с которой я хоть как-то сталкивался доля кодирования+отладки+тестирования гораздо больше 50% была и от трудозатраты языка сильно зависели.
Здравствуйте, gandjustas, Вы писали:
G>Ну тогда определение "качества" в студию. G>Обычно под качеством кода понимают обратную величину плотности ошибок на единицу функционала, C++ по этому параметру очень далек. G>Еслим рассматривать удовлетворение пользователя деленное на затраченное бабло, то managed языки тоже впереди.
Качество кода и качество продукта вещи несомненно связанные, но неидентичные. Для пользователя качество кода — вещь довольно абстрактная, а вот время отклика, например, куда важнее. Ну и прочие нефункциональные требования. Это если пользователь может выбирать. Если же ему поставили на работе корпоративного монстра на яве, то он будет плакать, но пользоваться. Поэтому, я думаю, управляемые языки пока не очень в разработке коммерческих коробочных продуктов. Я тут себе поставил Paint.Net — думал как замену гимпу использовать. И снес. Я куда легче переношу падения гимпа время от времени, чем постоянную тормознутость перерисовки интерфейса паинтнета ))
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>Иногда большая часть кода достаточно безопасна, а опасная (расчёты всякие) на разных языках будет иметь схожий объём.
расчсчеты естественно будут иметь схожий объем, почти все языки позволяют писать a+b, только с чего это рассчеты стали опасными?
Это как раз самая безопасная часть программы, они отлично тестируются, нету нетривиального управления состоянием.
Тяжелые рассчеты обычно не подвержены такой изменчивости как другие части программы.
G>>Другие под качеством обычно понимают удовлетворение заказчика(соответсвие требованиям и отсуствие багов) деленное на трудозатраты. По такой метрике С++ тоже далеко не лидер. NBN>Первый тезис — правильный (кроме как про отсуствие багов — они довольно часто допустимы). Второй тезис — совершенно не следует из первого и являетя ложным.
Почему это? На C++ в среднем надо написать больше кода для получения того же функционала, значит больше трудозатраты, значит увеличивается делитель в формуле, а следовательно уменьшается качество.
NBN>>>Проблемы программистов или тестировщиков меня мало интересуют. Кроме того — в реальной разработке, доля программирования в общих человекомесяцах обычно незначительна -> влияние языка на срок разработки — тоже. G>>Что такое "реальная разработка"? G>>В то разработке с которой я хоть как-то сталкивался доля кодирования+отладки+тестирования гораздо больше 50% была и от трудозатраты языка сильно зависели. NBN>ИМХО это точка зрения программиста.
Причем тут точка зрения?
NBN>Вообще — С++ чувствителен к квалификации программиста. Например, у меня на проект с годовым сроком разработки, по результатам финального тестирования не было ни одного меморилика, хотя до конца проекта этих тестирований не проводилось вообще.
Открою тайну. Любой язык чувствителен к квалификации программиста. Говно написать можнео на чем угодно, толко говно на C++ не запуститься или сразу упадет, а говно на .NET можно спокойно сделать чтобы оно не падало, но все равно не будет делать то что надо.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, COFF, Вы писали:
COF>>>Вообще, я против C# и .нет вообще ничего не имею, но массовое отсутствие коммерческих коробочных продуктов на управляемых языках настораживает. Это можно трактовать по разному, но факт налицо. Со статистикой не поспоришь При этом .нет на рынке уже почти 10 лет, ява — уже более 15. Средств в них вбухано немерянно. При этом, конечно, свои ниши (и немаленькие) у них несомненно есть. Но так получается, что все интересные темы пишутся на C++. G>>Коробочный десктопный софт — самая слаборазвивающаяся область разработки. Удерживает сильно существующий codebase. G>>Я вообще не могу вспомнить что новое появилось для широкого круга пользователей. за последний год.
COF>Codebase — это конечно да. Но 10 лет — это достаточный срок, чтобы переписать весь существующий codebase если это переписываение действительно даст преимущества.
Дык в том и дело что не даст. Например у вас есть команда разработчиков на С++, готовый софт и 10 лет. Вы 10 лет будете изучать новую платформу, переписывать весь код, отлавливать долго баги (денег оно вам не принесет) или просто выпустите n+1ую (а то и несколько) версию на C++, которая будет продаваться?
COF>Я думаю, дело в другом, с одной стороны, управляемые языки не дают того рекламированного преимущества для действительно больших и сложных проектов.
Еще как дают, вы сильно недооцениваете удерживающий фактор существующего codebase.
Есть большой класс бизнес-приложений, где .NET и Java уже давно прижились и нормально работают.
COF>С другой стороны, они дают сильную зависимость от поставщика рантайма
Для десктопов этот фактор играет роль, для бизнеса — минимальную.
Кроме того даже если Sun откажеться от Java или MS откажется от .NET, ни то ни другое не исчезнет моментально, никто вам не помешает поставить .NET FW или JRE и пользовать программы.
COF>плюс немалую вероятность в один прекрасный момент упереться в какое-нибудь ограничение этого самого рантайма с неясной перспективой что делать дальше.
Для .NET это вообще мелочи, потому что он спокойно интеропается с COM и нативными DLL. Mono кстати тоже умеет так делать.
Для java тоже сущестует JNI.
Здравствуйте, MxKazan, Вы писали:
COF>>При этом .нет на рынке уже почти 10 лет MK>Нормальному .Net совсем не 10 лет и даже не 5. Я говорю про .Net 2.0. MK>Ну а если скатится до совсем совсем 1-го FW, то и ему 7 лет, ага.
Ну, беты появились года за два до релиза — вот и выходит почти 10 лет. Потом, почему именно 2.0? Где гарантия, что завтра не будешь говорить то же самое про 3.5?
Вообще, я же не против .нет, я против огульного охаивания C++ определенными дот-нетчиками :)
Здравствуйте, COFF, Вы писали:
COF>Яркий пример — микрософт. Пока они пытались написать висту на C#, а потом переписывали ее на C++, эппл отхватил у них приличный кусок рынка.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>какие 10 лет? 10 лет назад была тормозная зачаточная ява без IDE. реально лет 5 назад стало очевидно, что java/c# выгодны в разработке. вот и поищи программы, которые были начаты в последние 5 лет
Я где-то в 94 году видел в книге по C++ главу — что такое ява и как скоро она заменит C++ :)
Здравствуйте, COFF, Вы писали:
BZ>>наукоёмкие вещи — скорее и наукоёмкие языки понадобятся коробки — напополам, новые продукты лучше делать на C#. в играх порядка половины кода не требует супер-быстродействия, так что опять же все шансы у более современных языков
COF>Я смогу назвать язык более современным чем C++ только если этот язык будет позволять сделать все то же самое что и C++ (в том числе и в плане эффективности),
в таком случае языка современней машинных кодов, в твоём понимании так и не появилось. но почему-то люди, включая тебя пишут на языках постарее — асме, c++ том же
COF>будет позволять сделать что-то, что C++ не позволяет, возможно избавится от косяков C++. Вот это и будет более современный язык. А назвать язык более современным только потому, что там есть сборка мусора я не могу. Это просто другой язык.
я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, COFF, Вы писали:
COF>>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>в таком случае языка современней машинных кодов, в твоём понимании так и не появилось. но почему-то люди, включая тебя пишут на языках постарее — асме, c++ том же
COF>>Хорошие компиляторы генерируют достаточно неплохой код и то иногда приходится на ассемблере модули использовать
BZ>>>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
COF>>Аналогия вещь хорошая, но обоюдоострая. Представь, что все начнут мусор не в урны кидать, а на землю — все равно дворник потом подберет Наверное, это будет не очень хорошо. Продуманная стратегия управления ресурсами в C++ позволяет не заботиться о памяти точно в такой же высокоуровневой манере.
G>В такой аналогии нужно больше деталей. G>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. G>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
Не закончил мысль.
"Продуманная стратегия управления ресурсами в C++" — в аналогии с дворником означает заставлять каждого человека выкидывать мусор в строго определенном месте, независимо от того насколько это удобно. При этом каждый должен потратить время чтобы выкинуть мусор. В случае с супер-дворником, только один он будет трутить время на выкидывание мусора, причем он суммарно затратит гораздо меньше, чем все люди вместе.
Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
Здравствуйте, NikeByNike, Вы писали:
NBN>Ага, напоминает известное предложение ставить большие баки на речные суда и заполнять их водой. Типа если натыкаешься на мель — просто сливаешь воду и плывёшь себе дальше
читай внимательно. в языках с gc гарантия — на 3x, можно и меньше. в C++ — гарантий никаких, расход может быть каким угодно прсто потому что память усеяна мелкими дырками
Здравствуйте, gandjustas, Вы писали:
G>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет.
При необходимости? Конечно да!
G>И GC не будет.
Потому что не сможет
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
M>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ?
Да ну?
Вым наверное стоит изучить как аллокаторы и GC работают.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, minorlogic, Вы писали:
M>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
M>>>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ? G>> G>>Да ну? G>>Вым наверное стоит изучить как аллокаторы и GC работают.
M>Вы такими фразами или шутите или демонстрируете свое невежество.
Маленький ликбез:
1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков.
При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию.
2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным.
3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров.
4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация.
5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции
Теперь о GC
6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю
7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть)
8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна.
9)такое распределение памяти увелиичивает cache-locality
10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении
11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора.
12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить.
13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь
Здравствуйте, gandjustas, Вы писали:
G>Маленький ликбез: G>1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков. G>При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию. G>2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным. G>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. G>4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация. G>5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции
Вот именно. В частности аллкоаторы для блоков фиксировааной длины. Я не знаю, как сделать оверхед в таких аллокаторах нулевым, знаю только как сделать, чтобы оверхед был 1бит на блок + ~30байт на страницу. Если условия задачи позволяют, можно еще и компактирование страниц в таких аллокаторах сделать, т.е. перекидывать содержимое блоков между ними так, чтобы минимизировать дефрагментацию и аллокатор держал свободными блоков не более чем на одну страницу.
G>Теперь о GC G>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю
Это, если память есть свободная. G>7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть) G>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна.
Конечно потокобезопасно, еще бы. Только потокобезопасность — не бесплатная.
G>9)такое распределение памяти увелиичивает cache-locality G>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении G>11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора. G>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить.
Реальный недостаток GC — это его непредсказуемость. Эта сущность не управлется из клиентского кода никак. Она может проснуться когда посчитает нужным. Если бы GC давал равномерную нагрузку на CPU, то никто бы от него не плевался. У идеального GC не должно быть "всплесков" и "провалов" активности, он должен просыпаться через фиксированные промежутки времени и отрабатывать каждый раз фиксированный квант времени, а не "залипать" разгребая образовавшиеся завалы.
G>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь
Это все ужимки и бег на месте, навроде java.lang.System.gc(), который ничего не гарантирует.
К сожалению, имидж управляемых сред был сильно подпорчен первыми версиями Java. Так что вы тут хоть 1000 аргументов в пользу C# приведите, стереотипы забороть очень тяжело.
Еще одна проблема C# — низкий порого вхождения для новичков. Собственно это не проблема — это вроде как его преимущество, теоретически.
На C++ писать надо аккуратно, чтобы хотя бы как-то работало. В управляемой среде писать дерьмовый код проще — утечки памяти (не все знают что такое WeakReference и зачем они нужны) маскируются мусоросборщиком, никих тебе AV и прочих мерзостей которые заканчиваются crash dump.
Здравствуйте, NikeByNike, Вы писали:
NBN>>>На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям CC>>Зависит от требований. NBN>Нашим требованиям — создать лучший продукт. Я бы с радостью на шарпе писал, но он, как и ява недостаточно кроссплатформенны и слишком тормозявы на девайсах, для нашей достаточно сложной программы. Каждого из этих факторов достаточно, чтобы от них отказаться в пользу С++.
Это все понятно. Просто разные проекты — разные требования.
Есть такие проекты с такими требованиями (чаще это не коробочный продукт) в которых С# отлично подходит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, alsemm, Вы писали:
NBN>>Я писал под брю и его потомков — WIZE и PDK, там было много старого кода на С и не меньше нового на С++, в частности вся гуйня. A>BREW — та еще радость: watch dog timer, ручная многозадачность, сказка, блин
Ага, я контужен мобильными платформами — с реальной многозадачностью почти не умею работать
Поэтому мне (противоестественно) нравится симбиан.
Здравствуйте, alsemm, Вы писали:
G>>>>Странные у вас представления о CG. A>>>Расскажите как должно быть по вашему. G>>Меня устраивает так как сейчас есть. И я быб лы очень недоволен если бы работа GC давала постоянный тормозняк. A>Постоянный предсказуемый тормозняк это лучше чем неожиданный непредсказуемый тормозняк
В том то и дело что в случае .NET тормозняк очень даже предсказуем и легко сделать так чтобы он не мешал.
G>>>>Кстати описанный вами GC вполне можно сделать на C++, почему до сих пор не применяют? A>>>В С++ GC не нужен. G>>Я много раз видел как пишут аллокаторы, которые по свойствам похожы на GC, значит нужны всетаки. A>... G>>Вот и пытаюсь разрушить стериотипы. G>>Ведь можно написать эффективную программу на Java/.NET, но некоторые почему-то свято верят что можно писать толко на С++. A>Живая эффективная программа на Java/.NET быстро порушит стереотипы. Где такую можно посмотреть?
Не порушит, потому что сравнивать не с чем.
Возьмите Paint.NET — на многих задачах работает быстрее фотошопа, но это разные весовые категории.
Можете посмотреть Windows Live Writer, но анлогов вообще нет, Windows Media Center — аналогично.
Autocad 2009 можно сравнить только с предыдущей версией, но бессмысленно это.
Вот еще и студия 2010, которая у меня на виртуалке работает также резво, как студия 2008 на компе.
Здравствуйте, gandjustas, Вы писали:
H>>Во-первых, я не мониторю TaskManager'ом, а использую ProcessExplorer (там цифирки более другие ) G>Другие это какие?
Поставь посмотри.
G>Вообще "объем памяти, занимаемый программой" очень эфимерная величина. Есть workset, есть commited memory, есть reserved memory, причем не один из этих параметров не показывает реальной величины используемой памяти в течение какого-то промежутка времени.
Есть еще Virtual size, Working set (private/shareable/shared) и Private bytes.
Процхп умеет показывать график реально юзаемой памяти по времени per process.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Эта наивная реализация во многих местах осталась и по сей день. CC>Это проблемы тех мест а не С++ в целом.
Да это вообще проблема неуправляемых сред.
И>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>Покажите две программы на .net и C++ с эквивалнтной функциональностью сложнее HelloWorld, потом посмотрим кто гонит. G>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>Ты не в тот таскманагер смотришь, тебе уже сообщали.
Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю.
G>>>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>>>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики. G>>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET. CC>Кстати, как там на данный момент обстоит дело с GC в условиях наличия за-pin-ованых объектов?
То что выделено до запиненного объекта — не уплотняется. Перерасход памяти из-за большого количесва запиненных объекктов — признак неграмотности программиста
G>>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором. CC>Это как напишешь. В unmanaged в реальном коде где надо performance выделение/освобождение памяти выносят "за скобки" и делают крайне редко.
Это примерно тоже самое что performance-critical код написать на С, а потом интеропать с ним из managed.
И>>>а) есть стэк; G>>Стек заставляет копировать объекты чаще, чем нужно. CC>С чего бы вдруг?
Передача объектов по значению вызывает копирование. Если бы такой проблемы не было, то не придумывали бы ссылки.
И>>>b) есть placement new; G>>Теже яйца что и кастомный аллокатор, только сбоку CC>Только без затрат на выделение памяти. Т.е. совсем бесплатный считай.
А откуда возьмется память в которой будет делаться placement new ?
И>>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет. CC>Как показывает практика — есть. В таком контексте С++ от С мало чем отличается, только поудобнее разве что. Не надо только на нём александрескить и говнокодить.
Испоьзовать C++ как C_с_классами конечно можно, только это получается ну очень низкоуровневое программирование.
Такое использование может себе только гугл позволить, у него денег много.
Здравствуйте, gandjustas, Вы писали:
G>>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
NBN>>Такое предложение заставляет заподозрить недостаточное владение С++. G>У меня кроме владения С++ есть еще и владение другими языками.
Я недавно прикинул, что забыл 7 языков (базик, паскаль (7&Delphi), асм, питон, луа, шарп и яву), на которых немного писал в практических целях.
Тем не менее, человек владеющий С++ врядли будет предлагать использовать С, когда можно использовать С++. А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
NBN>>>Такое предложение заставляет заподозрить недостаточное владение С++. G>>У меня кроме владения С++ есть еще и владение другими языками.
NBN>Я недавно прикинул, что забыл 7 языков (базик, паскаль (7&Delphi), асм, питон, луа, шарп и яву), на которых немного писал в практических целях.
Если вы на этих языках "писали немного в практических целях", то можно сказать что и не знали их.
NBN>Тем не менее, человек владеющий С++ врядли будет предлагать использовать С, когда можно использовать С++.
Поправочка: знающий С++ и незнающий других, более выкосоуровневых языков.
Я сам считал C++ венцом творения программистской мысли пока не знал ничего другого.
А при таком подходе "когда в руках молоток все вокруг кажется гвоздями".
Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие?
NBN>А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит.
Вообще сложность C++ такова что его использовать почти нигде не стоит.
NBN>>>Помогают — облегчают рефакторинг и читаемость кода. G>> G>>Шаблоны улучшают читаемость только в самых простых случаях. NBN>Фигня. Заявление аналогично: линк нужен очень редко.
У тебя Александреску головного мозга.
Шаблоны улучшают читаемость...
NBN>>>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов. G>>За исключением установки .NET CF (один раз) проблем нет. NBN>1. Один раз для каждого нета. NBN>2. Это минимум в _2_ раза усложняет процесс инсталляции, это просто недопустимо, даже для писюка.
Практика доказывает, что допустимо и для писюка и для коммуникатора. Более того, сейчас дофига новых приложения для коммуникаторов на .NET CF и народ их кушает, и говорит спасибо, и просит добавки.
NBN>>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит. NBN>Во-первых, позволяет, а во вторых — начинается GC с использованием диска, а это п..ц и прости-прощай юзабилити
Проверил. Не вижу никакого использования диска. 64 bit OS, 8GB RAM, выделил 4.5GB — ровно 0 disk I/O.
Еще лажовые камменты будут?
NBN>>>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество) G>>"Думаю" — слабый аргумент. NBN>Достаточный. Это называется экспертная оценка
ололол по тебе видно какой ты эксперт.
NBN>>>Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя. G>>За такой громкой фразой скрываются шаровары? NBN>Программы продающиеся индивидуальным пользователям, те которые живут в конкурентной среде. Игры с бюджетом в 10 мегабаксов для PS3 — это шаровары?
О, еще один пример твоей "экспертной оценки"? Нашел самый критичный по ресурсам класс приложений и тут же облажался — кури про xbox. ;]
Здравствуйте, gandjustas, Вы писали:
NBN>>>>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество) G>>>"Думаю" — слабый аргумент. NBN>>Достаточный. Это называется экспертная оценка
G>Ваши высказывания отлично иллюстрирует следующая картинка: G>http://i41.tinypic.com/30vemo1.jpg G>ЗЫ. Мопед не мой, привет QBitу
Здравствуйте, MxKazan, Вы писали:
MK>Блин, вот что правда 100 или 200 мегов оперативы сейчас кому-то принципиально? Я когда приводил скриншот с Creative Docs, там еще Оракл светился. Жрал 250 мегов, но при этом он у меня вообще никак не юзается. Я его однажы установил и всё. И вот оно тяпает 200 мегов при запуске и оно нативное. Но чесс говоря, что есть оно, что нет, мне фиолетово. На компе 1 Гиг оперативы. Ххах. А было бы оно managed, наверняка бы и эти 200 мег припомнили
Во времена DOS'а, когда только начали появляться графические и псевдографические интерфейсы, а "мыши" были большой редкостью, в одном журнале прочитал интервью с каким-то разработчиком. Он отвечая на вопрос журналиста об использовании "мышки" в качестве единственного средства управления, ответил: "Если вы делаете "мышь" единственным средством управления, будьте готовы обеспечить им ваших пользователей". Вот, когда мне говорят о дешевых гигабайтах, я всегда эту фразу вспоминаю Не нужно забывать, что техника бывает очень разной, и часто бывает так, что купив ноутбук с распаянными на плате 512 метрами, заапгрейдить его можно только выкинув и купив новый.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>Когда вы пишите vector<string> то читаемость улучшается. А когда идет vector<sometemple<anothertemplate<param> >, anotherparam> > то читаемости не остается вообще. NBN>Это очень плохой стиль.
Ага, и он достаточно часто встречается при использовании чего-то типа буста.
NBN>>>>>Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд. G>>>>Ну если вашу портануть может и будет тормозить, а если нормально написать на .NET не факт что будут лишние тормоза. NBN>>>Факт. G>>Доказательства будут? NBN>Нет необходимости, это 1. проверялось у нас. 2. отсутствуют решения на шарпе у конкурентов.
То есть вы не смогли написать нетормозящую программу на .NET, а потом объявляете фактом что все программы под .NET CF тормозят?
NBN>>>02-25. Зависит. На тормозявых и неоптимальных языках нельзя писать оптимальные приложения. Практика это подтверждает самым что ни есть великолепным образом. G>>Не надо обвинять язык в том что вы не можете написать на нем нетормозявое приложение. Это не его вина. NBN>Написать нетормозявое приложение можно, просто оно будет сильно уступать по функционалу приложениям созданным более подходящими средствами.
Какие-то абстрактные размышления.
NBN>>>>>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов. G>>>>За исключением установки .NET CF (один раз) проблем нет. NBN>>>1. Один раз для каждого нета. G>>Если у вас одно приложение, то как оно вас волнует? NBN>У нас несколько десятков приложений.
И все требуют разные версии .NET CF?
NBN>>>2. Это минимум в _2_ раза усложняет процесс инсталляции, это просто недопустимо, даже для писюка. G>>Какой ужас, как же люди живут... NBN>Пользуются удобным и быстрым нативом.
Да не, я про тех кто .NET юзает. Некоторые об этом даже не подозревают.
G>>>>Ну от него никуда не деться. NBN>>>Ага, он делает разработку на С++ значительно проще, чем разработка на шарпе и лучший результат в конечном результате. G>>Он ниче проще не делает, во многих случаях даже делает хуже. Переписывание всего — огромный риск, на который далеко не все идут. NBN>Не беспокойся — с нуля на шарпе тоже не пишут
А с чего еще писать? Разве есть сейчас обширный codebase на шарпе для десктопов\КПК ?
NBN>Точнее пишут! Ещё как пишут, ведутся на рекламу. Потом либо переписывают на С++, либо пропадают
Ну если с шарпа переписывают на С++, то точно пропадают.
NBN>>>Тут ведь как — чуть слажал и тебя конкуренты съели G>>Только от языка это ну вообще никак не зависит. NBN>Ну ты голову из песка вытащи и пойми, что не все языки вместе со своими енвайраментами неодинаково полезны.
А я разве не так говорю?
Там где нужен перформанс — там C или асм. Тем где скорость не очень важна C#, F#. Скрипты можно на python\ruby писать, есть рантаймы для .NET, Java, и родные интерпретаторы.
G>>не смешите, вы уже многократоно показали свое невладение ничем кроме С++, да еще и бравируете этим. NBN>Я знаю возможности шарпа и хорошо представляю как он устроен внутри.
Вы уже несколько раз показали поверхность своих знаний.
G>>>>"Думаю" — слабый аргумент. NBN>>>Достаточный. Это называется экспертная оценка G>>Какой из вас эксперт, если вы ниче дальше С++ и шароварок толком не видели. NBN>Переход на личности означает то что аргументы у тебя кончились, а следовательно ты слил.
Называние себя экспертом — переход на личности.
Видимо ты знаешь, что можно сделать? Да? От чего скрываешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
И>>>>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>>>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>>>>Ты не в тот таскманагер смотришь, тебе уже сообщали. G>>>Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю. CC>>И давно ты "кол-во используемой памяти" меряешь профайлером? G>А я где-то говрил что меряю количество памяти? G>Я же написал что эти цифирки не интересуют. Если нужно быстродействие, то меряю его профайлером.
Ты придуриваешься или всегда такой? Специально оставил поквоченную всю историю вопроса. Речь шла про (см. выше) память. Перечитай внимательно.
G>>>Перерасход памяти из-за большого количесва запиненных объекктов — признак неграмотности программиста CC>>Т.е. использование одного компонента, написанного говнокодером херит всю стройную систему? G>Оно всегда так, любой маленький кусок говнокода может испортить прогу. G>А способов надолго запинить память не так много.
Беда то в том, что входной порог в managed сильно низкий, и обложенный памперсами нуб может спокойно говнокодить не получая при этом за свой говнокод по рукам — работает же, и не падает.
И>>>>>>а) есть стэк; G>>>>>Стек заставляет копировать объекты чаще, чем нужно. CC>>>>С чего бы вдруг? G>>>Передача объектов по значению вызывает копирование. CC>>Обьясни поподробнее какая связь между аллокацией на стеке и передачей объектов по значению? G>А возвращение объектов при выделении памяти на стеке как происходит?
Если объект сколь либо серьезных размеров возвращают то никто его на стеке в здравом уме не станет размещать.
Кстати в случае если все таки размещают то ситуацию несколько спасает RVO.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
CC> NBN>>Помогают — облегчают рефакторинг и читаемость кода. CC> G>Шаблоны улучшают читаемость только в самых простых случаях. CC> Шаблоны это не только александреску-стайл. С ними можно писать читабельный и удобный код.
Здравствуйте, gandjustas, Вы писали:
E>>Дык данные-то есть? Методика, что и как измеряли? На каких примерах? Какая получилась статистика? G>Не я мерял, во многих книгах и статьях читал упоминания этого факта.
Я думаю, что это просто PR.
Уж больно факт малоправдоподобный
Неужели вот в этом коде:
inline void foo( int i ) { std::cout << i; }
вероятность ошибки в 5 раз меньше, чем в этом:
inline
void foo( int i )
{
std::cout << i;
}
А языки отличаются намного сильнее, чем разные стили кодирования в С++
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Например при ипользовании ФВП с помощью буста затайпдефить все функции не получися.
Функциональщину на С++ на данный момент я отношу к редкостным извращениям, полагая что если надо функциональщина — лучше взять другой язык.
Появится поддержка functional из С++0х в компилерах — будем посмотреть.
А пока это не для С++.
G>Я видел игры с бюждетом в несколько миллионов рублей, там для программиста работы на пару месяцев.
А ты, эксперт. (С)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Например при ипользовании ФВП с помощью буста затайпдефить все функции не получися. CC>Функциональщину на С++ на данный момент я отношу к редкостным извращениям, полагая что если надо функциональщина — лучше взять другой язык. CC>Появится поддержка functional из С++0х в компилерах — будем посмотреть. CC>А пока это не для С++.
То есть всетаки с++ недостаточно выразительный.
Что и требовалось доказать.
G>>Я видел игры с бюждетом в несколько миллионов рублей, там для программиста работы на пару месяцев. CC>А ты, эксперт. (С)
Нет, там программист действительно за пару месяцев справился.
Здравствуйте, Erop, Вы писали:
kuj>>Разработчика, который пытается использовать ВСЮ память надо бить сильно по рукам.
E>Я знаю задачи, в которых это правильная стратегия...
Здравствуйте, gandjustas, Вы писали:
G>>>Ключевое выделил. H>>Угу, а при его отсутствии начнется деградация производительности (ведь алгоритмы перестанут работать эффективно, как следует из цитаты) G>Я например замечаю что память кончается конда показатель выделенной физической памяти подбирается к 98 процентам. G>В таких условиях тормозит все.
Отсутствие большого объема свободной памяти и отстутствие свободной памяти вообще, сравнивать, как бы, нельзя
H>>Во ведении там есть несколько слов, найдешь А вообще, слова теже самые, что и у Рихтера. Я вообще удивлен, чего ты этот очевидный и признаваемый факт отрицаешь... G>Ага, видно что прочитал введение и заключение.
Я тебе уже цитировал Рихтера, и не вижу ни какой необходимости цитировать тоже самое еще раз
H>>Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное. G>3 раза в секунду это часто? G>На гигагерцовом процессоре за секунду выполняется 1000000000 тактов. При этом если в приложении ничего не происходит, то все поколение становится мксором и не происходит фактически уплотнения кучи.
Это демагогия.
G>Сборщик мусора на многопроцесорной машине работает в фоновом режиме по большей части. G>Так что влияние на производительность минимальная.
Сборщик мусора, даже на многопроцессорной машине, даже "серверный", вынужден останавливать выполняющиеся потоки. Concurent GC требует синхронизации, что на производительности не может не сказаться. Поколения конечно хорошо, но приводимый мною пример с XML-RPC.NET вызывает таки сборку во втором поколении (причем размер кучь у поколений постоянно меняется)
G>>>Надо бы ло внимательнее статью читать, "вдруг" не бывает. тем более это тоже контролируется. H>>Именно вдруг. Работу GC ты можешь "типа контролировать" подстраивая алгоритм под его текущую стратегию. Зря чтоль Рихтер советует вызывать GC.Collect маскируя его за "тяжелыми операциями"? G>Мдя... не надо так явно показывать свою недалекость. Читайте про GCSettrings.LatencyMode.
Это не управление, это декларация желаний
H>>Синтетика все что угодно показать может, главное приготовить как надо. Ты, как надо было тебе, приготовил. G>Ну приготовь как тебе надо, покажи обратное.
Перейдем сразу к оглашению результатов: у меня толще!
H>>Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения.
G>А че, нативное приложение в свом не выгружается? Что ты пытаешься показать этой фразой?
Я говорю о том, что Paint.NET откушавший больше чем Turbo Delphi IDE, отправляется в утиль и остается там навсегда.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>>Ключевое выделил. H>>>Угу, а при его отсутствии начнется деградация производительности (ведь алгоритмы перестанут работать эффективно, как следует из цитаты) G>>Я например замечаю что память кончается конда показатель выделенной физической памяти подбирается к 98 процентам. G>>В таких условиях тормозит все.
H>Отсутствие большого объема свободной памяти и отстутствие свободной памяти вообще, сравнивать, как бы, нельзя
Это к тому что тормозов дополнительных нету независимот от .NET или native.
H>>>Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное. G>>3 раза в секунду это часто? G>>На гигагерцовом процессоре за секунду выполняется 1000000000 тактов. При этом если в приложении ничего не происходит, то все поколение становится мксором и не происходит фактически уплотнения кучи. H>Это демагогия.
Демагогия это делать выводы о производительности основываясь на мифилогизированных представлениях о GC.
G>>Сборщик мусора на многопроцесорной машине работает в фоновом режиме по большей части. G>>Так что влияние на производительность минимальная.
H>Сборщик мусора, даже на многопроцессорной машине, даже "серверный", вынужден останавливать выполняющиеся потоки. Concurent GC требует синхронизации, что на производительности не может не сказаться.
Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение.
H>Поколения конечно хорошо, но приводимый мною пример с XML-RPC.NET вызывает таки сборку во втором поколении (причем размер кучь у поколений постоянно меняется)
Как это влияет на производительность?
Покажите код (.NET и нативный) и результаты замеров, тогда вам кто-нибудь поверит.
H>>>Синтетика все что угодно показать может, главное приготовить как надо. Ты, как надо было тебе, приготовил. G>>Ну приготовь как тебе надо, покажи обратное. H>Перейдем сразу к оглашению результатов: у меня толще!
H>>>Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения. G>>А че, нативное приложение в свом не выгружается? Что ты пытаешься показать этой фразой? H>Я говорю о том, что Paint.NET откушавший больше чем Turbo Delphi IDE, отправляется в утиль и остается там навсегда.
Такое чувство что кода ты был маленький к тебе приходил дядька из Microsoft и отобрал у тебя конфетку. Теперь ты выплескиваешь свою обиду на форуме.
Вообще за все время ты ни разу не привел аргументы почему .NET работает медленнее, все сводилось к каким-то левым наблюдениям (которые еще и не у всех воспроизводятся) и недалеким выводам.
Кроме того ты очень активно в своих суждениях опираешься на библиотеку XML-RPC.NET, которая вообще непонятно как работает.
Здравствуйте, hattab, Вы писали:
G>>Проснись, далеко не всем нужна запредельная производительность. А на практике получается что скорость работы программы упирается в диск\сеть и прочее. G>>Только в игрушках может исключение.
H>Скажи, а во что упирается меню в WLW, отзывчивость которого меня жутко печалит (при установке он прогоняется ngen'ом, так что это не JIT)?
Незнаю во что у тебя меню упирается, только что проверил — все летает.
Здравствуйте, Sheridan, Вы писали:
S>Sinclair wrote:
>> S>В англицком к примеру я не силен. >> Как же ты живешь-то? S>Да неплохо в общем то живу.
>> S>В трех словах пожалуйста опиши что там происходит. Насколько я понял — чел добился существенного увеличения производительности, или нет? >>
...
S>Спасибо. Все правильно написано. Оптимизировать нужно в разумных пределах.
Самое главное
Если я и выучил хоть что-то про анализ производительности, так это то, что мои догадки о расположении узких мест зачастую неверны
Вы что же картинки в base64 гоняете? Вот такие, простите, индусоалгоритмизаторы и есть причина репутации .NET как медленной среды.
Хардкодинг урлов в атрибутах — моветон.
Java-like нотация записи методов (getScreenshot64) — моветон.
В С# нет оператора :=
Неиспользование using для MemoryStream — утечка ресурсов.
Читабельность Picture.Bitmap.LoadFromStream(TXmlRpcBase64(XmlRpcServerProxy('http://127.0.0.1/').keyhole.getScreenshot64(320, 200)).AsStream); -- отвратительная.
Здравствуйте, Erop, Вы писали:
E>Кроме того, то, что он сразу же искал неэффективным образом (хотя, как я понял, это основная функциональность в проге!!!), говорит о том, что проектировать это дело он и не пытался. А пытался типа написать, потом профильнуть, потом трясти...
Совершенно верно. И это — единственный способ писать хорошие программы.
E>Что бы получилось, если бы он сначала таки подумал как сделать его прогу быстрой, потом это запроектировал, а только потом уже бомбил, не известно.
Известно. Он бы бездарно потратил больше времени на разработку программы.
E>Мне так кажется, что 2 секунды для этой программки -- ЭТО ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ДОЛГО.
Напомню, что цели должны быть ориентированы на потребителя, а не высосаны из пальца. Сколько, по-твоему, должна работать эта программа? Почему?
E>А вот, если в дело вмешиваются клиенты и конкуренты, ситуация несколько меняется...
Читать последнюю строчку в его статье.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Хвост, Вы писали: Х>multiset
А он неявно сортирует??? Офигеть. Я как отвык от того, что для множества нужно задавать отношение частичного порядка.
Я надеюсь, уточнение сортировки в Case-insensitive/accent-sensitive для турецкой локали не усложнит эту безусловно прекрасную программу?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали: Х>>>ого! тебе осталось сделать совсем небольшой шаг до С++, решайся! G>>Зачем? Для запредельного перфоманса есть С, для надежного и красивого кода есть C#, F#. G>>А С++ в этом уравнении места нет. Х>ну как же, C++ == запредельный перфоманс + надёжный и красивый код
И то и другое неправда.
Х>>>P.S. ну и что ты со своими байтами будешь делать? а как насчёт того чтобы классы на стеке инстанцировать? G>>Если уж очень надо стеке, то воспользуюсь структурами. Х>надеюсь ты понимаешь разницу между структурой и классом в дотнете, повторяюсь — инстанцировать классы
Я то как раз отлично понимаю, а вы — видимо нет.
Х>и на посошок, или я проглядел, или ты не ответил на вопрос — сколько у тебя установлено приложений уровня "десктоп", писаных на дотнете?
Сколько установлено — не считал, пользуюсь двумя — paint.NET и Windows Live Writer. Это треть софта, который я ставил и пользуюсь им.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали: G>>Ну если вы так думаете тогда объясните принципиальную разницу между классом на стеке и структурой на стеке. Х>объясняю, struct в сишарпе ето семантически то что называется POD в С++, т.е. плоская структура данных, ни конструкторов, ни методов, ничего.
В структуре нет методов? Это точно на C#?
Х>Так вот, в С++ в стек можно положить как объект-инстанс класса, так и объект-инстанс POD-структуры, в сишарпе же только второе.
В C++ клас и структура — одно и тоже. В C# — разные вещи.
Вопрос возник видимо из-за непонимания этого факта.
Здравствуйте, criosray, Вы писали:
C>Отличное от реальности?
изначально разговор был о массиве структур на стеке, ликбез про боксинг/анбоксинг читать не стоило, читал давно, в зелёной книжке.
Здравствуйте, gandjustas, Вы писали:
E>>Да это как раз у Вас полнейший неадекват какой-то, постоянное съезжание с темы, ответы на посты в отрыве от обсуждаемого контекста.
E>>Там же написано, что подсказка. Додуматься, что очевидно имелось в виду то, что можно заменить int на произвольный класс, и никакого malloca/free не понадобится, не судьба?
E>>P. S. Даже попкорн полохо лезет под такой некачественный флейм.
G>Думаете нельзя в C# на стеке данные размещать? G>Вот в Java нельзя, только элементарные типы, в C# есть стурктуры.
G>Не надо показывать свое незнание.
А вот обязательно было в моём утверждении подменять "произвольный класс" на "данные"? Именно это я и имел в виду, говоря про неадекват.
просто вот когда дело доходит до новых апи — здравствуй интероп с нейтивом, хочешь массив на стеке — здравствуй ансейф, тот же пэйнт.нет афаир просто насквозь пропитан ансейфом, зачем тогда сишарп? хорошие вещи делаются только в нейтиве, вот тот же пример с выводом строк, для такой забавы как флейм на рсдн и стримы с регекспами не грех использовать, а вот если бы ето была программа промышленных маштабов — скажим анализатор логов, то здравствуй мем-маппед файлы да стейт-машины с отсутствием аллокаций, и писать етона си++ без ifstream и multiset, а не на сишарпе с gc и аллокацией на каждый чих.
Здравствуйте, gandjustas, Вы писали:
G>Как будут работать виртуальные методы при размещении объектов на стеке?
Блин, следуй своим же советам! Заботай таки С++, а потом уже критикуй!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, criosray, Вы писали:
Х>>да всё ты делаешь так, я же говорю, VB 21-го века, как бы понимаешь, на примере моего проекта, относительно небольшое приложение, формы, диалоги, отчёты, никто не жалуется, C>Ну если приложение на 3 млн. строк кода "небольшое"...
я говорил о проекте в котором участвовал я, он был на порядок
3 млн. строк кода внушает, ето около 40 человеколет.
C>Может дело вовсе не в .NET?
может
C>2 секунды на форму? Дело точно не в .NET.
а может и в .NET, я не профайлил, знаете почему? потому что nobody care
C>Вы глубоко заблуждаетесь. Лучший тому пример — Microsoft Blend, и AutoCAD, последних версий.
Blend ето второй продукт о котором я услышал первый раз в жизни, глянул — софт для дотнета на дотнете, вполне логично.
Насчёт автокада я незнаю откуда пошло ето регулярно звучащее заблуждение, но я знаю одно, автокад — ето С++, то что автодеск выпустила пакет апи для интеропа с дотнетом не превращает продукт из нейтива в менеджед.
C>Благодаря .NET софт получается еще и много более качественный. Мы — адепты TDD. У нас 95% покрытие тестами.
я думаю TDD как методология слабо коррелирует с платформой или языком разработки.
Х>>за 8 лет на нём бы уже написали немеряно десктоп приложений (посмотрите на C++, когда появился первый промышленный компилятор, и сколько софта писалось на C++ через 8 лет). Однако есть момент. Качественного десктопного софта на C# нет. C>Продолжайте верить в это.
в ето не надо верить, достаточно просто посмотреть на список установленных программ.
Здравствуйте, gandjustas, Вы писали:
E>>Нет, ну если ты настаиваешь, что быстрый код ОБЯЗАН БЫТЬ ненадёжным и некрасивым, то да, нет... G>Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне.
Это всего лишь твоё неумение писать быстрый и качественный код...
Мне известны МНОГОЧИСЛЕННЫЕ контрпримеры, так что позволь не поверить твоему голословному утверждению...
G>Я не предлагал C использовать для красивого кода.
Я понимаю. То есть ты предлагал делать быстрый код некрасивой и ненадёжной помойкой?
А зачем? Потому, что С++ освоить не можешь (эта фраза обозначает тоже самое, что и фраза: "С++ слишком сложный") , или какие-то другие причины?
G>Ты как-то очеь интересно говоришь о том что C# позоляет писать хороший код с малыми затратами.
Не хороший, а приемлемый для индусов... Тормозной и прожорливый по памяти А для "нагруженных частей" С -- так у тебя ведь выходит?
G>Когда вместо индусов пишут нормальные программисты код у них получается гораздо лучше и быстрее, чем на С++.
Про "лучше" -- не ясны критерии, про быстрее — не верю.
G>И только там где не хватает производительности может быть использован C.
Ну вот есть такая т. з., что в случае массового потребителя, производительности не хватает практически ВЕЗДЕ. Ну ценят люди скорость...
G>ЗЫ. Ты думаешь на С++ индусы не пишут?
Пишут, конечно, хотя для них уже есть намного более подходящий ХиндиС...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
C>>У нас пользователи в госструктурах на компах, которым уже по 2-4 года работают с нашим клиентом на .NET уже больше года в production режиме. Клиент довольно тяжелый: диалоги, графики, отчеты, таблицы, формы — полный комплект. Нареканий на производительность до сих пор не было. "ЧЯДНТ?"
E>Считаешь, что выделенное -- это "тяжёлый клиент".
Да, выделенное это тяжелый интерфейс.
E>Кстати, а данные вы из DB берёте, я надеюсь?
Здравствуйте, Mamut, Вы писали:
Х>> Качественного десктопного софта на C# нет.
M>С одной стороны виноват тот же С++. Потому что legacy и тот же ворд нет смысла переписывать с нуля M>С другой стороны — а что такое десктопный софт?
Гуглохром например, и легаси нету и работает на десктопе
Здравствуйте, niellune, Вы писали:
N>Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
Хорошая мысль. Воплоти ее в жизнь. А то, твои слова выдают в тебе э... как это по мягче сказать? Ну, не компетентность что ли...
Рассуждения напоминают ответ мальчика пяти лет на вопрос кем ты хочешь стать когда повзрослеешь...
Купи себе учебники по C++ и C#. Прочти их. Изучи языки. Потом еще какие-нибудь другие языки изучи (что-нибудь из ФП, например). Когда ты все это сделаешь, то поймешь какую чушь ты тут нес. А на вопрос каким языком пользоваться ты и само тогда ответить можешь.
ЗЫ
И вообще, что это за позиция — устроиться куда-то "на начальную позицию"?
Это значит ты будешь изучать что-то, а тебе за это еще и платить кто-то должен?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>А если серьезно, то уровень дискуссии действительно просто супер. Плинтус горами покажется.
Угу. Люди не знающие .НЕТ против людей не знающих С++.
Смешно читать и тех и других.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, criosray, Вы писали:
C>Вы глубоко заблуждаетесь. Лучший тому пример — Microsoft Blend, и AutoCAD, последних версий.
Про AutoCAD это еще кто заблуждается:
Using the ActiveX® (COM Automation) interface in AutoCAD Architecture software, you can build applications with a variety of programming technologies and environments including Microsoft® Visual C++®, Visual Basic® (VB), Delphi, and Java. AutoCAD Architecture extends the AutoCAD ActiveX interface to provide direct access to most of its custom objects.
Being based on AutoCAD, AutoCAD Architecture also includes Visual Basic for Applications (VBA), the most popular programming environment, and Visual LISP®.
When developing object oriented C++ applications for AutoCAD Architecture, you'll need to work with both the AutoCAD ObjectARX® SDK and the Object Modeling Framework (OMF) for AutoCAD Architecture. Designed for use by professional programmers to develop the fastest, most efficient, and most compact applications for AutoCAD, ObjectARX and the OMF provide the highest performance applications for AutoCAD Architecture, and an ideal development environment.
In 2007, AutoCAD Architecture's .NET interface has been expanded with many classes previously only supported through OMF and C++ now accessible to all .NET supporting languages. Now VB and C# developers can access most of the power of OMF.
Внутри AutoCAD как был C++ + MFC (AutoCAD200, для него сам расширения писал), так и остался. Для тех кто сомневается, пост из AutoCAD форума:
maybe you are compiling with the debug version of the MFC libraries. You can check the project configuration properties and see what you have set in C/C++ -> Code Building -> Runtime Library. Here you have to set the value "DLL Multithread (/MD)" either for the debug that for the release configuration. This is because Autocad use only the release version of MFC.
Здравствуйте, alsemm, Вы писали:
C>>Вы глубоко заблуждаетесь. Лучший тому пример — Microsoft Blend, и AutoCAD, последних версий. A>Про AutoCAD это еще кто заблуждается:
Интерфейс AutoCAD 2009 написан на WPF (.NET). Не так давно обсуждалось.
Это к слову о "пластилиновости интерфейсов дотнет", как опровержение. И, кстати, для С++ нет аналогов WPF. Так что будущее десктоп софта под Windows таки за дотнет.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, Mamut, Вы писали:
Х>>> Качественного десктопного софта на C# нет.
M>>С одной стороны виноват тот же С++. Потому что legacy и тот же ворд нет смысла переписывать с нуля M>>С другой стороны — а что такое десктопный софт?
H>Гуглохром например, и легаси нету и работает на десктопе
У гугла столько ресурсов, что они могуть ОС в машинных кодах написать.
И если им будет надо — напишут.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, alsemm, Вы писали:
C>>>Вы глубоко заблуждаетесь. Лучший тому пример — Microsoft Blend, и AutoCAD, последних версий. A>>Про AutoCAD это еще кто заблуждается:
C>Интерфейс AutoCAD 2009 написан на WPF (.NET). Не так давно обсуждалось.
Почитал ветку. Ну так и правильно, GUI на С++ писать/поддерживать — это overkill, кто бы спорил. Но потроха-то там на c++ как были, так и остались. Из этого следует, то что тут неоднократно утверждалось — каждой задаче свой инструмент. GUI — С#, core — С++
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>У гугла столько ресурсов, что они могуть ОС в машинных кодах написать. G>>И если им будет надо — напишут.
E>Не понимаю я вот этого аргумента! Если они такие лохи, что всё делают неверно и неэффективно, то почему у них всё так хорошо?
Гуглу гораздо сложнее будет нанять шатат разработчиков на Java наример, чем написать что-то на C++.
Исторические причины в крупных организациях играют немалую роль.
Здравствуйте, esil, Вы писали:
E>Верным остаётся одно: на любой дурацкий синтетический тест найдёт столь же дурацкий аллокатор, который этот тест "уделает".
Так тест и был для стандартного аллокатора.
При страндартном аллокаторе операции выделения и освобождения памяти оказались не такими дешевыми как их считали некоторые.
Кроме этого тест и е должен был ничего показать.
E>Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию.
Отличная идея. GC как раз позволяет не думать о выделении и освобождении памяти вообще.
Если производительность окажется недостаточной то надо смотреть причны и бороться с ними.
Причем чаще всего прчиной оказывается применение неподходчщего алогоритма. Очень редко приходится нарываться на ситуацию когда низкая производительность вызвана особенностями платформы.
Здравствуйте, gandjustas, Вы писали:
E>>С того, что знаю примеры быстрого кода, который сразу так и разрабатывался, как быстрый... G>И я знаю, но обратных примеров больше.
Плохих программистов вообще меньше, чем хороших...
Да и дантистов, например, тоже
G>Ну это смотря что понимать под качеством проектирования. G>Гуглите "premature optimization".
Это другое. Обычно этим словом обозначают желание экономить на спичках пока ещё не решено нужен ли костёр, так скажем. Но если ты, например, решил писать спел-чекер, то ответить на вопросы в какой структуре данных ты будешь хранить словарь и будет ли словарь словоформенным или полексемным, стоит ответить ещё на этапе проектирования
G>Это я неверно выразился. Вместо быстрый надо читать "оптимизированный".
Я, видимо, плохо понимаю смысл "оптимизированный". Видимо это какой-то способ портить код?
G>Хотя надо было добавить что использовать безопасным образом. Я с тех пор как изучил C++ в полной мере старался не писать кода, который передает указатели на стек куда-то.
IMHO, это догма. Надо избегать переполнений буферов, где бы они не были аллокированы. И С++ предоставляет широкие возможности для этого. Например тот класс CAutoBuffer, который я тут показывал...
G>Например мне удалось жа полчаса объяснить человек программу на F# на два экрана, при том что он F# не знал. G>Аналогичная программа на C++ занимала бы больше и была бы гораздо более сложна в понимании.
Возможно. Но F# -- это всё равно маргинальщина. Кроме того, я не понимаю, что значит "объяснить". Он бы после твоих объяснений смог бы эту прогу поддерживать? В любом случае это тут офтоп.
G>Делать процедурную обвязку вокруг ОО-кода не хочется, тем более обычно задача низкоуровневого кода заключается в математике.
Не знаю, что такое "низкоуровневый код" В моих программах мотор намного сложнее оболочки. Возможно ты с моторами, кроме СУБД просто не сталкивался.
E>>Пока не нужна память и скорость -- да. Например для GUI ХиндиС -- это просто находка! G>Ну а доказательства тезиса будут? G>Или опять по принципу — чем больше повторить, там больше правда.
Доказательства чего? Что для GUI находка? Это моё мнение.
А если речь идёт об обработке большого количества данных, то я не знаю успешных примеров моторов на ХиндиС...
G>Ну и как AI делать?
В смысле "как?" Брать и делать... G>Мой знакомый AI занимается, вообще на лиспе пишет.
На лиспе хорошо делать прототипирование в некоторых задачах AI. Правда удобно. Я как-то возился и с лиспом. Но большой скорости из всех этих списков, IMHO, не выжать -- слишком универсальные
G>Если данные лежат в субд и имеют реляционную природу, то конечно субд. И интерфейс отлично будет. G>А если нет — то придется код писать и уж точно не на С++.
При веди пример данных, о которых речь...
G>А где еще нужна таки вычмощь кроме математических алгоритмов (физика, графика, видео) ?
Есть то, что я бы не назвал "математические алгоритмы", хотя, строго говоря, все алгоритмы "математические"...
Скажем нейронная сеть -- это мат. алгоритм? А поисковая машина?
Или, например, сжималка памяти на лету, позволяющая увеличить видимый RAM?
G>Все задачи которые требуют не только процессора, но и активно работы с другими ресурсами компьютера (память, диск, сеть), а также требующие высокую степень параллельности обработки лучше уже писать на .NET.
Про параллельность не уверен, есть более специальные средства, хотя я сторонник наоборот, крупной гранулярности, если возможно, и тогда язык не особо важен. Про сеть -- вообще всё пофиг, IMHO, если это не TCP/IP стек А если он -- то не ХиндиС, однозначно, IMHO. Работа с диском -- это известный тормоз и не ясно какая разница, какой язык, опять же... Про активную работу с памятью (что бы это не значило) я тоже как-то сильно сомневаюсь. И С и С++ позволяют отрегулировать эту "активную работу" намного тоньше...
Вот, например, хочу я разработать search engine. Типа как у google. Чтобы скармливать ему документы, а оно их разбивало на слова, как-то там индексировало, а потом отвечало на вопросы вроде: "найди мне все документы, где слова "мама" отстоит от слова "моя" не дальше двух слов, стоят в одном предложении и согласованы по грамматическому значению".
Ну и пополняем, например, на одной нити, а ищем параллельно. И что, думаешь на C# хорошо получится?
AFAIK, все такие движки на плюсах чего-то пишут...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
E>>IMHO, такая ситуация, когда для ускорения надо менять алгоритм, часто говорит о том, что проектировали плохо. G>Обычно так и делают.
Ну ты же сам пояснил, что вы принципиально не проектируете, а сразу пишите прототип? Тогда не удивительно...
G>А еще чаще — нельзя. Потому что решение задачи кроется не в одном алгоритме, а в дестятках. Подобрать оптимально каждый из них нереально, кроме того заранее обычно даже не думают как данные выглядеть будут.
Не понимаю, в чём проблема.
Привели пример задачи, и алгоритма, который сразу трудно выбрать...
G>В реальной жизни приходит заказчик и говорит: "сделайте мне песдато!"
И что за алгоритм вы выбираете в качестве первого приближения в таком случае? Зовёте спецов по ублажению?
Вообще-то я имел в виду, что задачи обычно на подзадачи бьются, а подзадачи обычно имеет более менее стандартные решения... Я как-то не понимаю, если уж есть какой-то алгоритм, то что мешает проверить его на эффективность-то?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Хвост, Вы писали:
Х>ну, давай по-порядку, на С# я писал давно и немного, на С++ на порядок больше, и есстествено что-то могло забытся, к тому же если ты проследишь начало темы про структуры, то она была о размещении их в массиве, и тут без ансейфа вариант действительно только один — боксинг.
По-прежнему неверно.
Даже при размещении массивов структур в хипе никакого боксинга нет.
Х>Теперь по-поводу "подобный пост про тебя", пиши пожалуйста, ведь ето ты будешь писать обо мне как о разработчике на C#, что ещё раз подтвердит мои слова , C# (особенно в версии 3.5) ето очень мощный язык, но для приложений требующих производительности, малой затраты ресурсов, быстрой реакции интерфейса ето просто моветон.
Ну, если писать на нём, не разбираясь в отличиях value-типов от reference-типов — то да. Но это вообще как бы моветон — писать приложение, требующее производительности, не зная при этом технических основ. Уверяю тебя, при аналогичном уровне знаний С++ результирующая программа будет еще медленнее и нестабильнее.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка? G>>Для систем с GC — да. Это и позволяет концентрироваться на алгоритме.
E>Представьте, что надо сделать текстовый редактор типа WYSIWYG. Ваша вера настолько сильна, что Вы рискнёте для представления одного символа использовать отдельный объект некоторого класса?
А такое вообще может быть нужно? Я что-то не представляю сценарий, где для одного символа требуется объект класса.
Если что есть паттерн flyweight, который как раз позволяет не создавать кучу однотипных объектов.
E>Представьте, что надо реализовать какую-нибудь числодробилку. Ваша вера настолько сильна, что Вы рискнёте для представления числа использовать класс?
А что значит класс?
Например в C# сами числа являются наследниками Object, имеют методы и реализуют интерфейсы.
Я надеюсь вы сами понимаете, что выдумываете что-то нереальное. не нужно создавать классы для символов и чисел, они уже есть и отлично работают.
А если каких-то абстракций нету в стандартной библиотеке, то я буду создавать классы.
Очень надеюсь что все программисты так поступют.
G>>Для C++ — нет. Там надо думать о том как распределяется память под объекты. E>В каком смысле надо думать? Думать о том, когда и как память освободить? Ну тогда это утверждение выглядит бредово, с учётом предыдущего. "Производительность будет отличаться на порядки, потому что надо думать". Память выделяется и освобождается в обоих вариантах, но во втором варианте надо думать, чтобы её освободить, поэтому производительность будет хуже.
Ниче не не понял.
E>>>>>А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав? G>>>>Неправ. Слабые выразительне способности C++ не позволяют мере проводить объектую декомпозицию так как хочется. E>>>Примеры? G>>1)Как минимум нельзя просто вернуть динамический объект из метода, потому что неизвестно освободят ли его. G>>2)Осутствуют многие языковые конструкции как yield, ФВП, делегаты, события. G>>3)Отсуствие метаинформации о типах не позволяет создавать решения вроде IoC контейнеров, OR-мапперов, связывания данных (binding) и других полезных фишек. G>>Я знаю что некоторые недостатки исправляются бустом, но обычно это порождает сложночитемый код.
E>Ок, в общем позиция понятна. Странно правда, что использование std::auto_ptr/boost::shared_ptr для возвращаемого объекта представляется сложночитаемым.
Это как раз самое простое.
Вот сложночитаемомое становится при активном использовании ФВП.
e> Документ состоит из абзацев. Абзац из "символов".
все дальше поскипано. в тх ж GoF, если мне не изеняет память, описано как надо делать для сложного форатирования и т.п. Никому не нужно иметь на каждый символ по классу/экземпляру класса.
Здравствуйте, niellune, Вы писали:
N>Здравствуйте! Нужен ваш совет)) N>Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию? N>В каких областях сейчас применяется C++?
Возможность есть. Более того, сейчас некоторые девелоперские конторы испытывают кадровый дефицит в области разработчиков на С++. Программистов на С# вежливо разворачивают, при этом интересуясь, а не пишите ли на плюсах?
Области использования плюсов прежние: системное и прикладное программирование. С системным все понятно. Там используется либо С, либо С++. С си шарпом туда дороги нет. В прикладном программировании также есть области, в которых используется исключительно С++. В частности, это CAD, CAM и CAE системы. Некоторые могут возразить, мол, автокад 2009 использует .net. Но это либо от незнания, либо от нечестности. На нете там только пользовательский интерфейс. Элемент, конечно, немаловажный, но отнюдь не ключевой в такого рода системах. Мне лично, кстати говоря, новое меню автокада ужасно не понравилось...
N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++ N>Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
Не советую. С C# на С++ никогда не перейти. Это два разных мира. Сиди на своей работе пока и долбай прямо в цель — С++.
С# тебя ничему не научит.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>В это время C++ники все еще воюют с проблемами языка и утечек памяти и пользуются средствами десятилетней давности. CC>Ты изрядно отстал от жизни.
Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
Здравствуйте, Sorantis, Вы писали:
S>Здравствуйте, snautSH, Вы писали:
M>>>В плюсах нуб просто не взлетит шутка конечно но ... SH>>тоесть программистом С++ можно только родиться?
S>нет, но стать хорошим с++-ником гораздо сложнее чем СиШарпникомКопипастником. S>Сам пишу на Шарпе в основном (хотя уже сам не пойму на чем...последнее время сишарп и джава в перемешку с плюсами), S>до этого писал на плюсах. шарп люблю, но по плюсам скучаю.. вот такой я сентиментальный
так не пойдет. вы сравниваете разные уровни. это все равно что — стать С++ ником копипастником гораздо проще, чем хорошим C# программистом
Здравствуйте, ollv, Вы писали:
O> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
Неудачная шутка насчет высоких абстракций. Высокие абстракции, которые создаются в С++, являются костылями.
В большенстве современных языков теже возможности строены в самя изык или стандартные библиотеки.
Здравствуйте, criosray, Вы писали:
C>Э-э, классы и объекты в процедурных языках? Шаблоны в Delphi language или VB6?..
А зачем в процедурных то?
К тому же ты говорил об абстракциях которые можно выразить средствами языка, а не о фичах языка.
Если уж речь пошла о фичах, то я с удовольствием погляжу на то чем ты заменишь лямбды с замыканиями (только не надо бустовских уродств, там замыкания не поддерживаются) и паттерн-матчинг.
ЗЫ
Не стоит даже заикаться на счет каких-то там преимуществ С++ в области языковых возможностей и тем более абстракций. Это чушь! Единственное преимущество С++ — это возможность низкоуровневых оптимизаций и относительная дешевизна имеющихся абстракций. Это позволяет, при желании, не хилых усилиях и отсутствии алгоритмических противопоказаний, написать программу обладающую высокой производительностью. Больше преимуществ у этого отсталого языка нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
Однажды я участвовал в одном проекте на С++, в котором использовался самопальный сборщик мусора. Причем он был оченб мощный и умел разруливать циклы и всякие сложные зависимости. Так программа с использованием этого gc жрала память как свинья помои. И довольно много времени приходилось искать объект который держал ссылку.
Если ты думаешь что в джаве или сишарпе память не может утекать, то ты ОЧЕНЬ заблуждаешься. Там точно также возможны ситуации когда кто-то будет держать объект, из-за этого не будет вызван его деструктор, а из-за этого не будет закрыт ремотный коннекшин ...
Единственное что в управляемых языках лучше — это невозможность такой ситуации:
std::vector<MyClass*> array;
array.push_back(new MyClass());
array.push_back(new MyClass());
array.push_back(new MyClass());
vector.clear()
или еще
class CopyableClass
{
public:
CopyableClass() : Value(new Object()){}
~CopyableClass() { delete Value;}
private:
Object* Value;
}
но подобные ситуации замечательно лечатся с использованием std::auto_ptr и std::shared_ptr.
и никакие мемори лики не страшны.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Здравствуйте, Хвост, Вы писали:
Х>угу, ты ето говоришь года едак с 2002-го, когда C# был настолько убог что даже твой нелюбимый С++ обходил его с головой.
Начиная со 2-й версии С++ нервно курит в сторонке.
А начиная с 2006-го я вообще перешел на Nemerle до которого C# расти еще лет 10, а С++ уже никогда не дорастет.
Х>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект,
Это чушь а не фича.
Х>или ммм... такую "фичу" как множественное наследование,
Когда есть нормальные средства композиции кода (особенно такие как миксины или макросы) оно не нужно. Оно скорее проблема нежели достоинство.
Х>или скажем, статический полиморфизм, слышал о таком?
О статическом не слышал. О параметрическом слышал. Можешь открыть новую страницу истории и поведать миру о статическом полиморфизме.
В общем, не стоит так напрягаться. Этому гнилью даже новый стандарт не поможет. Кстати, где он? (с)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, catBasilio, Вы писали:
B>Здравствуйте, gandjustas, Вы писали:
G>>Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
B> Однажды я участвовал в одном проекте на С++, в котором использовался самопальный сборщик мусора. Причем он был оченб мощный и умел разруливать циклы и всякие сложные зависимости. Так программа с использованием этого gc жрала память как свинья помои. И довольно много времени приходилось искать объект который держал ссылку.
Это еще раз докузывает ущербность C++, этот язык не может работать со собрщиком мусора.
B>Если ты думаешь что в джаве или сишарпе память не может утекать, то ты ОЧЕНЬ заблуждаешься. Там точно также возможны ситуации когда кто-то будет держать объект, из-за этого не будет вызван его деструктор, а из-за этого не будет закрыт ремотный коннекшин ...
Этот "кто-то" умрет, если на него нету ссылок, вместе со всеми объектами, на которые он сам держит ссылки.
И это назвается не лик, а невнимательность программиста.
B>Единственное что в управляемых языках лучше — это невозможность такой ситуации: B>
//говнокод опущен
B>
Это далеко не единственное.
B>но подобные ситуации замечательно лечатся с использованием std::auto_ptr и std::shared_ptr. B>и никакие мемори лики не страшны.
С std::auto_ptr гемора не меньше, чем с указателями. Вместо ликов постоянно получаются AV
А std::shared_ptr далеко не бесплатен.
ИМХО лучше вместо кривых костылей с самописными GC, "умными" указателями и прочей лабудой использовать нормальные языки.
Здравствуйте, gandjustas, Вы писали:
G>ИМХО лучше вместо кривых костылей с самописными GC, "умными" указателями и прочей лабудой использовать нормальные языки.
"нормальные" языки дают оверхед на пустом месте, единственный высокоуровневый язык без оверхедов — С++
Здравствуйте, gandjustas, Вы писали:
G>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем?
потому что бизнес-логика может писатся хоть на скриптах, всем начхать на оверхед, упирается в базу обычно. То что интерфейс лагает слегка — не имеет ни для кого значения. Обсуждалось уже вроде. G>Почему самые высоконагруженные сайты написаны не на С++?
G>Из игрушек кстати Halo 3 вполне на C#.
Пруфлинк. Могу допустить что там игровая логика написана на C#, но движок — никогда.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект G>>Всю константность в С++ можно с успехом обмануть, Х>не понял к чему было про "обмануть", ето тоже самое что грить C# небезопасен потому что есть ансейф
ансейф надо явно писать и можно запретить его запускать.
А попробуй запретить в С++ менять константные объекты.
G>>кроме того константность не является абстракцией Х>называй как хочешь, но вот то что такой нужной вещи нет в C# ето просто поразительно.
Читать больше надо. От константности отказались как раз в силу сложности обеспечения честной константности.
Х>>>или ммм... такую "фичу" как множественное наследование G>>Ага, еще скажи что виртуальный базовый класс — нереальная фича Х>ты начинаешь говорить как заядлый холиварщик, "етого у нас нет потому что можно обойти окольными путями"
Это не надо обходить, этого надо избегать. Множественное наследование реализации является ошибкой дизайна, а множественное наследование интерфейсов и так есть в C#.
Х>>>или скажем, статический полиморфизм, слышал о таком? G>>Перегрузка методов является одим из видов статического полиморфизма, она есть в C# Х>перегрузка методов ето скорее ad-hoc полиморфизм, и до статического полиморфизма тут как раком до пекина, а вот статический полиморфизм в с++ ето скорее похоже на утиную типизацию, и заметь ноль оверхеда.
Ты путаешься в понятиях, статический полиморфизм — когда решение о вызываемом методе принимается в момент компиляции.
При наличии рантаймовой генерации кода можно получить все преимущества как статического, так и динамического полиморфизма. И утиной типизации тоже.
.NET это очень хорошо умеет.
Здравствуйте, gandjustas, Вы писали:
O>> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом, G>А в чем? Зачем скобки переопределять надо?
Ну разумеется, чтобы догнать уходящий поезд ФП, МП и ещё какого-нибудь полного-П. Это ж ежу понятно!
O>>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. G>Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь?
Ну, делегаты C# 1.0 не были реализованы на C++ в ~2001-2003 годах только ленивыми. В итоге всё же остановились на boost-овской реализации.
O>>т.к. хочется сделать красиво, а не можется G>Красиво это как? Нафигачить шаблоков? G>И как на плюсах сделать красиво IoC-контейнер?
Какой именно? В смысле — под какое использование?
G>>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O>> возможность перегружать это от бедности? G>Нет, примерение этой возможности — от бедности. G>В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу.
Значит, если отсутствующую фичу реализовали средствами языка — это, типа, недостаток языка. Ясен пень — язык будет плох до тех пор, пока в него не будет прямо включено всё-всё известное на данный момент во всех доступных комбинациях. А то не ровён час — библиотеку писать придётся. Логика жжот напалмом! Сила слова, да.
O>>>>Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так) G>>>Какой гибкой архитектуры? C++ не умеет интеропать ни с какими другими языками, даже при интеропе с другой либой на С++ могут возникнуть проблемы. O>> ему это и не надо, а для предоставления интерфейса наверх и предоставлен менеджед С++, и ком G>Менеджед С++ вам не поможет, он интеропа между дувумя бинарями не добавляет.
Конечно, поскольку он сам — интерфейс к .Net.
G>COM это хорошо, но мееедлеееенно в случае outproc и небезопасно в случае inproc. Вот тебе и дилемма, выход из которой — managed код.
Какая ещё дилемма? C++ плохо интеропится с C++-ными либами при несогласованном ABI. Проблема и понятна, и решена в большей или меньшей степени. Через старый добрый C-интерфейс он прекрасно связывается с чем угодно.
Кстати, а две виртуальных машины .Net (в смысле — два активных экземпляра .Net FW) разных версий свяжутся друг с другом "естественным" порядком? Или тоже с бубном и интеропом поплясать надо? А .Net с Java естественно стыкуются?
O>>>>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее G>>>За последние 5 лет какое развитие было? O>> фреймворки ж) G>Мы про язык\стандартную библиотеку.
Загляни в boost — там ответ на вопрос по стандартной библиотеке. А то, что сам язык за 5 лет не поменялся — так это очень даже хорошо.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, shrecher, Вы писали:
S>Эти твои утверждения протеворечивы. Тут только одно из двух: либо престанут разрабатывать на C++, что мало вероятно, т.к. очень много продуктов на нем, тогда да — c++ таланты исчезнут; либо, что более вероятно, продолжат разработку и развитие продуктов на C++, и тогда без людей не обойтись.
Если массовым софтом считать софт о котором слышали(или щупали) 20% от общего числа юзеров в мире. Над разработкой такого софта трудится видимо меньше 1% от общнго числа программистов. Кому хочется в этот 1% видимо стоит ориентироваться на С++. Хотя, для опытного разработчика знание языка это вобще то мелочь, нужно на порядок больше чем просто знание языка и нескольких небольших универсальных библиотек.
Здравствуйте, VladD2, Вы писали:
VD>Дык вокруг него такой ореол создали, что несколько лет назад плохое слово в сторону дизайна С++ сразу выливалось в анафему высказавшему эту мысль.
Если человек только начал изучать С++ и ему уже C++ больше нравится чем C# значит он только этот ореол и видел. По тому что на поверхностном уровне между этими языками практически никакой разницы.
Или "логическим" путем вывел : если на C++ писать сложнее => значит он круче.
Здравствуйте, ollv, Вы писали:
O>Сравнивать же менеджед и анменеджед — изначально бредово, т.к. если идет сравнение возможностей, то последние молчат при необходимости работы с МАПИ и библиотеками с ансаппортным диспатч и т.д.
Ну пишите простую COM обертку в качестве медиатора на С++. Делов-то.
O>>>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. G>>Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь? O> А ты подумай немного, ..как реализовывать late fastening в дотнете ? Когда конструирование аргументов, владельцев методов, и создание каскада вызовов разведено во времени? — никак. а через поздний биндинг это решается.
late fastening это что? late binding? http://www.codeguru.com/csharp/csharp/cs_syntax/reflection/article.php/c5881 ну вот Вам late binding на .NET. Делается на порядок проще, лаконичнее и читабельнее, чем на С++.
O>>>а при писанине на дотнете после плюсов всегда чувствуешь тормоза, и ограниченность, G>> G>>Особенно тормоза
Я правильно понял: Вы осознали свою ограниченность и свои тормоза, перейдя с С++ на дотнет? Так это естественно. Чему тут удивляться?
O> ах в бууст даже запятую перегрузили .. ты меня реально утомил. Плюсы на столько гибкий язык, что позволяет имлементить реализации модифицирующие синтаксис, да еще и чик __asm и ты уже там . А тебя это раздражает Да
С++ позволяет имлементить. Это хорошо сказанно. Запишу себе на память цитату, коли Вы не против...
O> опять за рыбу деньги, — фреймворк внесенный в стандарт становится частью языка.
Глупость.
Здравствуйте, criosray, Вы писали:
ГВ>>Вопрос остаётся тем же самым: сколько это будет стоить пользователю. C>Стоимость прямо пропорциональна человеко-часам, затраченым в процессе разработки и в этом плане С++ уже давно в отстающих, при чем иногда очень-очень сильно отстающих...
Началось... Давай вспомним все значения слова "стоимость" и все контексты, к которым его можно привязать.
ГВ>>В новой версии стандарта — поддерживает. C>Поддерживает 1% от ФЯ? Замечательно.
Ух ты. А что это такое — 1% от ФЯ? А почему не 0,76% и не 3,84%?
ГВ>>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо. C>Представьте себе, среди всего многообразия задач очень мало таких, для которых важно выжимать максимальную производительность.
Это как-то опровергает то, что Lisp медленнее C++?
C>Лучшее — враг хорошего.
Бесспорно. На C++ получаются вполне хорошие решения.
ГВ>>Суть вещей — многогранное явление. Для каждого она своя. C>Особенно, если Вы смотрите на вещи сквозь призму непонимания и иллюзии.
Угу, давай теперь углами призмы непонимания начнём меряться.
ГВ>>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта. C>А вот это иллюзии. В программировании крайне важно сохранять "читабельность кода". Ради этого придумывают много умных терминов вроде SRP, DRY, SoC, Open/close principle, cohesion и т.д. и т.п.
С кем-то я совсем недавно спорил по поводу читабельности... А, с Владом как раз. Давай, теперь с тобой. Что такое "читабельность"? Какова связь читабельности и, например, open/close principle?
ГВ>>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). C>и это заметно. Чистота вообще не шибко кого заботит в мире С++ и появляются на свет уродливые творения, где над каждой строкой кода надо раздумывать так же долго, как при чтении Ницше...
Вот те раз, а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы.
ГВ>>Ну, что тут скажешь? Я занесу в шпаргалку Абсолютных Противо-C++-ных Аргументов ещё слова: "ересь", "бред" и "вера". C>Занесите, т.к. Влад абсолютно прав. С++ уродливый и непродуктивный язык и жив он все еще только потому, что у него есть ниша, в которой у него нет достойных конкурентов.
Следовательно, для этой ниши C++ вполне подходящий и продуктивный язык, где ему нет достойных конкурентов.
ГВ>>И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо. C>Это очень плохо. Язык должен развиваться. Посмотрите на С# — кому плохо, что за эти 7 лет на пороге уже 4ая версия языка, где каждая версия — серьезный шаг вперед?..
Будь я разработчиком компилятора того же C++, меня такая ситуация очень бы устраивала (стабильность спецификации). И потом, я не говорил, что кому-то должно стать плохо от того, что C# меняется.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
. S>Обращение не конкретно к ГВ, а к тем, кто пожелает защитить честь неуправляемого кода, или просто помочь человеку разобраться с тем, что он делает не так.
Это не сравнение управляемого и неуправляемого кода, а тестирование подсистем ввода-вывода :)
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Э... Тогда поясни, что имеется в виду под низким уровнем? __asm, void*, арифметика указателей или вообще любые упоминания указателей? G>>1)Ручное управление памятью, надо следить чтобы указатель нигде не повис. Использовать умные указатели или следить чтобы везде вызывался delete G>>2)Арифметика указателей, надо следить чтобы использовались STL-ные итераторы вместо указателей G>>3)Даже с бустом сложные лямбды надо формировать кучей методов bind. G>>4)Небезопасные приведения типов G>>продолжать можно долго...
ГВ>Понятно. Справедливости ради:
Ты опыть не понял о чем тебе толкуют.
ГВ>- арифметикой указателей можно и не пользоваться;
Можно и С++ не пользоваться.
А если пользоваться С++, то постоянно следить чтобы нигде не накосячить, чтобы не использовать арифметику указателей вмето итераторов, чтобы не использовать обычны указатели вместо умных итп.
В нормальных языках за этим следит компилятор и рантайм. В C# для работы с указателями программист должен описать это явно. А вызывающий код может отказаться вызывать, то что небезопасно.
ГВ>- bind — это уже не низкий уровень;
Очень низкий. Связыванием должен заниматься компилятор, а не программист. Для простых типов и арифметических операция в C++ этого удалось добиться, а для всех остальных — нет.
ГВ>- правильные приведения типов (не через static_cast<void*>) никаких нежданных побочных эффектов не имеют.
Введение дополниельных конструкций для "правильного приведения типов" уж точно не свидетельствует о высокоуровневости языка.
В остальном аналогично указателям.
?
Хочу. Код также свидетельствует о черезмерной низкоуровневости С++. Метаинформацией о типах дожен заниматься рантайм, а не программист.
Все остальное — действительно задача, которая решается неочень опытным программистом в короткое время.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Я писал такой тест в этой теме, смотри выше, C++ слил в 3-6 раз. Это без шаред птр G>>А потом прибежали другие и начали рассказывать что они динамическую память не выделяют и создают все на стеке CC>Ты мерял там на самом деле разницу в производительности GC и WinAPI функции HeapAlloc. CC>А никак не работу с shared ptr.
Ну а shared_ptr вносит дополнительный оверхед.
G>>Ответь на вопрос, нафига MAPI в .NET? CC>Вот хочется ему. Представь что он заказчик и ему надо именно MAPI.
Если заказчик диктует технические решения, то я с таким не связываюсь. И другим не рекомендую.
G>>Возьми DLL, скомпилированную Intel C++ Compiler и напиши в visual studio код, который создает объект из этой либы — придет понимание. CC>ICC манглит имена так же как и визжалка. Так что никаких проблем не ожидается.
И что, можно прямо так просто взять и создать объект, реализация которого лежит в другой DLL?
Здравствуйте, samius, Вы писали:
S>Если кто так не сделает, то его код будет работать медленнее, чем C++ и ему никак не догнать плюсы по перфомансу, что означает конец карьеры программиста :(
На самом деле, это все (и еще много чего другого) я делаю когда пишу на C++, если надо написать действительно быстрый код. То что Вас это забавляет показывает только то, что с задачами, критичными по скорости Вам сталкиваться не приходилось. Увы...
Здравствуйте, VladD2, Вы писали:
C>>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
VD>Этот пример справедлив и для настольного фрэймворка последней версии. Ты вчитайся в код. Там не о экономии на вызове метода речь идет. Там речь о том, что не надо устанавливать размеры окна в два приема, если тоже самое можно сделать за один прием.
Да это не важно. Суть, что человек пытается судить о производительности .NET FW по .NET CF 1.0, что есть полная глупость. Это в духе того сравнения, которое сделал Шеридан недавно: что мол GUI на виндовом сервере тормозит сервер потому, что на его криво настроенном линуксовом сервере X Window подсистема кушает 10% процессорного времени...
Здравствуйте, VladD2, Вы писали:
COF>>Я просто стараюсь избегать преждевременной пессимизации кода. В итоге, наши программы работают лучше программ конкурентов, что приносит вполне ощутимое конкурентное преимущество.
VD>Это полнейший лам. Ты ни грамма не ускоришь программу этими глупостями.
Это культура. Если одинаково просто написать ++j и j++, for( int j = count; j-- > 0; ) и for( int j = 0; j < count; j++ ), то при прочих равных надо выбирать оптимальный вариант — это и называется избегать пессимизации кода. Лам — это, с одной стороны, делать такие микрооптимизации в ущерб чему-то более важному, с другой стороны — осознанно на них забивать, типа и так сойдет.
Здравствуйте, gandjustas, Вы писали:
G>Вполне возможно что вместо прохода по массиву каждый раз надо было результаты вычислений закешировать или, например, использовать другие структуры данных для улучшения ассимптотики вычислений.
G>Кстати. Твой знакомый работал и никого не беспокоило быстродействие кода, а ты в первую очередь занялся "выпрямлением интерфейсов", что сократило простор для алгоритмической или архитектурной оптимизации.
Нет, мне надо было реализовать некую новую функциональность, в процессе выяснилось, что существующая реализация недостаточно для этого гибка. Поэтому пришлось сделать рефакторинг определенных интерфейсов и модулей. Как побочный эффект выросла и скорость. На ровном по сути месте. Вообще, я не верю в подход — сделай как-нибудь, потом запустим профайлер и посмотрим где тормозит. Скорее всего, окажется, что тормоза равномерно распределены по всей программе. Часто говорят, что о безопасности надо думать с самого начала и всегда, невозможно небезопасную программу сделать безопасной. Вот то же самое, я уверен, можно сказать и о производительности — о ней надо думать всегда.
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>Нет таких ссылок и быть не может. Потому как это бред. Стоимость вызова микроспопически мала. Ее можно заметить на вызове методов-пустышек в цикле. А их то как раз отлично оптимизирует (инлайнит) JIT.
ГВ>Судя по всему, не всё JIT оптимизирует и не всегда.
Вам не надоело кидаться какашками? Вроде никто не утверждал, что управляемые языки есть серебрянной пулей, но они дают разумный компромис и с учетом того, что компьютерное время все более и более дешево в сравнении с человеко-часами, затрачиваемыми на разработку, будущее — однозначно за управляемыми языками. Более того, я уверен, что нам предстоит еще увидеть полностью управляемые ОС типа Singularity.
Продолжим общение, когда Вы смените хамский тон на нечто более цивилизованное.
ГВ>Хм. Уж, по-моему, если у кого резьбу и срывает, то это у хулителей C++. Тебе цитаты привести или сам найдёшь? И вообще говоря, называть рекомендации Microsoft "какашками" — это сильно, да. Учту, что ссылка на MSDN может быть приравнена к хулению. ГВ>Отлично, очень рад. Кто-то утверждал обратное (обратное "разумному компромиссу", а не "будущему за...", разумеется)? ГВ>Ну и отлично ещё раз, возьми с полки пирожок. Думаешь, я собираюсь спорить с твоей уверенностью?
Здравствуйте, Хвост, Вы писали:
VD>>Собственно, что и ожидалось. Недолямбды в недоязыке. VD>>
VD>>Of course, if a lambda function object outlives local variables that it has captured by reference, you get crashtrocity.
Х>во-первых, ето полноценные лямбды и полноценные замыкания,
Ага. Для тех кто настоящие не видел.
Х>во-вторых, тебе как к очередному фанату управляемой памяти вопрос,
Фанат это тот кто хвалит даже полное дерьмо лиш на том основании, что он фанат этого дерьма. Я же оцениваю вещи по их качествам.
Х>где написано что замыкания обязаны захватывать контекст по ссылке и никак иначе?
Захват должен быть максимально прозрачным и не нагружать сознание. Детали вроде "по ссылке" или "по значению" засоряют главное достоинство лябды — простоту использования. Программист просто должен создать лямбду и передать ее куда-то или возвратить откуда-то. Если при этом ему прийдется слудить за временем жизни захватываемых значений, то простота использования будет потеряна, а значит и весь кайф лямбды. Если захватываемые значения просто копируются, то многие сценарии использования будут недоступны, да и производительность может пострадать. Плюс копирование может само по себе привести к ошибке.
Реализация предлагаемая в C++0x — это недо-лямбда. Что в полне вписывается в концепции недоязыка — плевать на безопасность и удобсво ради производительности.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
VD>>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов. Х>ой ли, ты часто передаёшь лямбды после выхода из scope?
Если ты хотел сказать возвращаешь лябды из функций, то таки — да. Например, весь linq реализован на идее отложенных вычислений и комбинирования лямбд.
Х> как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность...
Смешно тебя слушать. Передача контекста по ссылке без автоматического управления памятью обеспечивает исключительно UB, а стало быть проходы по памяти и бессонные ночи в отладчике.
А экстремальную производительность обеспечиваеют исключительно применение качественных алгоритмов и библиотек. Отсутствие GC затрудняет создание как первого, так и второго.
Х> (нет боксинга для стековых объектов как в дотнете, ага).
Ого какие слова ты знаешь!
Дело за малым, осталось понять что за ними скрывается и когда он происходит.
Х> Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста,
Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох). И когда этот стандарт появится, и каким он будет пока не ясно, потому как комитет это шесть или более ног и полное отсутствие мозга (с) Хайнлайн.
Х>причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.
Да. Ты полностью прав. Такий лямбд нет ни в одном языке. Такое не пришло в голову даже изобретателям весьма экстравогантного Лиспа. Надо было писать стандарт 12 лет, чтобы тупо забить на безопасность и допускать UB в банальном коде.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке. ГВ>Тормозами тоже пугать никого не надо. (<- косность мозга, тузик, тряпка)
Хоспадя, да нет там боксинга. Один ни черта не разбирающийся ляпнул, другой зачем то ответил, третий зацепился...
Здравствуйте, Геннадий Васильев, Вы писали:
G>>В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC. ГВ>Величина этого оверхеда — вопрос с трудно предсказуемым ответом.
Тем не менее он есть.
G>>Не получится сделать в C++ сборщик мусора, сравнимый по быстродействию с .NETовским. ГВ>Ой, сомневаюсь.
Не сомневайся. Если бы можно было на С++ сделать хороший сборщик мусора, то его давно бы уже сделали.
G>>В итоге пришли к тому же: С++, даже в новом стандарте, позволяет эффективно использовать только подмножество лямбд.
ГВ>Угу, то есть тезис о неполноценности лямбд в C++ снимается повестки дня. Уже что-то.
Ничего не снимается. Лямбды и там и есть неполноценные. Возможность сымитировать полноценные лямбды эту ситуацию не меняют.
ГВ>А то, что там где-то что-то побыстрее, где-то что-то помедленнее — так на то они и разные языки: C++, C#, Java, Haskell... Чтобы где-то выигрывать по отношению друг к другу, где-то проигрывать.
Тут вопрос не только в скорости работы. Имитирование полноценных лямбд будет порождать громоздкий и\или ненадежный код.
Здравствуйте, gandjustas, Вы писали:
G>>>В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC. ГВ>>Величина этого оверхеда — вопрос с трудно предсказуемым ответом. G>Тем не менее он есть.
Он везде есть — больше или меньше.
G>>>Не получится сделать в C++ сборщик мусора, сравнимый по быстродействию с .NETовским. ГВ>>Ой, сомневаюсь. G>Не сомневайся. Если бы можно было на С++ сделать хороший сборщик мусора, то его давно бы уже сделали.
Дык, он как неуловимый Джо:
- Что, никто написать не может?
— Да кому он нужен?
G>>>В итоге пришли к тому же: С++, даже в новом стандарте, позволяет эффективно использовать только подмножество лямбд. ГВ>>Угу, то есть тезис о неполноценности лямбд в C++ снимается повестки дня. Уже что-то. G>Ничего не снимается. Лямбды и там и есть неполноценные. Возможность сымитировать полноценные лямбды эту ситуацию не меняют.
Понятно. Библиотечная философия C++ тебе претит. Ну что ж, на вкус и цвет...
ГВ>>А то, что там где-то что-то побыстрее, где-то что-то помедленнее — так на то они и разные языки: C++, C#, Java, Haskell... Чтобы где-то выигрывать по отношению друг к другу, где-то проигрывать. G>Тут вопрос не только в скорости работы. Имитирование полноценных лямбд будет порождать громоздкий и\или ненадежный код.
Понятно. Но эту сказку про C++ рассказывают с регулярностью, достойной лучшего применения, всё то время, пока я на нём программирую — все 14 лет. Тут, знаешь, что ни язык, так непременно его апологеты апеллируют к тому, что на C++ всё глюкаво, громоздко и ненадёжно. Так что, не ты первый, не ты последний.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Гы-гы.
ГВ>>
ГВ>>auto isWithinRange = [](int x) -> bool { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
ГВ>>
ГВ>>vs.
ГВ>>
ГВ>>inline bool isWithinRange(int x) { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
ГВ>>
ГВ>>Обрати внимание, функцию с именем isWithinRange невозможно подменить в рантайме.
S>Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров.
А ведб не все так просто. Я некоторое время размышлял над полезностью и вредом при использовании лямбд. Использование функторов и функций ненавязчиво подталкивает к обобщенному коду и переиспользованию.
"Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров." не всегда является достаточным аргументом, например
Глобальные переменные удобнее тем, что их можно использовать из любого места и не придется передавать как толпу параметров.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Гы-гы.
ГВ>>>
ГВ>>>auto isWithinRange = [](int x) -> bool { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
ГВ>>>
ГВ>>>vs.
ГВ>>>
ГВ>>>inline bool isWithinRange(int x) { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
ГВ>>>
ГВ>>>Обрати внимание, функцию с именем isWithinRange невозможно подменить в рантайме.
S>>Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров.
M>А ведб не все так просто. Я некоторое время размышлял над полезностью и вредом при использовании лямбд. Использование функторов и функций ненавязчиво подталкивает к обобщенному коду и переиспользованию.
Ну прям мыслитель.
Как поможет обобщенный код в процитированном примере, если SOMETHING_LOW и SOMETHING_HIGH зависят от контекста?
M>"Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров." не всегда является достаточным аргументом, например
M>Глобальные переменные удобнее тем, что их можно использовать из любого места и не придется передавать как толпу параметров.
Сравнил говно с манной кашей, молодец. такими аналогиями иди пугать детей в детском саду.
Здравствуйте, gandjustas, Вы писали:
Х>>какие оверхеды? концепция с++: не плати за то что не используешь, G>Да ну, а O(n) при выделении и освобождении памяти?
здесь поподробней пожалуйста, что имеется ввиду?
Х>>в случае с с++ лямбдами исполнено на 100%, G>На 200%, лямбд просто нету Есть только жалкое подобие.
может ты найдёшь определение lambda в интернет и перестанешь нести ахинею?
Х>>в дотнете же оверхеды на ровном месте, т.е. беспричинно, в силу его устройства. G>А примеры будут? или опять пердение в лужу?
да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед.
Здравствуйте, gandjustas, Вы писали:
Х>>здесь поподробней пожалуйста, что имеется ввиду? G>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно.
Ключевое слово — пул.
G>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении.
Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении.
G>Ты прочитай 3 предыдущие страницы. Нормальные лямбды подразумевают лексические замыкания, которых нету и не будет в С++.
Повторение тезиса, как известно, поднимает его истинность в геометрической прогрессии.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>OK, принято. ИМХО, самый серьёзный недостаток такого способа — потенциальные заморочки с циклическими зависимостями. Ну что же, действительно, опциональный (библиотечный) GC иной раз не помешал бы. В принципе — не помешал бы. Другое дело, что острота потребности в GC, ИМХО, невероятно преувеличена. Вот тут, честно тебе скажу, доказать ты её (острую потребность) не сможешь. Потому что придётся доказывать, исходя из субъективных моментов, а субъективно как раз таких проблем нет — C++-ники привыкли управлять своими объектами и им это вполне удаётся. Хорошим C++-никам — удаётся, а кто не умеет — тот плохой C++-ник, и к его мнению не особо прислушиваются. G>Как раз таки привычки субъективны. А потребность в высокоуровневых языках в большенстве задач очень объективна.
Приехали. C++ — высокоуровневый язык. Или вы хотите поговорить о DSL? Ну давай, поговорим про DSL.
G>Но при этом существует достаточно много программистов на С++ со своим субъективным мнением.
Если мнения этих программистов хватает, чтобы решать поставленные задачи, значит, потребность в языках местами преувеличена, т.е., не всегда объективна. Сам понимаешь, материя "потребности" тонкая, весьма зависимая от "интеграла по субъективным суждениям".
ГВ>>ИМХО, потому про GC хоть и поговаривают, но не особо. G>Еще раз. Не получится на C++ сделать CG с характеристиками, близкими к .NETовскому. G>Сам язык должен быть рассчитан на работу GC. G>Практически любая реализация GC на C++ будет вносить достаточно большой оверхед чтобы отказаться от его использования.
Не совсем так. Дело в том, что GC для C++ не должен решать задачи управления абсолютно всеми объектами и никто ничего такого и не предлагает. Но для каких-то отдельных моментов он вполне может оказаться приемлемым решением, лучшим, чем reference counting. Ключевое слово: "какие-то отдельные моменты".
И конечно, не буду спорить с тем, что для того, чтобы GC совсем органично вплетался в язык, сам язык должен быть изначально спроектирован для использования GC.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
Х>>Здравствуйте, gandjustas, Вы писали:
G>>>А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер? Х>>даа, вся программа состоит из аллокаций в хипе, такую ещё поискать надо, а как же твои незабвенные 10% кода отнимают 90% ресурсов? или ето не распространяется на высоконагруженные сервера? G>Не путай. 10% кода выполняются 90% времени в вычислтеьных задачах. G>При высоких нагрузках надо оптимально управлять ресурсами.
ну вот, пошли уточнения про вычислительные задачи а уж если надо оптимально управлять ресурсами то использовать C++ ето сам бог велел.
Х>>ещё раз про замыкания, в c++ ты можешь скопировать весь контекст (синтаксис [=]) и ето будет идентично по семантике с некоторыми лиспами, которые тоже копируют контекст, а не ссылки. Так с чем ты не согласен? то что С++ позволяет программисту оптимально оперировать контекстом? и там где не нужно копирование воспользоваться ссылкой? да, в случае ссылок программист должен учитывать время их жизни, но ето в мире с++ есстесственно, и от етого очевидно лямбды не меняют своего называния. G>Мда.. G>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего.
да что же ты будешь делать, повторяю, три раза: контекст может копироваться, копироваться, копироваться.
т.е. в лямбду скопируется значение переменной на стеке
для закрепления:
копироваться может контекст
не только по ссылке а и по значению
копироваться
контекст
по значению
запомнил?
G>Читай выше и внимательнее.
читай выше и внимательнее
Х>>>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность G>>>Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету. Х>>я рад за тебя что у тебя нет проблемм с производительностью, а в коде над которым я работаю нет утечек памяти, и явные delete можно пересчитать по пальцам, и что? G>И кто же память освобождает? shared_ptr, так они оверхед создают...
ух-хаха, я вообще не использую shared_ptr, представляешь? удивительно, да?
G>А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed.
есть статистика, что на десктопах пользователей подавляющее большинство приложений — unmanaged, ето на мой взгляд самая лучшая статистика.
Здравствуйте, gandjustas, Вы писали:
G>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать)
Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)? Х>пул потоков обычно нативный, причём здесь С++? зелёные треды очень хороши для серверов, ага))) хип за O(1) ? в С++ можно аллоцировать память в хипе вообще один раз и на всю жизнь, и обеспечить свой микроменеджмент, при етом рефакторинг кода сведётся фактически к find/replace.
Ну как всегда все вручную...
Только при ручном управлении ресурсами сложность программы может оказаться такова, что за всю жизнь не напишешь.
Х>>>ух-хаха, я вообще не использую shared_ptr, представляешь? удивительно, да? G>>И что же ты используешь? Х>для шареных объектов? ты знаешь, если грамотно реализовывать софт, и продумывать время жизни, то оказывается и не так уж много мест где одним и тем же объектом владеют (именно владеют) сразу несколько других, в подавляющем большинстве случаев есть какой-то холдер объектов, который раздаёт объекты другим, причём время жизни етих других много меньше времени жизни холдера. Всё ето потому что shared_ptr ето недетерминизм, т.е. время жизни объекта не определено, нельзя взглянуть на код и сказать — вот в етом месте объект мёртв. Ето плохо. Довольно редко но всё же такие ситуации возникают, тогда можно взять shared_ptr или лично я использую обёртку вида intrusive_ptr над ручным вызовом mySubsystem->release(object). Но есчё раз — ети ситуации очень редки. 99.9% объектов в хипе у меня живёт в std контейнерах, auto_ptr'ах, пулах и аренах. Шарятся множество объектов разных типов, но вот шарятся с семантикой владения пара-тройка, и то ето не необходимость, а скорее кривость.
Да уж. Легче объявить совместное владение объектами кривостью, чем признать что это родовая травма в С++.
G>>>>А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed. Х>>>есть статистика, что на десктопах пользователей подавляющее большинство приложений — unmanaged, ето на мой взгляд самая лучшая статистика. G>>Эта статистика очень слабо связана с техническими аспектами. Обсуждали уже сотню раз. Х>конечно, ты вот наверное не застал времена былинные, а вот я тебе расскажу, в году едак в 96-м, когда вышла жава, С++ хоронили все кому не лень, в 98-м, когда вышла студия с J++, миллионы мух кинулись на жаву, "С++ устарел, на дворе Pentium II с 32 мб, а жаве и 4 мб с головой, и не надо думать об утечках памяти, тысячах реализаций строк, системной работе с потоками, с гуём, всё межплатформенно, блаблабла.... рай на земле... етц", был и свой сильверлайт, только назывался java applet, так вот, жаве уже второй десяток давно пошёл, а на десктопах её всё как-то не особо, и жаваапплетами интернет не полон, а десктоп полон нативными С++ приложениями, а интернет нативным С++ флешем, хотя вот жава она ведь по-твоему намного лучше с++, верно? задумайся почему всё ето так, пойми и осознай, что производительность — ето ресурс, и будет им во веки веков, и процессор, который быстрее в два раза другого, стоит в 3 раза дороже, и юзер выберет программу которая может выполнять три функции параллельно а не две.
Юзеры выбирают программы, которые решают их задачи. Большенству плевать что такая же программа будет выполняться в 10 раз быстрее. Причины, по которым софт на десктопах нативный далеки от технических.
Задумайся, почему в бизнес-приложениях нативного почти нет, хотя производительность там гораздо важнее и гораздо тяжелее добиться высокой производительности в крупных бизнес-системах.
Задумайся почему веб практически полностью отказался от нативных приложений в пользу managed.
Ты осознаешь что бизнес- и веб-приложений на данный момент на несколько порядков больше, чем десктопного софта?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, CreatorCray, Вы писали:
G>>>Твой наколенный непотокобезопасен. CC>> CC>>Жжошь! CC>>Можно узнать с какого перепугу ты так решил? Х>ну как же, ведь всё что быстрее гц ето заведомо непотокобезопасно и вообще UB Х>кстати результат гц просто удручает, всего в полтора раза быстрее VC-шного CRT-аллокатора, и ето быстро??? абберация налицо
Мда.. 30% оверхеда на жоступ к массиву это ой какие тормоза (кстати где код?), а в полтора раза быстрее — это "всего".
Вам, батенька, в политику надо. Там двойные стандарты и подтасовки во всю используются.
Здравствуйте, VladD2, Вы писали:
ГВ>>>>Расскажи это лисперам. В лиспе исторически замыкания создавались копированием используемых переменных. ГВ>>Ну, поскольку я знаю твою манеру ведения дискуссии, то обращаю внимание на слово "исторически". А если точно, то я отсылал к common lisp чёрт-те какой давности. В современных диалектах, AFAIK, это уже не так. VD>Демагог, есть демагог. Нет никакого исторического наследния CL.
Дык. Наследия нет, а наблюдения очевидцев — есть (см. Э. Ховёнен, Й. Сеппянен, "Мир Лиспа", М.: 1986 — почему-то к этим славным финнам у меня доверия поболе, чем к даже к Грэхему). Это лишний раз доказывает, что интерпретация "единственно правильного поведения" замыкания сильно зависит от.
VD>CL — это стандарт вышедший таким каким он есть.
Диалект под названием "Common Lisp" существовал задолго до принятия стандарта ANSI.
VD>И вообще, твои слова банальная демонстрация некомпетентности. Лисп изначально имел сборщик мусора и стало быть делать урезанные в нем не имело никакого смысла.
ИМХО, очень даже имело смысл делать такие специфические замыкания. Напоминаю об "иммутабельной природе" функционального программирования.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>>см. Э. Ховёнен, Й. Сеппянен, c, М.: 1986
ГВ>В СССР книга вышла в 1990 г. 1986-й — это финское издание.
Ты бы еще на китайцев сослася бы. Вытянул какую-то бредятину и на ее основании с умным видом вывел целую теорию.
Лексические замыкания в CL появились из Схемы. И было это в 70-е.
Эти фины описывали черти-что сбоку бантик.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, samius, Вы писали:
S>>Я ж написал, что не уверен в случае одноядерной машины. Но что в многоядерной его точно нет. А ты сказал, что все наоборот. Вот и рассказывай нафига интерлокед на многоядерной машине. CC>Да потому, что интерлокед как таковой только для многоядерной и нужен.
CC>Безотносительно к принципам организации менеджера памяти в .NET
Ненене, вопрос конкретно в том, нафига интерлокед нужен многоядерному GC? Не виляй. Речь шла именно о GC. И "наоборот" писал ты!
Я допускаю, что в случае одноядерной системы я ляпнул что-то не то. Уже дважды написал, что не уверен! Но ты не написал что не уверен, когда писал что все наоборот. Вот давай, объясняйся
CC>Неправильно только одно: зачем на С++ реализовывать такой аллокатор?
Речь шла не об «зачем», а об «какой угодно» и «вообще любой».
CC>Неправильно только одно: зачем на С++ реализовывать такой аллокатор?
Чтобы ускорить аллокацию. В такой модели менеджер будет катастрофически быстро выделять память всегда в конце пула, а не искать в цепочках чанков дыры подходящего размера от освобождённых ранее объектов.
CC>Пользы от него будет меньше чем неудобств.
В C++, очевидно, да.
CC>Более того, зачем его реализовывать как глобальный?
Ок, пойдём на уступки. Не надо глобальный, пусть будет просто аллокатор, удовлетворяющий требованиям из пункта «Allocator Requirements» Стандарта.
CC>К примеру стоит прикручивать нечто подобное только для алгоритмов, у которых фрагментация памяти является побочным эффектом.
Во-первых, совсем непросто вычленить такие алгоритмы, да и неблагодарное это дело.
Во-вторых, даже если мы сумели выделить такой алгоритм, мы не можем вызывать функции (в том числе стандартные), которые принимают аргумент по ссылке. (У меня крутятся мысли о том, как это можно было бы обойти, но это очень далеко от «какой угодно» и «вообще любой»).
CC>Еще раз говорю: не надо тупо копировать идеи и подходы из других платформ.
...в платформы, крайне плохо для того предназначенные.
V>>> То, что делается на C++, на C# в принципе нельзя реализовать.
M>>Так как оба языка Тьюринг-полные, то сомнительно
NBN>Языки то да. А костыли для шарпа не везде есть и не везде подходят. NBN>См. те же игры, ембеддед/мобилы/покеты и кроссплатформенное программрование.
NBN> M>Мы говорим про монополию или про утверждение NBN> M>
NBN> M>То, что делается на C++, на C# в принципе нельзя реализовать.
NBN> M>
NBN> M>? NBN> M>
NBN> В принципе тоже — например: быстрое, кроссплатформенное и полнофункциональное приложение на C#.
Вопрос времени. Огромное количество ниш занято другими языками — от С++ до Явы. Пока что С# в эти ниши только протискивается: от утилит типа iFolder до игр типа The Sims 3, (по слухам), до 3D-редакторов, до jabber-серверов. На Яве тоже вон «было невозможно сделать то же, что на С++», ага. C# идет той же дорогой.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>А тут нельзя согласиться или не согласиться. Ты сам придумал и сам сделал какие-то выводы. С чем я тут могу соглашаться или не соглашаться? ГВ>Ну, завелся патефон... ГВ>Угу, угу — пластинка виниловая, потёртая и трещит.
И Вам сказать по сути нечего? К чему этот пустой трёп?
Ценность данного графика в контесте данного спора близка к нулю
Например, на том же RSDN вопросы по покетам задают восновном в контестке CF. Однако вопросы задают восновном нубы (создают статистику), а профи пишут на С++ (реальность).
VD>Теперь я тебе открою правду о шаблонах. VD>1. Шаблон — это не более чем синтаксический препроцессор который позволяет во время компиляции подставить что-то вместо плэйсхолдеров. Так вот есть куда более мощьные системы типов (например, система типов Haskell) на фоне которых препроцессор вроде С++ просто меркнет.
С какой это радости система типов более мощная? ИМХО, гораздо более простая, в плане параметрических типов (мощная она по сравнению с Nemerle разве что). Или ты считаешь, что если пользовательские типы ограничить только до алгебраических, то система типов от этого мощнее становится? Она становится проще гораздо и ограниченнее.
VD>2. Есть куда более мощные синтаксические препроцессоры (например, Nemerle и Лисп) которые по возможностям и удобству рвут С++ как тузик грелку. К примеру, я воспроизвел linq из спецификации C# написав два макроса. С++ такое сделать не может в приципе.
И? 99.99% языков такое сделать не могут в принципе, ибо давать дорабатывать компилятор простым программистам — это спорное занятие. Не зря на Лиспе и Форте не так уж много людей лабали.
С# 5/6/7 тоже мочь не будет однозначно, эта фишка "не на каждый день", в массы его вряд ли выпустят.
VD>3. Кроме того шаблоны в С++ были задуманы как средство релизации параметрического полиморфизма. Оных намного лучше реализован почти во всех языках в которых он вообще реализован. И те же дженерики тоже лучше шаблонов за исключением пары неудобств.
Дженерики слабее на порядок примерно, не знаю, откуда ты берешь свое "лучше"? Банально хрен обобщишь алгоритм на float и на double, а тебе от этого лучше. Реально и с размахом эти дженерики используются только по одному назначению — улучшить статическую типизацию, дабы меньше было динамической или тупого боксинга на ровном месте — офигенная, однако, у нас разновидность полиморфизма-то.
У меня за эти годы сложилось четкое убеждение, что дженерики — это способ обходить перечисленные недостатки платформы .Net, не более того.
VD>А уж параметрический полиморфизм в современных ФЯ сделан несравнимо лучше шаблонов С++.
Голословие. Если по возможностям — то так же или хуже (где есть явная специализация — то примерно так же, где нет — хуже). "Лучше" разве что по минималистическому синтаксису всего одного языка. Дык по этому критерию и Немерле — убожество еще то.
VD>Просто использование шаблонов выходит за рамки параметрического полиморфизма и входят в область метапрограммирования. Но в этой области безоговорочно царят макросы. И убогим возможностям С++ тут делать не чего.
Ты то отсылаешь к Хаскелю и ОКамлу, то называешь языки без макросов убогими (значит и их тоже). А ведь системе типов Немерле даже до Хаскельной как до луны раком. В общем, более чем сумбурно.
VD>Если же серьезно говорить о метапрограммировании, то С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
Не надо из МП делать священную корову, иногда и просто попрограммировать надо. У вас в том большом реальном проекте доля МП так себе, прямо скажем. А все остальные многие и многие тыщщи строк делать на Лиспе — увольте и в пример больше не приводите.
И что касается макросов, то Лисп тут проигрывает даже Форту, по удобству пользования этой фичей... Так что, отличное вышло у тебя пюре, надо сказать.
Здравствуйте, vdimas, Вы писали:
S>>А моки вообще не в почете?
V>Что-то слишком много чести им в последнее время... Хотя до сих пор наиболее популярные во всем мире моки — это ручные моки, они же заглушки и этому способу тестирования учат у нас вроде на 3-м курсе.
V>Просто надо четко понимать, что автоматически-генерённые моки — это костыль по сути, для ситуаций чудесного дизайна, когда одно гвоздями прибито к другому.
С точностью до наоборот — нормальные моки и стабы генерируются автоматически. т.к. автоматическая генерация исключает возможность допустить ошибку или не учесть чего-то.
V>А так, там где можно обойтись в юнит-тестах классичесскими ассертами — это и синтаксис нагляднее, и проще поддерживать.
Вы вообще не понимаете что такое юнит-тесты. Не надоело показывать неграмотность?
V>У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась.
Перечень того, что не возможно сделать средствами RhinoMocks + xUnit в студию, как говорится.
Здравствуйте, samius, Вы писали:
S>Моки и заглушки — разные вещи, использующиеся в разных сценариях тестирования.
Садись, два.
Роутеры и маршрутизаторы с этой же точки зрения тоже разные вещи, использующиеся в разных местах сети.
S>Разве речь о Вас в совокупности с тупым диспетчером сообщений?
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>ЗЫ. Я уже писал в этой теме тест, который меряет выделение памяти стандартным аллокатором. .NET выигрывает.
H>Ты так часто это повторяешь, что скоро и сам поверишь...
Зачем мне верить, у меня результаты тестов есть.
Это вот плюсистам надо верить что их код всегда быстрее.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>>>Насчет порядка на Ruby? Тебе на заметку — простейший шумоподавитель на .Net работает в 3 раза медленнее, чем на С++, микшер конференции на C# — в 3-5 раз медленнее, чем на С++. Не думаю, что я сильно ошибся относительно Ruby.
G>>1)Ну приведи код на C++ и C#, дающий такой результат. Хотя сомневаюсь что будет C++, будет тупо С, обернутый в класс и никаких шаблонов, STL, полиморфизма.
V>Там и на C# варианте никаких генериков в этом месте, полиморфизма и System.Collection.Generic. Что сказать-то хотел?
То что С++ (именно с плюсами) нах не нужен. Для быстрых числомолотилок берем код на C и нормально зовем его из любого языка. Для более высоких абстракций берем более подходящие языки.
Кроме того уже не за горами запуск числомолотилок на GPU, там тоже высокоуровневые языки будут более уместны, так как позволят генерить код для GPU в рантайме.
VD>>Ну, а главное, что есть софт который в условиях ограниченных ресурсов вообще нельзя реализовать на С++ (костьми ляжешь). NBN>Оно же верно и для шарпа, поэтому я на него так и не перешёл
Ага. Есть такие задачи. Только если расставить языки в линейку по уровню, то С++ будет сильно позади того же шарпа, так что если задача сложна для шарпа (и это не вызвано С-шным (или еще более низкоуровневым) АПИ, то она априори более сложна и для С++.
NBN>Игры, кроссплатформенные приложения, некоторые виды миддлеваре
Бредишь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
AB>>Я просто знаком с фанатизмом Влада,
VD>Чья бы корова мычала. Споришь с очевидными фактами и при этом имеешь наглость обвинять других в фанатизме.
Влад, я пришел к выводу, что спор с господами типа Антона Батенева, вдимаса, Геннадия Васильева и т.д. — местных аппологетов С++, это пустая трата времени и сил. Аргументов Вы от них все-равно не услышите, а все даже самые простые факты они буду с завидным упорством отвергать. К тому же спорят-то они о вкусе устриц...
Не тратьте время. Они все-равно будут верить только в то, во что хотят верить. Переубедить их сможет только жизнь.
Здравствуйте, FR, Вы писали:
FR>Неубедительно учитывая горячую любовь игроделов к интеловскому компилятору, который подобные вещи хорошо векторизует, плюс не менее горячую любовь к интрисикам тех игроделов которые не любят интеловский компилятор
Кстати, рассуждения о любви подкреплены какой-то статистикой или как всегда высасывание из пальца?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
C>>Не тратьте время. Они все-равно будут верить только в то, во что хотят верить. Переубедить их сможет только жизнь. S>А как же трофеи?
Здравствуйте, FR, Вы писали:
FR>Да ладно меряли уже не раз, даже если писать шаблоный qsort один в один с сишным плюсовый все-равно выигрывает, за счет агрессивного инлайнинга.
Это чушь хотя бы потому, что компиляторы С и С++ — это в большинстве случаев одни и те же компиляторы. По крайней мере лидеры MS и Intel поступают именно так.
VD>>Кстати, на пример C vs. C++ можно можно спроецировать все сказанное о C++ vs. C#. Ведь на С всегда можно написать код не медленнее чем на С++. Проблема только в трудоемкости.
FR>Можно, и кстати не мало пишут, но опять таки разница между C++ и Си тоже не так велика, хотя и больше чем между С++ и шарпом.
Опять вопрос оценок. Я считаю, что ка раз разница примерно сравнима. В одном случае нам дают ООП и обобщенное программирование, в другом компонентность, автоматическое управление памяти, встроенные в язык запросы, полноценные лямбды.
В прочем, важен сам факт, что ты согласился по существу и оспариваешь только коэффициенты влияния.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>От размеров конечно зависит. Чем больше проект, тем менее рентабельно реализовывать его на С++. От сферы не зависит.
ИМХО чушь. Чем крупнее проект, тем меньше значение какого-то конкретного высокоуровневого языка. А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами.
Здравствуйте, NikeByNike, Вы писали:
NBN>ИМХО чушь. Чем крупнее проект, тем меньше значение какого-то конкретного высокоуровневого языка. А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами.
Чушь — твое ИМХО. От уровня языка зависят и проектные решения, и объем кода который требуется написать, отладить и документировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hattab, Вы писали:
VD>>Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
H>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами.
Из чего сделано выделенное предположение?
Что мешает компилятору на Руби выдавать под LLVM, или сразу в машинные инструкции?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
G>>Я имею ввиду не использование компилятора С, а неиспользование возможностей C++ — классов, шаблонов, динамической памяти и прочего. G>>Для числомолотилок оно и не нужно.
V>Во-первых, ты так и не объяснил мотивы, во-вторых, без нормального инлайна любая числомолотилка отсосет. Вот возьми класс complex, не представляю себе код для него без переопределённых инлайн операций. Вызывать что-ли ф-ии типа complex_add_double(arg1, arg2)? Это будет уже не числомолотилка, а тормозилка.
Если complex_add_double — макрос, то будет умеренно быстро с любым компилятором, кроме того никто не запрещает брать современный C++ компилятор и отключать манглинг для экспортируемыхметодов.
А мотив очень простой. Голый C интеропается с программой на любом языке. Если не использовать динамическое выделение памяти, указатели, наследование, полиморфизм и шаблоны и прочую высокоуровневую лабуду, то пропадают все проблемы, присущие C++.
Кроме того, повышается переносимость кода. При удачном стечении обстоятельств можно взять код на С и запустить его на видеокарте с помощью CUDA.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Группа маленьких модулей логически объединена в общий модуль, с которым программа работает через некоторый интерфейс. Этот сборный модуль тестируется отдельным набором тестов... Как называется это тестирование?
Если предположить, что ты общался с запрограммированным искуственным интеллектом, то этим вопросом ты разрушил его электронный моск.
Не знаю, что произойдет в случае с criosray.
Здравствуйте, vdimas, Вы писали:
V>Если предположить, что ты общался с запрограммированным искуственным интеллектом, то этим вопросом ты разрушил его электронный моск.
Рассмотрю предложение на вакансию Тьюринг-тестера.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
G>>Это C++ники так пишут код на шарпе. Не надо так писать. Пишите нормально i<data.Length и будет счастье.
V>А мне надо именно i<buffLen.
ССЗБ.
V>Например, пришли в декодер сжатые данные, их заведомый размер априори неизвестен. Примеров туевы хучи, вообще-то. Просто поверь, что там где можно было размер массива заведомо подогнать под размеры данных, то это было сделано еще до нашей оранжевой революции.
Как это "априори неизвестен"? покажи мне API которые возвращают "незивестно сколько данных".
G>>А причем тут пиннинг, он имеет значние только когда выделяется память.
V>Если я правильно тебя понял, ты предлагаешь выделить память и тут же навсегда запинить. А вот все соккеты работают через кратковременный пиннинг буферов, и, если я держу постоянно запиненными несколько тысяч буферов, то мои соккеты начнут тормозить (оно так и есть, кстати).
В таком случае надо большие буферы выделять в саом начале и кратковременно их пиннить. Известный рецепт.
V>>>Это зависит от характера вычислений. Например, фильтрация — это крайне примитивные вычисления, там затраты на проверку на границу цикла сопоставимы с полезными вычислениями (сопоставимы потому, что джиттер даже не кеширует в регистре длинну массива, а каждый раз лезет за ней через коссвенную адресацию), и вместо непосредственного приращения указателя каждый раз вычисляет адрес элемента (что вполне понятно, у нас же GC). Итого, мы сможем сделать таких простых вычислений в 2-3 раза меньше. G>>Фильтрация чего?
V>Ээээ... сигналов.
Ну если это FIR-фильтрили что-то в том роде, то не думаю что накладные расходы доступ по индексу окажутся значимыми по сравнению с наложением фильтра.
V>>>В моей задаче распараллеливание одного вычисления не нужно, у меня их и так конкуррентно тысячи идут, я борюсь за эффективность каждого из них. G>>Будешь бороться за каждого — производительности не будет. Компутер гораздо лучше умеет шедулить задания, чем ты сам.
V>И что сказать хотел? Что на наш двухядерник тысячи конкурентных вычислений мало, надо еще в несколько раз распарралелить и, соотвественно, еще уменьшить гранулярность блокировок? Ты хоть глубину это чуши понимаешь?
Еще раз перечитай что я писал. "уменьшить гранулярность блокировок" это как раз попытка гоняться за каждым.
V>Вот когда будет отношение кол-ва ядер к количеству конкурентных вычислений хотя бы 1/10, то тогда я шедуллеру с радостью всё и поручу, а пока что, только лишь пересмотрев сценарии и укрупнив гранулярность блокировок, повысил емкость системы раза в полтора (кол-во одновременно обслуживаемых абонентов).
Ты лучше пересмотри свой взгляд на создание высоконагруженных систем. Например с либой типа CCR можно вообще без блокировок обходится при любом количестве входящих запросов
Здравствуйте, Anton Batenev, Вы писали:
AB>З.Ы. Да, я знаю, что это удар ниже пояса, но хотелось ответить по теме и без эмоций.
Какой удар ниже какого пояса? Ты слил спор и теперь бредишь пытаясь перевести разговор на что-то не относящееся к делу. При этом даже в теме на которую ты пытаешься перескочить ты не понимаешь ровным счетом ничего.
В общем, сплошное ламерство и не умелая демагогия с твоей стороны. Постыдился бы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
S>У нас соотношение managed/native порядка 250/1. Интеропа почти нет.
Ну, у нас много ввиду того, что нет целиком изолированных нативных модулей, на нейтиве написаны лишь критические составляющие части каждого модуля.
S>На дотнете кончилась фантазия по выдумыванию как его ускорить, тупое переписывание один в один на плюсы дало ускорение в 1.5 раза.
Во-первых, один в один не всегда просто переписать, в нашем случае мессейджинг на ГЦ немного развязывает руки и всё упрощает.
Во-вторых, ускорение этого или другого подобного кода в 1.5 раза не прибавит и 1% общей производительности, т.к. этот код выполняется относительно редко, в моменты изменения состояний канала. И хоть такие изменения в независимых каналах происходят в нагруженной системе хаотично несколько раз в секунду, это все-равно очень редко.
В-третьих, если кусок кода после переписывания не ускоряется хотя бы вдвое, то я его оставляю до лучших времен.
В-четвертых, мне приходилось переписывать даже некоторый нативный код (над кодеками работал) для получения всего 20%-25% выигрыша, и оно того стоило.
----------
В общем, топик был про C# vs С++, я считаю полезным и то и другое. Из дотнета можно черпать мощь библиотек, из нейтива — мощь железки, сочетать с умом, и будет всем щастье.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Pepel, Вы писали:
P>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
G>Сильных проверок чего?
типов проверок !!!! ЧЕГО ..
мощная статическая проверка типов ..это 0 который делает из 1 десятку
Здравствуйте, Pepel, Вы писали:
P>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
Dildo Framework, Vegetable Edition
Здравствуйте, Pepel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Pepel, Вы писали:
P>>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
G>>Сильных проверок чего?
P>типов проверок !!!! ЧЕГО .. P> мощная статическая проверка типов ..это 0 который делает из 1 десятку
Здравствуйте, Mamut, Вы писали:
P>> P>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
P>> G>Сильных проверок чего?
P>> типов проверок !!!! ЧЕГО .. P>> мощная статическая проверка типов ..это 0 который делает из 1 десятку
M>Нет в С++ мощной статической проверки типов. С++ — это слаботипизированый язык со статической типизацией
вы гдет надергали каких т стереотипных лозунгов, спорить какт бесполезно
приговариваетесь к пожизненному чтению <The C++ Programming Language by Bjarne Stroustrup> с .. заменой на 3-х годичную установкe мелкософтовых патчей к MS.NET Framework
а человеку данную ветку родившему, по итогу все таки скажу не важно с чего вы начнете, с delphi к слову начинайте, и еще смотря как вы дальше планируете хлеб добывать :
— будете на себя работать — С++ в руки
— на контору планируете идти — шарп
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, -MyXa-, Вы писали:
NBN>>>Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости.
C>А необходимость возникает только тогда, когда продакшн билд начинает течь, как дырявое решето?
criosray, будьте, пожалуйста, повнимательнее, даже и в КСВ. Я этого не писал.
Вы вот мне лучше скажите — код, который находится этим запросом — его писали нормальные программисты или индусы (всё-таки не хочется делать далеко идущие выводы о языке на основе кода последних)? Если нормальные, то о какой высокоуровневости может идти речь? Тут как раз и получается "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва" (С) BulatZiganshin. В С++ подобного кода нет и не надо никогда.
Если не поможет, будем действовать током... 600 Вольт (C)
Здравствуйте, VladD2, Вы писали:
VD> Хамский тон? Дык я со всеми говорю тем тоном который они зауживают. Ты не стоишь того, чтобы проявлять к тебе уважение.
Определенно кучно пошло Однако, это твоя обычная манера ведения разговора.
VD> Да причем тут мастер-класс? Я о другом говорил.
А кто же спрашивал про мастер-класс? Инопланетяне?
VD> Я не вижу никакого отношения между твоим ламерством в обсуждаемых вопросах и нашим сайтом.
Ты сам-то обсуждаемый вопрос помнишь или хочешь таким образом соскочить с неудобной тебе темы? И, дабы не разводить портянку, сформулируй его.
VD> Ну, и разговаривать о проблемах сайта с теоретиками мне по-попросту не интересно. Когда создашь сайт хотя бы в десять раз меньше популярный можно будет поговорить.
Только после того, как РСДН (хотя можно и Янус) будет переписан на немерле под рантаймом моно — так чтобы в споре оставался только один теорэтик
VD> Тебе должно быть стыдно за свое ламерство и ту дерьмовую демагогию что ты тут разводишь. VD> В прочем, понятие совести для таких как ты вряд ли применимо, а значит разговоры о совести бессмысленны.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
G>>Смотря в какой области. В системном программировании не сильно получится без нативных языков, байтики ворочить без C мало получится. C++ в такой задаче ни к чему. Аналогично для числомолотилок.
V>Я тебя уже спрашивал, почему именно С, ты так и не смог предметно объясниться.
Еще раз обясняю. C — потому что низкоуровневый и быстрый. Там где нужны более сложные абстракции лучше юзать более безопасные языки, чем C++.
B>неиспользуемые объекты будут держаться до заврешения программы. B>И попробуй убеди меня что это не утечка памяти. И я очень сомневаюсь gc при вызове "ручками" поймет что это некому не нажный код и удалит его.
B>P.S. это высосанный из пальца пример, но проблему он показывает вполне.
Этот высосанный из пальца пример показывает, что ты не знаешь ни c#, ни то как работает gc.
Читаем C# Language Specification:
3.9 Automatic memory management
C# employs automatic memory management, which frees developers from manually allocating and freeing the memory occupied by objects. Automatic memory management policies are implemented by a garbage collector. The memory management life cycle of an object is as follows:
1. When the object is created, memory is allocated for it, the constructor is run, and the object is considered live. 2. If the object, or any part of it, cannot be accessed by any possible continuation of execution, other than the running of destructors, the object is considered no longer in use, and it becomes eligible for destruction. The C# compiler and the garbage collector may choose to analyze code to determine which references to an object may be used in the future. For instance, if a local variable that is in scope is the only existing reference to an object, but that local variable is never referred to in any possible continuation of execution from the current execution point in the procedure, the garbage collector may (but is not required to) treat the object as no longer in use.
3. Once the object is eligible for destruction, at some unspecified later time the destructor (§10.13) (if any) for the object is run. Unless overridden by explicit calls, the destructor for the object is run once only.
4. Once the destructor for an object is run, if that object, or any part of it, cannot be accessed by any possible continuation of execution, including the running of destructors, the object is considered inaccessible and the object becomes eligible for collection.
5. Finally, at some time after the object becomes eligible for collection, the garbage collector frees the memory associated with that object.
Так что твой жуткий массив может быть собран мусорщиком сразу после Console.WriteLine. Кстати, по примеру, у тебя весь массив — массив null-ов.
Здравствуйте, criosray, Вы писали:
COF>>Хорошо, что это за приложения? Я их поставлю и если они действительно летают, то я признаю свою неправоту :) C>ThrottleLauncher, Twittula и самописное бизнес-приложение.
Поставил ThrottleLauncher и поигрался с ним пару дней. Такое впечатление, что у тебя либо быстрое устройство с маленьким экраном, либо у тебя извращенное представление о том, что значит "программа летает". Если ThrottleLauncher и летает на моем HTC HD, то низко-низко :) С аналогичными программами, написанными на C++, просто не сравнить. В общем, я еще более укрепился в своем мнении, хотя после столь массированной пропаганды со стороны сторонников управляемых языков уже был даже готов поверить.
Но прикольно другое. Поставив сие чудо софтостроения и нарвавшись на нехилые тормоза, я начал рыть в сети на предмет возможных настроек и т.п. Вот на что я наткнулся и что меня буквально потрясло:
В процессе тестирования проги обнаружил большую утечку памяти. За 15 минут переключения вкладок прога полностью съела 18 свободных мег. Это напоминает утечку памяти PointUI 2. Методов борьбы не обнаружил. Если буфферизацию ставить в 0 — прога тормозит, а утечка памяти происходит медленно, но верно. В общем не рекомендую владельцам медленных процессоров и малой оперативки.
Это проблема программы — не высвобождается полностью память при перерисовке, решить ее самостоятельно не удастся.
Здравствуйте, COFF, Вы писали:
COF>Да уж, такое впечатление что дотнетчики живут в каком-то виртуальном мире, навеянном рекламными проспектами — в мире где нет утечек памяти, где программы летают, а критерием хорошести языка является то, насколько он поддерживает лямбды
С лямбдами однозначно лучше чем без них. Уверен, что если у дотнетчиков резко отнять лямбды и, следовательно linq, они пойдут революцией против M$! COF>В конце-концов, ну не было в C++ лямбд — ну и черт с ними, вполне можно без них прожить. Что народ к ним привязался?
А кто спорит? Можно. Можно прожить и без рекурсии, и даже без виртуальных методов.
COF>А вот в C# нет деструкторов и переопределения операторов присваивания, например.
Очень много желающих добавить в дотнет что-то. Например, паттерн-матчинг. И очень мало желающих вставить в дотнет деструкторы и операторы присванивания. Они почему-то нужны только C++-никам. COF>Я конечно понимаю, что если чего-то нет в текущей версии C# — это не нужно, а если чего-то нет в C++ — это плохой дизайн языка, но все же
В C# тоже многого нехватает. Те, кому этого очень сильно не хватает, используют Nemerle и F#.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) ГВ>Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика".
Не, такие программы на С++ просто не появляются.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Моки и заглушки — разные вещи, использующиеся в разных сценариях тестирования.
V>Садись, два. V>Роутеры и маршрутизаторы с этой же точки зрения тоже разные вещи, использующиеся в разных местах сети.
Здравствуйте, IID, Вы писали:
IID>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
А тебе о скорости получаемых приложений. Она определяется не только, да и не столько скоростью выполняемого кода сколько качеством и скоростными характеристиками используемых алгоритмов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, sergey2b, Вы писали:
S>Скажите пожалуйста на каких компиляторах вы тестировали и если это VS начиная с какой версии компилятор/crt нет проблем с фрагментацией.
У шестёрки в первых версиях был галимый аллокатор, точно помню...
Здравствуйте, sergey2b, Вы писали:
S>Здравствуйте, CreatorCray, Вы писали:
CC>>Написал я как то монитор выделяемой произвольным процессом памяти. Дабы значицца, посмотреть что там да как происходит в закулисье. CC>>И что я только не гонял сей прогой, но пресловутой фрагментации увидеть так и не удалось. CC>>HeapAlloc, который уже давным давно используется вместо говноаллокатора ранних версий CRT, отлично справлялся сам.
S>Скажите пожалуйста на каких компиляторах вы тестировали и если это VS начиная с какой версии компилятор/crt нет проблем с фрагментацией.
Сам компилятор не имеет никакого отношения к тому, как в CRT реализованы операции выделения памяти.
Без понятия каким компилером собирались те проги, которые я проверял.
Т.е. вся аллокация в ОС начиная от W2k производится через HeapAlloc, который является WinAPI функцией и к С/С++ уже никакого отношения не имеет.
А судя по картам аллокаций, которые я наблюдал на реальных приложениях фрагментации не наблюдается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Гуй в нем делался на скорую руку бо сильно нужны были результаты замеров.
вкратце основные кнопы:
+- — зум
курсорные стрелки + ins/del — перемещение.
В силу особенностей перехвата работает не до абсолютной смерти проги, отключается несколько раньше, но позже завершения main.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3.
Там просто если ICC считает что твой проц не поддерживает нужные фичи то он делает printf и exit
Прога не консольная, посему в консоль ничего не пишет, а printf этот происходит до winmain.
Выложил собранные без оптимизаций вообще. Вообще удивлён что сей сурс собрался с первой попытки и даже без ворнингов, как никак года три ему наверное, и кинут был на полпути.
У меня самый старый комп что могу найти это P4 820, на нем работало и в первом случае.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Sheridan, Вы писали:
S>В англицком к примеру я не силен.
Как же ты живешь-то? S>В трех словах пожалуйста опиши что там происходит. Насколько я понял — чел добился существенного увеличения производительности, или нет?
Как я уже много раз говорил, есть только один разумный способ написать производительное приложение.
(Оффтоп: идеальное слово, производительное, привыкайте!) Вот он:
Задать осмысленные, измеримые, направленные на потребителя цели.
Написать код как можно яснее и правильнее.
Аккуратно сравнить производительность с заданными целями
Цели достигнуты? Отлично! Не тратьте времени на анализ производительности. Вложите своё ценное время в фичи, документацию, отладку, надежность, безопасность, во что угодно.
Если цели не достигнуты, используйте инструменты чтобы выяснить, какое из исправимых мест тормозит сильнее всего, и исправьте его
Повторяйте этот процесс, исправляя при необходимости цели, до тех пор, пока вы либо не достигнете цели, либо не сдадитесь.
Моей явной целью для моей маленькой программы поиска по словарю была способность выдавать результаты достаточно быстро, чтоб я не сидел в нетерпении больше нескольких секунд.
Это вполне направленная на потребителя цель, если считать меня единственным потребителем этой программы. После минимальной настройки моя программа сразу добилась этой цели, так с чего бы мне тратить время на дальнейшее улучшение? Программа успевает выдать результат типичного запроса чуть меньше, чем за две секунды, что быстрее, чем я могу его прочитать.
Но представьте, что мы захотели улучшить ее производительность по какой-то причине. Как? Давайте пойдем по списку. У нас есть цели, есть очень понятный код, мы можем достаточно легко измерить производительность. Предположим, мы не достигли цели. Последний пункт в списке — "используйте инструменты чтобы выяснить, какое из исправимых мест тормозит сильнее всего".
Один из комментаторов предположил, что узкое место этой программы связано с дисковым вводом/выводом. Каждый раз при выполнении запроса мы перечитываем двухмегабайтный словарь десятки раз. Это имеет преимущество использования минимума памяти; мы никогда не держим больше одной строки словаря в памяти одновременно, вместо всех четырёх мегабайт, которые бы потребовались на весь словарь (напомню, что словарь в ASCII на диске, но в двухбайтовых символах Unicode в памяти, так что потребление удваивается).
Это предположение — разумное предположение — но тем не менее, это всего лишь догадка. Если я и выучил хоть что-то про анализ производительности, так это то, что мои догадки о расположении узких мест зачастую неверны. Так что я сразу скажу, что да, производительность диска плоха, но это не самая плохая часть в этой программе, далеко не самая. Где же реальное горлышко? Есть идеи? Сможете угадать без инструментов?
Вот результаты профилирования поиска семибуквенных слов с одной пропущенной, повторенного 20 раз:
Святые угодники! Вызовы экстеншн-метода Contains для проверки, содержится ли слово в списке каркасов, занимают почти половину времени работы программы!
Что имеет смысл, как только перестаешь о нём думать. Метод "Contains" по своей очень обобщенной природе вынужден быть весьма наивным.
Получив массив, в 99.9% случаях он должен просмотреть все 26 элементов потому что в 99.9% слово не совпадет ни с одним из возможных каркасов. Он не может воспользоваться "ранним возвратом", как сделал бы ты при выполнении линейного поиска по отсортированному списку. И для каждого элемента он должен сделать полное сравнение строки; здесь нету моднявых проверок, пользующихся неизменностью строк или хеш-кодами или типа того.
У нас есть структура данных, которая разработана чтобы быстро отвечать, входит ли элемент в множество. И, что еще лучше, в нее уже встроена логика "distinct". Когда я заменил
var racks = (from rack in ReplaceQuestionMarks(originalRack)
select Canonicalize(rack)).Distinct().ToArray();
на
var racks = new HashSet<string>(
from rack in ReplaceQuestionMarks(originalRack)
select Canonicalize(rack));
производительность внезапно и значительно улучшилась. "Contains" упал до 3% общих затрат, и, естественно, общие затраты теперь вдвое меньше.
Еще один нюанс: заметьте как при смене типа переменной racks с "массива строк" на "множество строк", мне не пришлось вручную менять тип — благодаря неявной типизации локальных переменных. Я хочу подчеркнуть семантику, а не способ хранения. Если бы я думал, что выражение способа хранения является важной частью кода — потому что это так сильно влияет на производительность — то, возможно, я бы подчеркнул тип, разжевав "var".
После этого изменения, производительность программы улучшается примерно до одной секунды на запрос, и профиль теперь выглядит вот так:
39%: ReadLine
23%: Sort
11%: ToUpperInvariant
7%: всякая фигня в итераторе в FileLines
5%: ToArray (called by Join)
15%: всё остальное
Теперь узкое место явно в комбинации постоянного чтения строки из файла (48%) и каноникализации каждой строки словаря снова и снова (37%).
С учетом этой информации, мы теперь можем сделать осмысленное вложение времени и усилий. Мы могли бы кэшировать порции словаря в памяти, чтобы избежать повторных затрат на ввод/+вывод. Стоит ли потенциальный выигрышь в скорости потенциального значительного роста потребления памяти? Мы можем тут повыпендриваться, и, к примеру, кэшировать только семи- и восьмибуквенные слова.
Мы можем также навалиться на проблему производительности каноникализации. Стоит ли, к примеру, заранее строить индекс к словарю, где каждая строка уже в канонической форме?
Это фактически обменивает рост потребления дискового пространства, рост сложности программи и рост избыточности на уменьшение времени работы. А может, надо взять совсем другой алгоритм каноникализации?
Все эти решения принимаются на основе того факта, что я уже превзошел поставленную цель, так что ответ на все вопросы "нет". Достаточно хорошо, это, по определению, достаточно хорошо.
Если бы я применил этот алгоритм для построения реального игрового AI, он был бы уже недостаточно хорош, и я бы применил какое-нибудь более умное решение. Но этого не случилось.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Alexey Voytsehovich, Вы писали:
C>>>Обычно и того меньше — до 2GB, что можно переконфигурировать в boot.ini и получить до 3х. CC>>Уточню, процесс видит адресного пространства 4Gb/Segment, но использовать под свои нужды может тока младшие 2(3)Gb. Остальным распоряжается система.
AV>может кто подскажет какой туда ключик надо написать для windows xp sp3? Заранее спс.
Здравствуйте, Anton Batenev, Вы писали:
AB> M> Чектого определения нет. Обычно просто обозначает высококачественную игру с большим бюдэетом.
AB> А предполагается, что качество напрямую коррелирует с размером бюджета?
Неа Тут все типа вилами по воде. Если игра огромнобюджетная + качественная + «не провалилась в прокате» (по аналогии с фильмами ), то это — ААА
Здравствуйте, criosray, Вы писали:
C>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. http://code.google.com/p/pococapsule/
с использованием етой библиотеки реализуется минут за 5-10 опытными программистами на C++
Здравствуйте, Sinclair, Вы писали: ГВ>> C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель. "Нормальные" замыкания, судя по твоему высказыванию — это только ссылка, контролируемая GC. S>Нет, это "только ссылка". Потому что семантика передачи ссылки принципиально отличается от передачи по значению, и именно она нужна. GC — второстепенная деталь реализации, без которой всё вместе трудно заставить работать.
спасибо, Капитан, за ликбез про семантику, а "мужики то не знали". Только с чего ты взял что нужна именно она? С++ предоставляет вариант — замыкать контекст по ссылке или по значению (кстати некотороые из lisp'ов таки замыкания реализуют через копирование, ага). Очевидно ето плюс, т.к. программист не ограничен "единственно правильным решением".
ГВ>> Я не хочу сказать, что такая точка зрения не имеет права на существование, но это никак не противоречит копированиям и прочим тра-ля-ля. S>Геннадий, не надо придуриваться. Есть общепринятая трактовка замыкания, в которой замыкается полный лексический контекст. И плюсы не в состоянии обеспечить реализацию этой трактовки. А говорить "вот мы изобрели некоторое малополезное подмножество вашей функциональности, и назвали его точно так же, как полное — вот вам и замыкания" — это нечестно.
не надо выдумывать, в новом с++ именно замыкание, аргументов против так и не увидел, разве отсутствует "замыкание на полный лексический контекст", али что?
Здравствуйте, Хвост, Вы писали:
Х>... я написал в ответ на сообщение samius'а, в котором написано что структуры, попадающие в scope лямбды никогда не лежат на стеке, так как всё-таки верно? если верно второе то ето вообще удивительно, получается что там где в C# вызывается лямбда стековых структур не может быть в принципе, а ето просто неимоверный оверхед.
Не совсем верно. Лямбда не исключает стековых структур. А лексическое замыкание переменных (структур в том числе) реализуется через размещение переменных в классе, который в хипе.
Оверхед — да. Неимоверный — смотря для чего. Хочешь выжать пару тактов — забудь про лямбды и занимайся ручным инлайнингом. А в общем случае — удобно и красиво.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Стоп, тогда я тебя не понял. Значит, физически, данные в структуре, размещённой в стеке и в объекте-лямбде — одни и те же?
Нет, никакого размещения в стеке не происходит. В зависимости от того, что именно замкнуто в контекст, он превращается либо в набор статических переменных + статический метод-лямбду, либо в объект сгенерированного класса, размещенного в хипе (методом которого опять же является лямбда). ГВ>Или нет? Мы сейчас обсуждаем ситуацию, когда данные представляют собой структуру (не объект).
Я, если честно, не уверен, что именно генерируется — структура либо объект. ГВ>Для упрощения положим, что лямбда не выходит за пределы скопа, где объявлена замыкаемая структура, то есть время жизни лямбда-объекта гарантированно превышает время жизни замыкаемой структуры и компилятору об этом известно.
В шарпе "замыкаемая структура" и "лямбда" неразрывно связаны.
Поэтому у них соответствующее время жизни. Примерно так же эта механика работает в JS, только там — полная динамика, а в шарпе — статическая компиляция и типобезопасность.
Далее, размещать эту фигню в стеке компилятор не будет — escape analysis пока что не реализован. Чтобы
не было недопонимания: escape-analysis компилятор вообще выполнять не может. Кроме примитивных случаев типа "объект вообще нигде не используется после создания". В частности, потому, что ему совершенно неизвестно, чем именно занимается метод myCollection.Where(), в который скормили лямбду — он запросто мог сохранить на нее ссылку в каком-то GC Root, для последующего злостного обращения к ней в надежде на UB.
Известно это становится только JITу, и то не всегда. Поэтому escape analysis, как и inlining, в управляемой среде выполняется рантаймом. К джаве первое уже прикрутили, к дотнету пока — только второе.
К счастью, стоимость размещения в хипе в управляемой среде ненамного выше стоимости размещения в стеке. Для того, чтобы написать программу, в которой будет заметен эффект от того, что лямбда размещена не в стеке, нужно очень-очень постараться. А мы тем временем продолжаем надеяться на то, что за то время, которое тебе потребуется для написания этой программы, к CLR таки прикрутят escape analysis. А в отличие от нативного кода, MSIL всех приложений автоматически выиграет от этого будущего улучшения без явной перекомпиляции и передеплоймента приложений.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>Проснись, оптимизация дотупа к массивам давно сущесвует.
То, что ты привел, работает только для i<array.Length, а это для тех же числомолотилок, которые переливают из предвыделенных буферов в буфера нереальный сценарий. Я уже как-то писал на эту тему, но могу еще раз.
_data и _buffLen — члены класса, data и buffLen — локальные переменные, на них нет ссылок по ref, а из алгоритма видно, что значения неизменяемые в теле цикла, поэтому проверить можно buffLen лишь однажды при инициализации цикла, а затем уже не проверять границы. Однако, эту оптимизацию не делают.
G>Если нужет произвольный быстрый доступ, то есть unsafe.
Если использовать пиннинг — то тормозно (чем больше одновременных пинов, тем дороже каждый следующий), если же самостоятельно выделять память через всякие Marshal.AllocXXX, то смысл в управляемой платформе вообще исчезает, да и проблемы с ClickOnce для unsafe сборок. Вывод сделаешь сам.
G>Что касает числомолотилок, то в самых тупых линейных случаях (как md5 например), при использовании uncheked, .NET будет проигрывать на проценты. Что в реальной программе погоды не сделает.
Это зависит от характера вычислений. Например, фильтрация — это крайне примитивные вычисления, там затраты на проверку на границу цикла сопоставимы с полезными вычислениями (сопоставимы потому, что джиттер даже не кеширует в регистре длинну массива, а каждый раз лезет за ней через коссвенную адресацию), и вместо непосредственного приращения указателя каждый раз вычисляет адрес элемента (что вполне понятно, у нас же GC). Итого, мы сможем сделать таких простых вычислений в 2-3 раза меньше.
G>Кроме того такие случаи элементарно оптимизируются заменой на Сшный код или распараллеливаются (в .NET далется очень легко).
В моей задаче распараллеливание одного вычисления не нужно, у меня их и так конкуррентно тысячи идут, я борюсь за эффективность каждого из них.
G>ЗЫ. Я ещ не упоминул такие оптимизации, которые делает mono. См Mono.Simd
Спасибо, интересно. На С++ мы делаем разные сборки для без SSE, и отдельно для SSE1/2/3, которые будем подгружать динамически, в зависимости от возможностей проца. Если джиттер научится делать это сам, то кое-что можно будет пересмотреть. Однако, вот тот доступ к массивам — это затык №1 для нас, ибо обычные вычисления действительно неплохо выглядят после джиттера.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, vdimas, Вы писали:
V>>Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов.
И для порядку, так сказать:
из презенташки Микрософта по 2010-й Студии...
Здравствуйте, vdimas, Вы писали:
V>Как насчет параллельного расчета многих задач, т.е. код один и тот же, но нужны сотни одновременных потоков, обрабатывающих свои данные этим кодом (например, это будут аудио-кодеки).
А там как раз такой принцип и есть: грубо говоря много простых процессоров, одновременно выполняющие одну и ту же программу но каждый на своем наборе данных.
Скачай SDK и почитай доки из комплекта. Станет ясно как оно работает и как надо раскладывать задачи на железо.
V>Какой примерно выигрыш?
Зависит от алгоритма и имплементации. В сравнении с C2D 2.2 у нас некоторые расчеты отрабатывали в раз 20-30 быстрее. Но это финрасчеты.
V>Какое железо и тулы посоветуешь?
У нас CUDA SDK 2.1 и Tesla C1060
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Erop, Вы писали:
VD>>Погугли и почитай, что за бред там пишется. Все про С++. Это локальная терминалогия отдельных идиотов. Научного понятия статического полиморфизма нет. Есть статическая типизация и разные виды полиморфизма. Но любой из них может отрабатывать в рантайме.
E>А как называется сод, вроде std::sort, который можно натравить на данные разного типа, удовлетворяющие каким-то формальным требованиям, и получить соответсвующий результат?
Параметрический полиморфизм и утиная типизация.
E> Пусть члово полиморфизм не годится. Какое таки годится?
Слово "полиморфизм" годится. Только тип используемого в шаблонах С++ полиморфизма называется "параметрическим".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
V>>Ансейф без пиннинга никак, а насчет пиннинга отсылаю к своим сообщениям чуть выше или к статье по твоей ссылке. S>Так штука в том, что сеть вообще без пиннинга никак — даже если сам его не делаешь, запись в сокет автоматически пинит буфер за тебя. Поэтому ансейфом больше/ансейфом меньше — особенной роли не играет.
Правильно, поэтому мы используем класс Socket только для инициализации (бо удобно очень), а потом берем хендл, и по UDP работаем не через класс сокета.
V>>В любом случае, даже в случае подобных "сверхоптимизаций", заджитенный бинарный код весьма убог в тех местах, где речь идет об обращениях к массивам. И я могу себе позволить предположить почему: наверно есть какой-то "протокол" м/у джиттером и GC, чтобы GC не терял ссылочные значения, "затертые" в регистрах после всех оптимизаций. S>Не очень понятно, где там будет экономия — как только в цикле осталось только одно обращение к массиву, дальше начинается математика, и никаких указателей не остаётся. S>Значит, джит лажает в математике, а не в указателях и GC.
Там какая-то возня по регистрам. Такое ощущение, в джит забили жесткие правила: такую-то адресацию делать так-то, другую так-то, и вот он вынужден жонглировать регистрами. Почему мне и показалось, что "протокол" соблюдают, дабы джит знал в каких регистрах искать ссылки.
V>>Учитывая, что голосовой буффер — это вполне счетное кол-во сэмплов (обычно 160 или 320), то неплохо на С++ на шаблонах смотрится раскрутка цикла "в плоскость". S>Ну, это верно. Шаблоны и раскрутка на С++ — это просто классика кун-фу. S>Опытные падаваны делают это на шарпе вручную с ансейфом (ковыряния рефлектором в районе System.String и System.Array дают порой потрясающие впечатления).
Разве не проще на С/С++?
Согласен, для первого такого случая это же так муторно: надо еще один проект создать, в нем файл export.def, завести у себя класс NativeMethods
Зато каждый следующий случай добавляется за считанные секунды без этих "звездных войн". По крайней мере отдача адекватна вложенному результату.
S>Путь джедая — это разработка обобщенного фреймворка развертки циклов в рантайме. Путь полного джедая — это, конечно же, доработка этого обобщенного фреймворка до развёртки циклов в GPU
Ха-ха по последнему.
Это должен быть путь не одинокого джедая, а как минимум серьёзного коллектива, т.к. сами оптимизации/развороты и прочее хоть и просты каждый в отдельности, но их охренительное кол-во, т.е. база знаний должна быть приличная.
S>Да это всё более-менее понятно. Можешь привести код такого фильтра, чтоб стало понятнее, куда оптимизировать?
Но наложение окна — это общая и довольно частая операция в обработке сигналов, когда инициализируется некий кодек или препроцессор, то ему динамиччески параметры сигнала дают, и он выделяет буфера динамически, и наложение окна — это цикл в цикле получается.
Рекурсивный более скромен в плане ресурсов:
// мемберы, линия задержки
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Здравствуйте, MxKazan, Вы писали: MK>>>>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>>>>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы? MK>>>А тем, что она все-равно зависима. ГВ>>Начинаем спор о словах. Что такое "платформа"? Традиционное понимание — это что-то масштаба операционной системы. В этом смысле Qt предоставляет вполне приличную переносимость, в отличие от. MK>И тем не менее мы приходим к тому, что ваша "независимая" Qt'шная прога так или иначе, но зависит от библиотек и от API ОС. Реши производитель операционки радикально что-то поменять, вся ваша платформонезависимость полетит к чертям, пока та же Qt не будет доведена до поддержки нового API. Так вот тоже самое и с утверждениями про зависимость .Net от MS.
Да хватит уже кросплатформенностью меряться. Самые кроспалформенные GUI-фреймворки уже давно придуманы это HTML+CSS+Javascript, чуть меньшей кроссплатформенностью обладают Flash и Silverlight. С++ c Qt даже рядом не валялся.
Здравствуйте, ameshkov, Вы писали:
A>Ну раз такая пьянка пошла, я тогда против огульного охаивания VB и приравнивания его к... ну пусть к Дельфям
Я тоже. Делфи круче. Ваше здоровье !
Здравствуйте, hattab, Вы писали:
H>Ага, заметил некоторые траблы с использованием.
Там траблов на самом деле еще много Например никак не делалась обработка динамически подгружаемых DLL и т.п.
Писалась "под задачу" и "надо вчера", потому остановилась на этапе как тока на требуемом exe стала показывать результаты аллокаций.
H> Но вообще, интересная софтинка
Надо будет как нить ее доделать. Там самое полезное — DLL. EXE занимается инжектом DLL в процесс, приемом от нее данных с записью в файл и потом показ намерянного.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, Хвост, Вы писали:
G>>>Почему самые высоконагруженные сайты написаны не на С++? Х>>для сайтов легче купить несколько серверных стоек, чем заплатить программистам на С++ выше рынка, к сайтам скорее требование к масшабированию чем к производительности, хотя в гугле и в яндексе афаик ядро поиска написано на С++, наверное потому что им уже есть резон економить на серверах. C>Откуда информация? Дайте ссылку на авторитетный источник.
про гугл с ходу не нашёл, а яндекс дык http://company.yandex.ru/inside/job/ раздел "Разработчики"
AB> Х> Short answer: AB> Х> High-quality games with high budget.
AB> Не, хотелось бы для саморазвития. Что есть ААА, что есть BBB. В смысле какую-нибудь табличку сравнительную с приблизительными числовыми характеристиками.
Чектого определения нет. Обычно просто обозначает высококачественную игру с большим бюдэетом. Предположительно, стоимость разработки AAA-игр сейчас начинается от 4 илиионов долларов (ссылку не найду, читал еще в прошлом году)
Здравствуйте, Mamut, Вы писали:
AB>> Х> Short answer: AB>> Х> High-quality games with high budget.
AB>> Не, хотелось бы для саморазвития. Что есть ААА, что есть BBB. В смысле какую-нибудь табличку сравнительную с приблизительными числовыми характеристиками.
M>Чектого определения нет. Обычно просто обозначает высококачественную игру с большим бюдэетом. Предположительно, стоимость разработки AAA-игр сейчас начинается от 4 илиионов долларов (ссылку не найду, читал еще в прошлом году)
AAA game means games that have almost unlimited budgets and are media events. Blizzard is the AAA game company these days. They won’t release anything that doesnt fall under AAA.
Здравствуйте, gandjustas, Вы писали:
Х>>я вот призадумался, ты или не знаешь что такое движок, или толком не понимаешь что такое XNA, или ты так далёк от игростроя что почитав "интернеты" придумал свой мир где дотнет захватил игрострой :-D G>Я отлично знаю что такое движок
Да вот что то не бросается в глаза.
G>даже сам писал что-то подобное, и даже дописал. А потом понял что херней занимался долго время.
Угу, ясно.
Х>>Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA. G>Да ну. И на чем ты напишешь игру для XBox 360?
На С++ и XBox 360 SDK, которую надо по договору получить у МС. Не бесплатно разумеется.
На шарпе можно говнокодить под ХНЮ, которая суть бесплатный конструктор "налабай дома тетрис".
Чуть что посерьезнее — быстро упрешься в лимиты железа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
C>>>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. Х>>>http://code.google.com/p/pococapsule/ C>Очень-очень примитивно, если сравнивать с Castle Windsor.
Ну дык, pococapsule и по объёму чуть не в 10 раз меньше, чем Castle Windsor. Что тут бочку-то катить? Тем не менее, в качестве ответа на вопрос об IoC — вполне себе ответ.
C>Где возможность задать Lifecycle? C>Где возможность задать Lifestyle?
Это уже фичи, которые в тот или иной контейнер могут быть внесены или нет.
C>Где автоматическая регистрация компонент по шаблону?
Можно сделать и так, но понадобится глобальный регистратор всех компонентов, используемых в такой операции.
C>Где расширяемость аналогичная Сastle Facilities?
Да тоже, вроде бы, ничего сверхъестественного.
C>Где интерцепторы???
Вот с этим сложнее, но и то, из-за кодогенерации.
Ты всё же определись, чего ты хочешь от собеседников: чтобы сделали копию Castle Windsor или MS Unity, продемонстрировали возможный подход или ещё чего-то? Я надеюсь — ты не просто ищешь повод фыркнуть погромче, верно? Можно написать IoC-контейнер и конфигурируемый, и гибкий, и с обилием других качеств, но это, в общем, довольно объёмная работа. Тот же Castle Windsor, если судить по объёму исходников, ну никак не один и не два человеко-месяца.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
S>>ненене, не оно. Промахнулся с примером. Хотел пример с возвратом функции
А... Я тоже малость удивился.
S>
S>; Return a function that approximates the derivative of f
S>; using an interval of dx, which should be appropriately small.
S>(define (derivative f dx)
S> (lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
S>
Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох).
Ну в С++0х они есть. Компилеры с лямбдами тоже есть (ICC).
Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.
Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, minorlogic, Вы писали:
M>"Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров." не всегда является достаточным аргументом, например
M>Глобальные переменные удобнее тем, что их можно использовать из любого места и не придется передавать как толпу параметров.
А GOTO удобнее функций. Из любого места в любое и без параметров!
(я так не считаю, только проиронизировал аналогию)
Здравствуйте, samius, Вы писали:
S>Оверхед — да. Неимоверный — смотря для чего. Хочешь выжать пару тактов — забудь про лямбды и занимайся ручным инлайнингом. А в общем случае — удобно и красиво.
Погодите, тут пару десятков страниц назад меня клеймили за то, что я привел рекомендацию избегать маленьких функций. Сейчас мне отчего-то кажется, что ручной инлайнинг — это тоже самое, но другими словами, нет?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали:
MK>>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
ГВ>Примерно то же самое, кстати, должен делать и компилятор C++. Лямбда тоже преобразуется в класс с единственным методом (не считая конструктора копии, кажется) — "operator()(сигнатура, выведенная из параметров лямбды)".
дотнет этот класс распологает изначально в хипе, а C++ на стеке. дотнетчики с классом ассоциируют хип если не оговорено "класс на стеке", что означает структуру в дотнете.
Потому то же самое, но лишь условно примерно.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Порядки не важны, т.к. есть набор видимых элементов, который обновляется в зависимости от позиции и масштаба вьюхи. Есть эффективные алгоритмы пространственного индексирования объектов, которыми можно пользоваться для того, чтобы читать только те объекты, которые требуется отображать. Потому ни трансформировать все объекты ни читать их в память для отрисовки не обязательно. Те что прочитаны — трансформируются один раз софтом в промежуточную систему координат, все остальные разы железом. Х>но ведь при скролле/зуме, когда во вьюху попадают новые области, необходимо их заново трансформировать в промежуточную форму, поетому с таким же успехом можно трансформировать сразу в екранную.
Зло. Вьюх может быть несколько (+обзорная, например) с разными экранными координатами. При активной работе с зумом или изменением размеров окна перерисовывать объекты требуется часто, потому софтовый пересчет каждый раз из геодезии в экранные дорог. А из геодезии в промежуточные псевдо-экранные можно считать только однажны.
S>>Постоянные трансформации не могут вносить ошибки если эти трансформации не туда-обратно. Всегда есть правильные (родные координаты объекта) и все остальные, полученые из них. Вся логика типа кадастра работает с родными координатами, либо непосредственно полученными из родных. S>>А отрисовке — пофик на точность. Там на пиксель набежит больше любой погрешности. Х>ну собственно я про точность отрисовки и говорил, например последовательный зум-аут/зум ин на одну и ту же величину и мы видим уже не то что в начале
А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке.
X>или например такой вау-эффект как перелёт из одной точки в другую (как в гуглёрсе) уже не выглядит как последовательное умножение матрицы трансформации на какую-то статичную другую, т.к. накапливаются ошибки.
Как или конкретно как в гуглёрсе? AFAIK там рисуются не примитивы во время таких эффектов. Во всяком случае не десятками тысяч.
Но повторить худо-бедно такой пролет на векторных данных можно. Естественно, будет зависеть от обилия данных и способа проекции (либо проекция текстуры, либо плоский рендеринг по спроектированным с шарика на плоскость координатам). С шарика на плоскость тоже можно схалтурить и поручить железу.
X>В принципе все ети неточности несложно обходятся, но дело в том что незачем, т.к. на данный момент все трансформации в софте.
Софтовые трансформации тоже можно сократить введением промежуточной системы координат. Даже на шарике.
Так что запас по производительности есть и значительный. Потому не вижу неподъемных для C# задачь.
Здравствуйте, samius, Вы писали:
M>>Имелось ввиду не кеширование растра , а кеширование спроецированных данных. GIS Data(Vector data(lat lon)) -> Projection Data(Vector data) M>>Projection Data — может быть и Equiretangular а может и на сферу. S>Теперь кажись понял. Но тут мы получаем дополнительную задачу разбиения примитивов по треугольникам с разными преобразованиями. Например, если взять полигон-контур России, то он размажется по многим треугольникам, аппроксимирующим эллипсойд. Сразу получим проблему стыков частей такой фигуры по границам аппроксимирующих треугольников. Без введения дополнительных точек не представляю как решать. S>Нужен gluTess, либо своя реализация теоретико-множественных операций над точками, ограниченных контурами полигонов. Решается. Да и порядочный GIS должен иметь такую штуку в арсенале.
Теперь похоже правильно.
Действительно появляются 2 дополнительные задачи.
1. Триангуляция (разбивка на треугольники) проекции.
2. сопряжение на краях треугольников, особенно фигур лежащих на границе.
Задача 1 решена давно для распространенных проекций.
Задачу 2 можно решать очень по разному, можно подсмотреть например как это сделанно в Google Earth и т.п.
Как видим у предложенного решения есть свои недостатки и преимущества. Но лично я бы выбрал именно такой метод визуализации, как более гибкий и маштабируемый.
Здравствуйте, gandjustas, Вы писали:
G>>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. CC>>Ты пожалуйста ссылку дай на стандарт С++, где написано что именно так работает "стандартный аллокатор С++". G>Стандарт C++ не определяет реализацию выделения памяти. Во всех известных мне реализациях С++ работает именно так.
Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"?
У С++ НЕТ стандартного алгоритма аллокации. Есть интерфейс, который аллокатор должен реализовывать. И есть дефолтный из поставки CRT к компилятору. Качество которого исключительно на совести разработчика CRT.
В некоторых CRT для С++ аллокатор вообще зачастую сводится к вызову системного аллокатора. Который к С++ вообще никакого отношения не имеет.
Все остальное — в руках программиста.
Я могу встроить тот же Hoard в CRT и он тогда будет являться стандартным аллокатором.
G>>>Не разводи демагогию, давай факты. CC>>Симметрично! G>Я уже приводил код, где GC работает быстрее алокатора С++.
Аллокатора операционной системы, ты хотел сказать?
CRT вижуалки тупо зовёт HeapAlloc.
Я уже приводил тебе ответный пример, где GC не был быстрее.
Напомню:
твой код:
VS 2003 + ICC 11, C++ : 188 — CRT реализует аллокацию через HeapAlloc
VS 2008, C# : 117
мой кастомный наколенный proof-of-concept аллокатор:
VS 2003 + ICC 11, C++ : 0 или 16 (разрешения GetTickCount очевидно не хватает)
Здравствуйте, gandjustas, Вы писали:
CC>>Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"? G>Еще раз: все известные мне реализации так работают.
Мы о С++ либо об известных тебе реализациях?
CC>>Я могу встроить тот же Hoard в CRT и он тогда будет являться стандартным аллокатором. G>Не можешь. Твой CRT ниекто не будет распространять.
CC>>CRT вижуалки тупо зовёт HeapAlloc. G>И что? У него внутри такой же хип, на таком же С++.
А в С++ на GCC под Linux будет такой же хип?
CC>>Я уже приводил тебе ответный пример, где GC не был быстрее. CC>>Напомню: CC>>[q] CC>>твой код: CC>>VS 2003 + ICC 11, C++ : 188 — CRT реализует аллокацию через HeapAlloc CC>>VS 2008, C# : 117
G>Твой наколенный непотокобезопасен.
Жжошь!
Можно узнать с какого перепугу ты так решил?
Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, VladD2, Вы писали:
ГВ>>>>>см. Э. Ховёнен, Й. Сеппянен, c, М.: 1986 ГВ>>В СССР книга вышла в 1990 г. 1986-й — это финское издание.
VD>Короче, вот реальная история CL.
In 1986 X3J13 was formed as a technical working group to produce a draft for an ANSI Common Lisp standard. Because of the acceptance of Common Lisp, the goals of this group differed from those of the original designers. These new goals included stricter standardization for portability, an object-oriented programming system, a condition system, iteration facilities, and a way to handle large character sets. To accommodate those goals, a new language specification, this document, was developed.
То есть в 86-ом была только только сформирована группа по работе над CL. Учитывая, что на книгу нужно было потратить хотя бы пол года, я никак не могут понять что же описывали эти горячие финские парни, если в MIT и CMU только сели за составление стандарта.
А уж фраза:
Основой изложения нами выбран диалект Коммон Лисп, ставший "де-факто" промышленным стандартом языка Лисп. В книге представлены все важнейшие языковые формы и свойства конструкций Коммон Лиспа, а также типы функций и данных.
вообще выглядит как издевка. Может это текст из предисловия на русском языке написанный в 1990-м?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>Как видишь, горячим финским парням было что описывать в 1986-м.
VD>Как раз не вижу. Это все равно, что описывать С++ в 1979-ом.
ты б хотя бы повикипедил бы, вот тебе такая книга (1984-й) http://en.wikipedia.org/wiki/Common_Lisp_the_Language
по последним постам видно что не в теме как раз таки ты, и, как ты там говорил, "пытаешься выйти сухим из воды".
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здесь два соображения. Первое — что какими бы "какими-то" эти финны ни были, но их книга издана и в Финляндии, и в СССР. Второе — что описанный подход вполне соответствует идее об устранении побочных эффектов (чистоты) в функциональных программах. По-моему, вполне достаточные основания считать, что подобная реализация замыканий имела место быть в определённом историческом периоде и можно даже допустить, что серьёзно обсуждалась в качестве "правильной".
При наличии возможностей изменять значения переменных byvalue и есть "единственно-правильный" вид замыканий. А вообще, там приемов несколько — например есть реализации лиспов/схем, где после присвоения нового значения переменной создается новая одноименная переменная, которой оперирует текущий контекст исполнения, т.е. даже используя механизм byname как более "легковесный", получается поведения как при byvalue.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Парадоксально, что как раз иммутабельность переменных (и её вариация — замыкание byvalue) нередко подаётся апологетами ФП как несомненное преимущество. Вот и думай тут, где истинные ФП-шники, а где — падшие вероотступники. :maniac:
Здравствуйте, vdimas, Вы писали:
V>>>Просто надо четко понимать, что автоматически-генерённые моки — это костыль по сути, для ситуаций чудесного дизайна, когда одно гвоздями прибито к другому.
C>>С точностью до наоборот — нормальные моки и стабы генерируются автоматически. т.к. автоматическая генерация исключает возможность допустить ошибку или не учесть чего-то.
V>Расшифруй, пожалуйста, слово "нормально" и слово "автоматически", а так же набор возможностей этого "автоматически".
Откройте документацию по xUnit.NET, откройте документацию по RhinoMocks и почитайте. Заниматься восполнением пробелов в Вашем образовании не намерен.
V>>>А так, там где можно обойтись в юнит-тестах классичесскими ассертами — это и синтаксис нагляднее, и проще поддерживать. C>> C>>Вы вообще не понимаете что такое юнит-тесты. Не надоело показывать неграмотность?
V>А да, что такое юнит-тесты требуется еще и понимать...
Требуется. Представьте себе, может для Вас это и в новость, но предмет обсуждения требуется понимать, иначе обсуждать особо и нечего становится. Иначе все-равно что спорить с ребенком о корпускулярно-волновом дуализме.
V>Не надоело рефлексировать и показывать в очередной раз свой поверхностный взгляд? Все твои вызовы мокков ради ассертов, собственно и сделаны. И хоть они теперь не в фас, а в профиль — они были и есть цель любого автоматического теста (не обязательно юнит...)
"Все твои вызовы мокков ради ассертов, собственно и сделаны" — это напоминает генератор цепей Маркова. Взять два умных слова, и связать их между собой связующими. Получается билеберда, но звучит вроде как умно для стороннего человека.
Так вот, ликбез: мокинг выполняется с целью изолировать тестируемый объект от внешних зависимостей.
Что означает, что ожидается, что будет вызван databaseManager.BeginTransaction(), а потом в любом порядке будут вызваны Withdraw и Deposit.
Ассерты это всего-лишь предикат, который по-определению всегда true.
Assert.Equals(10, someObj.SomeIntProperty);
Assert.IsTrue(someObj.SomeBoolProperty);
и т.д. и т.п.
Ассерты и моки не цель. Это средство и ключевой механизм реализации юнит тестов.
При чем тесты ни коим образом не захламляют код. Все тесты находятся в отдельной сборке, которая "видит" (и только она одна) внутренности тестируемых сборок.
V>>>У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась.
C>>Перечень того, что не возможно сделать средствами RhinoMocks + xUnit в студию, как говорится.
V>Любую динамическую среду/заглушки, которые генерят переменный по насыщенности траффик или сообщения с разной задержкой и произвольным наполнением. Фишка в том, что реальных задержек-то и нет, текущее время эмулируется, но тестирующая последовательность слишком длинная, чтобы записывать её ручками, она генерируется программой. А таких последовательностей/программ у меня — мама не горюй.
Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests. При чем ничего невозможного в реализации этого нет — описанное реализуется элементарно в .NET.
V>Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. Элементарно средствами RhinoMocks.
V>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое.
Демагогия.
Выглядит преотлично. На много лучше, чем то, что у вас есть (а точнее нет) в unmanaged C++. lambda выражения и fluent interface дают прекрасную читабельность.
V>А теперь смотри что получается: автомоками удобно пользоваться для оформления относительно несложных тестов, где внешние условия и реакцию на них вполне можно описать декларативно и синтаксис все еще не будет раздражать.
Модульные или unit тесты ОБЯЗАНЫ быть несложными. В этом их СУТЬ.
V>Ах да, чуть не забыл... разумеется без них практически никак, если у кого-то был неудержимый понос на Ынтерфейсы в период дизайна. Собственно для них в первую очередь оно и есть.
Нет, не для них. Вам не надоело ламерствовать?
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, criosray, Вы писали: c>> Откройте для себя .NET CF и Mono. AB>Вот тут все про моно да про моно. Но хоть бы кто-нибудь показал мастер-класс на оном, а то складывается впечатление, что его защитники видели его только на картинках, а те, кто его пользовал, молчат, дабы не было стыдно.
Не, ну если интересно, то можно на официальном сайте глянуть.
Getting Started с разными FAQ и скриншотами. Companies Using Mono рассказывает о реальном использовании Mono. Например, "WikiPedia uses Mono for its search facilities. The indexing and the actual searching is done by Mono-based applications". Вот, кстати, еще интересная новость: "Unity Technologies Implements Award-Winning 3D Game Development System Using Mono".
Я только сразу оговорюсь, что сам на Mono не разрабатываю, т.к. мы пишем только под Windows.
Здравствуйте, MxKazan, Вы писали:
_>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы.
You can choose any color while the color is black, тьфу, while the platform is Windows.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK>Ты прав. Нет таких знаний. Ничего нового в разработке ПО за 10-20 лет не изменилось. Ровным счетом, Н И Ч Е Г О...
О! Слышу слова не мальчика, но мужа.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, alsemm, Вы писали:
MK>>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было A>VB улучшали непрерывно до того, что его скоро не будет. Почему с C# должно быть по другому через 10-20 лет?
Сначала Дворкин меня задалбывал этим предсказаниями чего там будет через 10-20 лет, теперь вот ты
Живи С++ и наслаждайся.
A>Алексей
Марат
Здравствуйте, ononim, Вы писали:
MK>>>> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы. O>>>Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак? MK>>Я так понимаю, сами wsWidgets или Qt от операционки никак не зависят. O>Они есть под распространенные операционки, причем не только под винду.
Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt.
MK>>Я А Qt Software самая святая O>Ой насмешили Нету такого — Qt Software. Есть лишь библиотека Qt, написанная Trolltech.
Люблю доставлять людям радость
Здравствуйте, MxKazan, Вы писали:
MK>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt.
И чем это не ответ на вопрос:
как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы
?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>>Здравствуйте, MxKazan, Вы писали: MK>>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы? MK>А тем, что она все-равно зависима.
Зависима лишь библиотека и бинарник. А не исходный код вашей программы. А зависимость библиотек никого не беспокоит точно так же никого не беспокоит то что под каждую платформу надо качать отдельный бинарник. В этом смысле потуги некоторых создать реально железо-независимые на уровне бинарников платформы выглядят сражением донкихота с мельницами. Эффектно, но нах.. никому не нужно.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, ononim, Вы писали:
O>А зависимость библиотек никого не беспокоит [...]
Особенно, если учесть статическую линковку.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, dotidot, Вы писали:
D>Здравствуйте, niellune, Вы писали:
D> Помню мне в начале 2007го года в геймдев конторе предлагали 17тр, а в других местах от 45и.
В геймдеве мало предлагают тем, кто приходит и говорит:
"Дяденька, возьмите меня поработать в вашу поднебесную распрекрасную контору. Ну если не тестером, то хоть уборщицей возьмите!!!"
Здравствуйте, MxKazan, Вы писали:
_>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы.
Я тебя порадую — программы с единым графическим интерфейсом, под разные платформы (причём платформы могут различаться сильнее чем Win и Mac) пишут практически исключительно на С++
Это игры.
А для другого софта, особенно коробочного — задачи написать единый интерфейс вообще не должно стоять. ИМХО.
Здравствуйте, Antikrot, Вы писали:
A>Здравствуйте, shrecher, Вы писали:
MK>>>Ну ты же не переживаешь, например, что Intel радикальным образом изменит набор инструкций своих процессоров. S>>У Intel-a была такая попытка — Itanium64. Так был послан далеко и надолго, вернулись на Amd64. A>вернулись? ты вообще в курсе какой из этих наборов когда появился?
Что касается дат, то IA64 появился раньше, чем AMD64
Попытались сделать Itanium2 (IA-64), со своей системой команд, но ничего толкового невышло из-за компилятора.
"The Itanium approach was supposed to be so terrific—until it turned out that the wished-for compilers were basically impossible to write" [1]. http://en.wikipedia.org/wiki/IA-64
"вернулись на Amd64" означает, что IA64 со своей уникальной системой команд потрепел полный фиаско, и вернулись на старый х86, который просто был расширен до 64 бит.
Здравствуйте, ononim, Вы писали:
_>>>Главное что бы работа нравилась, а язык — второстепенен. _>>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK>> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы. O>Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали:
MK>>>>Да ё-мае, вообще не понимаю, чего нельзя было сразу с появленияем ПК сделать его идеальным раз и навсегда. S>>>В контекте этого топика, как раз C++ стандарт сделан очень удачно и существует без изменений. MK>>Для чего нужен C++0x, ума не приложу...
ГВ>В сравнении с частотой изменений C# это почти что "постоянный".
C# за первые 7 лет своей жизни изменился аж два раза.
Причем второе изменение было только расширением и сохраняло обратную совместимость как по исходникам, так и по бинарникам.
При этом C++ как язык меняется с каждо версией компилятора от Intel\Microsoft\gcc.
Здравствуйте, StandAlone, Вы писали:
NBN>>Происходит практически необратимая деградация...
SA>Истинны слова твои, о Мастер! SA>После того, как ступил я на тёмную сторону силы кодирования и прельстился сладким речам демона Garbage Collector,
Я не понял, ты что думаешь что в С++ нет GC?
SA>утратил мой мозг способность практически полностью вкуривать вот в этот феерический ПЦ:
SA>
Мы тут вроде обсуждаем С++ и C# А эта портянка написана индусом на мракобесном С.
SA>Рыдаю и посыпаю главу выдранными волосьями. SA>Нет мне обратного пути к plswczwtfomfgstr ((
Как тут уже верно замечали — выбор языка определяется задачами. Я вот уже пару раз изучал шарп — но так и не нашёл куда его применить в своих задачах Реально смог применить только один раз — для прототипа.
Здравствуйте, gandjustas, Вы писали:
NBN>>По факту это остаётся в рамках приколов, их доля крайне несущественна. G>С чего вы взяли?
С того что эти проги очень тормозявы.
G>.NET CF плотно держит рынок быизнес-приложений на мобильных устройствах.
Что такое бизнесприложение для покета? Быстронаписанная утилитка для какой-то фирмы?
G>На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA.
Маленьких казуал.
G>>>4)Зная C# вполне можно писать кросплатформенные приложения с помошью Mono (только десктоп), которые запускаются под Windows, Linux, Mac и iPhone. NBN>>Можно, только не стоит. G>Ну вам может и не стоит, а другому может быть интересно.
В том то и дело, что _интересно_. А мы тут делом занимаемся
Здравствуйте, gandjustas, Вы писали:
G>>>GTA 4 вроде как на XNA сделали. NBN>>Маловероятно. Пруфлинк? G>Насчет XNA в PC версии не уверен, но .NET юзает.
Может и юзает, но написан без него.
NBN>>Я знаю, что есть на хна игры — но это как правило маленькие казуалки конкретно для хабокса. G>для хабокса не только кауалки пишут, хабокс имеет неслабое железо и тянет очень хорошие игры.
Ага, и эти игры пишут на плюсах, часто с разным зоопарком разных языков в качестве скриптовых. И пишут их как правило под несколько платформ -> это возможно только на плюсах.
NBN>>Эмбеддед разный бывает. Например те же покеты и смарты — где пишут на самом распрекрасном С++ с бустом и прочим. NBN>>И к мониторам, холодильникам, кандеям — тоже софт на плюсах пишут (сам участвовал или ходил рядом). G>Да уж, вам побольше повезло. Все что мне удалось увидеть в ембеде (не считая покеты и смарты) на С++ тормозило страшно по сравнению с голым С.
Каким образом С++ может тормозить в сравнении с С????? Может быть только наоборот, так как С более убогий язык в котором сложнее проводить оптимизацию.
G>Насчет покетов и смартов — там большое засилие java.
Покеты и ява
Засилие явы есть на обычных телефонах — так как для того чтобы под них писать на плюсах нужно быть разработчиком собственно девайсов.
А смарты — там ява конечно есть, но в топах почему-то восновном С++.
G>>>это что за зверь такой? NBN>>middleware->Google G>Причем тут гугл?
Если не знаешь термина — смотри гугль.
G>>>Я так понимаю что на С++ пришут с целью усложнения взлома, реже с целью уменьшения размера. NBN>>Нет. Пишут на С++ чтобы хорошо продавалось. Причём тут взлом — вообще непонятно. G>А как С++ связан с продажами?
На С++ пишется более качественный для юзера софт — что хорошо сказывается на продажах.
NBN>>Качественный софт пишется на С++. Остальные решения скорее всего менее качественны. G>Что значит качественный? G>С++ имеет чуть ли не самый высокий показатель по плотности багов на единицу функционала при разработке.
Во-первых, такие высказывания нужно обосновывать ибо это очевидный бред.
Во-вторых, качественный — значит качественный, софт который легко ставится, имеет нативный интерфейс и тормозит незаметно.
Проблемы программистов или тестировщиков меня мало интересуют. Кроме того — в реальной разработке, доля программирования в общих человекомесяцах обычно незначительна -> влияние языка на срок разработки — тоже.
NBN>>Ну к примеру в одном из холиваров рассказывали про серверные решения для дойчебанка. Ищущий — да обрящет. G>Ну единичные решения — вполне может быть, что чтобы массово С++ на серверах — такого сейчас нет, в основном java, по-немногу .NET пробирается.
Да не, это тоже единичные решения G>C++ где-то может быть исплючительно по историческим причинам.
Или по вопросам перфоманса
Здравствуйте, gandjustas, Вы писали:
NBN>>>>По факту это остаётся в рамках приколов, их доля крайне несущественна. G>>>С чего вы взяли? NBN>>С того что эти проги очень тормозявы. G>Ну далеко не всегда быстродействие имеет значение.
Ну да, естественно. Тем не менее в топах я не нашёл шарповых продуктов.
NBN>>Что такое бизнесприложение для покета? Быстронаписанная утилитка для какой-то фирмы? G>Чаще всего торговля, куча персонала бегает с такими девайсами. Также в ресторанно-гостиничном бизнесе применяется. G>Вполне серьезные решения, которые не за неделю пишутся.
Это да, хотя преимущество шарпа в сравнении скажем с HTML/JS не очевидно.
G>>>На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA. NBN>>Маленьких казуал. G>http://ru.wikipedia.org/wiki/Список_игр_на_Xbox_360 G>Далеко не все из них маленькие казуалы.
Да я не говорю, что для хабокса пишут только маленькие казуалки! Наоборот, появление платформ нового поколения вызвало резкий рост уровня разработки игр.
Но большие игры _не_ пишут на ХНЕ, её создавали именно для казуалок и восновном для хабокса.
G>>>Ну вам может и не стоит, а другому может быть интересно. NBN>>В том то и дело, что _интересно_. А мы тут делом занимаемся G>Вопрос автора топика в чем был? G>Он ищет язык для дельнейшего развития, так что ваши предпочтения мало отношения к делу имеют.
Он просто сам не знает чего ищет. Язык программирования — определяется задачей и ничего не мешает знать хоть десяток языков
Есть достаточно много задач, где приоритет С++ — несомненен и зп платятся очень неплохие. Но при этом знание голого С++ тебе ничем не поможет — надо знать и уметь решать задачу — собственно платят то за неё
NBN>Нельзя. Просто нельзя сделать на яве/шарпе более качественно чем на С++ при прочих равных.
NBN>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>>>Для игр и мобильного мира они не подходят. Совсем. G>>Ну можете продолжать в это верить а другие спокойно клепают игры на XNA и приложения для Windows Mobile. NBN>На ХНА клепают казуалки. Она для этого приспособлено — быстро склепать казуалку только для хбокса. Я тут даже спорить не буду. NBN>На CF тоже что-то клепают, тоже спорить не буду. NBN>Но факт в том, что их доля — маленькая и использовать их можно далеко не всегда. NBN>Обрати внимание, что и Spb и Paragon (мировые лидеры в своих нишах) делают практически все продукты нативными.
NBN>>>Для миддлеваре — тоже. G>>По запросу "middleware" гугль начал рассказывать про веб-сервисы и серверы приложений. Может я что-то пропустил, но когда их начали делать на C++? Обычно java или .NET. NBN>http://en.wikipedia.org/wiki/Middleware NBN>К миддлеваре относятся всякие движки и самостоятельные программные компоненты. Естественно для веба это как правило вебоспецифично.
Как раз миддлеваре описанные в этой статье на java\.NET делаются.
А про всякие движки и программные компоненты можно поподробнее?
С++ сам по себе не интеропается с другими языками (даже с другой программой на С++), это делается или через нативные средства ОС (DLL, so, COM), которые выражены на языке С, или через абстрактные протоколы, которые вообще говоря от языков реализации не зависят.
G>>>>Тогда причем тут C++ ? Большенство задач решаемых на C++ можно решать и на других языках более качественно. NBN>>>Нельзя. Просто нельзя сделать на яве/шарпе более качественно чем на С++ при прочих равных. G>>Ну тогда определение "качества" в студию. NBN>Определение ниже. G>>Обычно под качеством кода понимают обратную величину плотности ошибок на единицу функционала, C++ по этому параметру очень далек. NBN>Бред, это зависит от программиста.
Что зависит от программиста? Определение качества? Ну тогда о чем разговор вести?
NBN>Например при моём стиле (я соблюдаю уйму правил кодингстандарта) программирования мемориликов нет вообще (если они не платформоспецифичны), а логические ошибки — не завият от языка.
Действительно логические ошибки не зависят от языка, и средняя плотность таких ошибок на тыщу строк примерно одинаково.
Таким чтобы уменьшить количество ошибок надо вибирать язык, который позволяет решать теже задачи меньшим объемом кода.
G>>Еслим рассматривать удовлетворение пользователя деленное на затраченное бабло, то managed языки тоже впереди. NBN>В реальном проекте — нет. Т.е. конечно можно придумать проекты где они зарулят — тут спорить глупо. Но когда разговор заходит о хорошей скорости и кроссплатформенности — С++ практически безальтернативен.
Каком реальном проекте? Кроссплатформенность далеко не всегда нужна, скорость тоже не всегда является определяющим фактором.
С появлением на рынке нетбуков выяснилась одна интересная вещь — пользователям вполне хватает примерно 15% мощности современного ПК. И если вы пишете для ПК то двухкратная разница в быстродействии может даже остаться незамеченной.
NBN>Например, я учавствовал в одном проекте, онлайновый сервис с клиентом средней сложности. Изначально он был сделан на яве. Потом наняли меня, чтобы я перевёл его на С++ и портировал на покеты, симбиан. И, что главное, обеспечил красивый интерфейс. На яве это было сделать невозможно — вылезали за разумные рамки производительности.
Ниче не понял, если сервис онлайновый, то зачем его портировать на покеты и симбиан?
G>>>>Платят то за решение задачи, а не "решение задачи на С++". NBN>>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится. G>>Это также решаемо на mono, причем с меньшими затратами. NBN>Это шутка http://tirania.org/blog/archive/2008/Nov-03.html
Здравствуйте, gandjustas, Вы писали:
NBN>>>>Качественный софт пишется на С++. Остальные решения скорее всего менее качественны. G>>>Что значит качественный? G>>>С++ имеет чуть ли не самый высокий показатель по плотности багов на единицу функционала при разработке. NBN>>Во-первых, такие высказывания нужно обосновывать ибо это очевидный бред. G>Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
Иногда больше, иногда столко же. Зависит от стиля и используемых библиотек. Иногда большая часть кода достаточно безопасна, а опасная (расчёты всякие) на разных языках будет иметь схожий объём.
G>Другие под качеством обычно понимают удовлетворение заказчика(соответсвие требованиям и отсуствие багов) деленное на трудозатраты. По такой метрике С++ тоже далеко не лидер.
Первый тезис — правильный (кроме как про отсуствие багов — они довольно часто допустимы). Второй тезис — совершенно не следует из первого и являетя ложным.
NBN>>Проблемы программистов или тестировщиков меня мало интересуют. Кроме того — в реальной разработке, доля программирования в общих человекомесяцах обычно незначительна -> влияние языка на срок разработки — тоже. G>Что такое "реальная разработка"? G>В то разработке с которой я хоть как-то сталкивался доля кодирования+отладки+тестирования гораздо больше 50% была и от трудозатраты языка сильно зависели.
ИМХО это точка зрения программиста.
Вообще — С++ чувствителен к квалификации программиста. Например, у меня на проект с годовым сроком разработки, по результатам финального тестирования не было ни одного меморилика, хотя до конца проекта этих тестирований не проводилось вообще.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
H>Статистика показывает обратное -- таки зависит. Если это не очередное сотрясание воздуха, а вопрос тебе действительно интересен, рекомендую поискать материалы о том, как родилась Ada, и что стало причиной этого рождения.
Ну во время появления ada (1993 год) вполне могло и зависеть.
NBN>>>Во-вторых, качественный — значит качественный, софт который легко ставится, имеет нативный интерфейс и тормозит незаметно. G>>Офигеть, то есть пофиг чего софт делает, лишь бы нативный интрефейс и "тормозил незаметно". G>>Странные у вас предстваления о качестве.
H>При аналогичной функциональности, выбор идет в рамках озвученных тезисов.
Если есть два полностью аналогичных продукта, то да.
Но современные языки позволяют выпустить продукт гораздо раньше и занять рынок до того как конкуренты выпустят чуть более быстрый вариант.
Здравствуйте, NikeByNike, Вы писали:
H>>Странно читать такое... По-моему, так любой язык не тянущий на себе/с собой груза абстракций, вполне пригоден для этого. Например вот: Lazarus IDE for FreePascal
NBN>В абстрактно случае — да. В практическом — где ты возмёшь программистов, где примеры/фрагменты/куски кода и т.п. вещи?
Вообще, я просто привел пример. Но можно и обсудить Программистов можно набрать из числа дельфистов, коих у нас пол-страны (freepascal практически калька с Delphi, с оговорками ес-но). Код/примеры все на том же сайте, lazarus в исходниках идет. Кстати, есть пример кросс-платформеного софта на freepascal -- Pixel image editor
Здравствуйте, gandjustas, Вы писали:
H>>Статистика показывает обратное -- таки зависит. Если это не очередное сотрясание воздуха, а вопрос тебе действительно интересен, рекомендую поискать материалы о том, как родилась Ada, и что стало причиной этого рождения. G>Ну во время появления ada (1993 год) вполне могло и зависеть.
Ты все же поищи материалы, там интересно процесс тестирования описан, и моменты влияющие на количество ошибок. К сожалению, я ссылок дать не могу т.к. у меня это где-то в бумажном варианте лежит.
G>>>Офигеть, то есть пофиг чего софт делает, лишь бы нативный интрефейс и "тормозил незаметно". G>>>Странные у вас предстваления о качестве.
H>>При аналогичной функциональности, выбор идет в рамках озвученных тезисов. G>Если есть два полностью аналогичных продукта, то да.
Именно так. Сравнивать неравновесные продукты смысла не имеет, ибо понятно, что функционал на первом месте.
G>Но современные языки позволяют выпустить продукт гораздо раньше и занять рынок до того как конкуренты выпустят чуть более быстрый вариант.
Здравствуйте, gandjustas, Вы писали:
H>>При аналогичной функциональности, выбор идет в рамках озвученных тезисов. G>Если есть два полностью аналогичных продукта, то да. G>Но современные языки позволяют выпустить продукт гораздо раньше и занять рынок до того как конкуренты выпустят чуть более быстрый вариант.
Яркий пример — микрософт. Пока они пытались написать висту на C#, а потом переписывали ее на C++, эппл отхватил у них приличный кусок рынка. Та же самая история с мобильными устройствами, пока микрософт загоняла разработчиков в светлый управляемый мир, эппл выпустила iphone. Теперь ms в положении догоняющего. При этом в обоих случаях микрософт был практически монополистом — тут шла речь не о захвате рынка, а просто об удержании. Много им C# помог? Т.е. теория — это одно, а практика показывает совсем другое.
Здравствуйте, COFF, Вы писали:
COF>Вообще, я против C# и .нет вообще ничего не имею, но массовое отсутствие коммерческих коробочных продуктов на управляемых языках настораживает. Это можно трактовать по разному, но факт налицо. Со статистикой не поспоришь При этом .нет на рынке уже почти 10 лет, ява — уже более 15. Средств в них вбухано немерянно. При этом, конечно, свои ниши (и немаленькие) у них несомненно есть. Но так получается, что все интересные темы пишутся на C++.
Коробочный десктопный софт — самая слаборазвивающаяся область разработки. Удерживает сильно существующий codebase.
Я вообще не могу вспомнить что новое появилось для широкого круга пользователей. за последний год.
Здравствуйте, hattab, Вы писали:
H>Вообще, я просто привел пример. Но можно и обсудить Программистов можно набрать из числа дельфистов, коих у нас пол-страны (freepascal практически калька с Delphi, с оговорками ес-но). Код/примеры все на том же сайте, lazarus в исходниках идет. Кстати, есть пример кросс-платформеного софта на freepascal -- Pixel image editor
ещё пример — peazip. вообще, vcl в их реализации вполне кроссплатформенна
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>в таком случае языка современней машинных кодов, в твоём понимании так и не появилось. но почему-то люди, включая тебя пишут на языках постарее — асме, c++ том же
COF>Хорошие компиляторы генерируют достаточно неплохой код и то иногда приходится на ассемблере модули использовать
BZ>>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
COF>Аналогия вещь хорошая, но обоюдоострая. Представь, что все начнут мусор не в урны кидать, а на землю — все равно дворник потом подберет Наверное, это будет не очень хорошо. Продуманная стратегия управления ресурсами в C++ позволяет не заботиться о памяти точно в такой же высокоуровневой манере.
В такой аналогии нужно больше деталей.
GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение.
Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, COFF, Вы писали:
COF>>Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков?
BZ>а ты следишь за всеми процесами в системе и напрягаешься от мусора в памяти?
BZ>в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких
Обычно, для однотипных данных, которых много, выделяют тем или иным способ свой уже фрагментированный пул. Это позволяет 1) контролировать тех, кто не отдал память вовремя 2) работать быстро и со строго ограниченным сверху размером выделенной памяти.
Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой?
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>В такой аналогии нужно больше деталей. G>>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. NBN>И тут вжииик, и оказывается что у меня на компе мало памяти... Всего гиг. Пока не поставил серьёзное ява приложение не догадывался, что у меня мало памяти.
Сейчас память стоит очень дешево, купить себе пару гигов может позволить каждый.
G>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет. NBN>Ага, особенно это интересно на телефоне, где тебе приходится заниматься колдовством, вместо нормального распределения ограниченного ресурса
В телефони памяти просто мало, там нельзя писать также как на PC, память будет кончаться независимо от языка.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>я их и решаю на C++. когда это необходимо. а остальное пишу на хаскеле. учитывая, что >90% кода не нуждается в ассемблерной эффективности, писать всё на С++ — это всё равно что всюду таскать с собой ружьё на случай нападения медведя из ЕР :))
Вообще, изначально вопрос стоял так — стоит ли учить C++ или C#? Я так понимаю, что все-таки C++? ;)
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. И GC не будет. G>>А если кончится реальная физическая память, то страницы будут вытеснены, а освободившая память отдастся тому кому оно нужно.
COF>Я не хочу вдаваться в детали, можно дискутировать об особенностях выделения памяти с gc или без него сколь угодно долго, но факт налицо — управляемые приложения на десктопе тормозят и жрут память. В теории возможно они хороши, а C++ плох, но практика пока этого не показывает.
Ну покажите примеры программ на десктопе которые тормозят и жрут память?
Я постоянно пользуюсь двумя десктомпными программами на .NET : paint.NET и Windows Live Writer, ни одна из них не тормозит и не жрет память.
Журт панять у меня на компе больше всего в доску неуправляемые браузеры.
Не надо в качестве примера приводить плохо написанные программы на .NET или java, плохо написанных программ на С++ все равно больше.
Здравствуйте, gandjustas, Вы писали:
G>Не надо в качестве примера приводить плохо написанные программы на .NET или java, плохо написанных программ на С++ все равно больше.
Здравствуйте, gandjustas, Вы писали:
G>>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. G>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
Я вчера решил помониторить сборку xmlrpc для .Net (http://www.xml-rpc.net/). В общем, на каждый вызов метода через XML-RPC (метод принимает два параметра и возвращает бинарник на ~200Kb) происходит 3 вызова сборщика мусора (мониторил ProcessExplorer'ом). Я на перформанс даже тестировать не стал...
Здравствуйте, alsemm, Вы писали:
NBN>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится. A>Любая встравиваемая real-life JVM — это только C. A>Телефонный софт (OS, стандартные приложения) — только C.
Это далеко не так, хотя этой нечисти там действительно хватает
Здравствуйте, gandjustas, Вы писали:
G>Ну покажите примеры программ на десктопе которые тормозят и жрут память?
О-о-о! Их есть у меня Это чудо называется Creative Docs .NET. После запуска, без открытого документа, мило кушает 192 метра + виртуалки в районе 180 (по показаниям ProcessExplorer'a). Скорость работы с документом тоже потрясная: при скроллинге сперва прокручиваются линейки, а потом, неспешно, за ними ползет содержимое документа. Терпения хватает только на посмотреть. PM 1.7 512Mb NVidia GeForceFX Go5200.
G>Я постоянно пользуюсь двумя десктомпными программами на .NET : paint.NET и Windows Live Writer, ни одна из них не тормозит и не жрет память.
Эти у меня тоже есть, к слову сказать WLW тормоз порядочный при его-то скромном функционале, а Paint.NET'ом я вообще не пользуюсь
Здравствуйте, gandjustas, Вы писали:
G>>>Ну покажите примеры программ на десктопе которые тормозят и жрут память?
H>>О-о-о! Их есть у меня Это чудо называется Creative Docs .NET. После запуска, без открытого документа, мило кушает 192 метра + виртуалки в районе 180 (по показаниям ProcessExplorer'a). Скорость работы с документом тоже потрясная: при скроллинге сперва прокручиваются линейки, а потом, неспешно, за ними ползет содержимое документа. Терпения хватает только на посмотреть. PM 1.7 512Mb NVidia GeForceFX Go5200.
G>Ну напишите получше на C+ или на вашем любимом Delphi.
Не нужно обижаться, ты сам примеры просил...
G>Или просто не пользуйтесь тормознутым барахлом.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
H>>>Я вчера решил помониторить сборку xmlrpc для .Net (http://www.xml-rpc.net/). В общем, на каждый вызов метода через XML-RPC (метод принимает два параметра и возвращает бинарник на ~200Kb) происходит 3 вызова сборщика мусора (мониторил ProcessExplorer'ом). Я на перформанс даже тестировать не стал...
G>>Сборка мусора иногда происходит и что?
H>3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна.
Ну так вы померяйте перформанс, а то какие-то пространные размышления ни о чем.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, minorlogic, Вы писали:
M>>Здравствуйте, gandjustas, Вы писали:
G>>>Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
M>>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ? G> G>Да ну? G>Вым наверное стоит изучить как аллокаторы и GC работают.
Вы такими фразами или шутите или демонстрируете свое невежество.
Здравствуйте, gandjustas, Вы писали:
D>>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой? G>Этого не гарантирует даже аллокатор ОС, в принципе этого не может гарантировать никто.
Рекомендую ознакомиться с алгоритмами алокаторов более подробно .
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, COFF, Вы писали:
COF>>Вообще, я же не против .нет, я против огульного охаивания C++ определенными дот-нетчиками MK>Вот тут я тебя полностью понимаю. И я тоже против огульного охаивания .Net и его приравнивания к VB.
Ну раз такая пьянка пошла, я тогда против огульного охаивания VB и приравнивания его к... ну пусть к Дельфям
Здравствуйте, hattab, Вы писали:
H>Для избавления от фрагментации памяти примеются специальные аллокаторы/менеджеры с пулами. Например в Delphi, c версии 2006 идет FastMM: H>
Description:
H> A fast replacement memory manager for CodeGear Delphi Win32 applications that
H> scales well under multi-threaded usage, is not prone to memory fragmentation,
H> and supports shared memory without the use of external .DLL files.
ага. и как можно устранить дефрагментацию памяти, а не просто в description это вписать — не подскажешь?
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, hattab, Вы писали:
H>>3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна. MK>Ну мало ли что там делает это один вызов. Ты не на число запусков сборщика смотри, а на общий перформанс. При этом я ничего не обещаю, просто хочу сказать, что не стоит так сильно заморачиваться почему происходит вызов GC. В конце концов тот же rpc-xml может это сам явно делать по каким-то своим умозаключениям. У меня вот в WPF'ной проге, окна иной раз не собираются по 10-20 минут. Можно ли быть уверенным, что моя прога в сто раз быстрее твоей?
я не знаю насчёт net, но в ахскеле и по слузам в яве тоже двухпоколенный сборщик мусора. так он делает малую сборку через каждые 256кб выделенной памяти и никому это не мешает. так что ваозможно тут проблема только в прокладке
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
D>>>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой? G>>Этого не гарантирует даже аллокатор ОС, в принципе этого не может гарантировать никто.
M>Рекомендую ознакомиться с алгоритмами алокаторов более подробно.
А с ними достаточно подробно знаком, сам писал аллокаторы на ассемблере и несколько разных для С++
Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>ага. и как можно устранить дефрагментацию памяти, а не просто в description это вписать — не подскажешь?
H>>Собственно, я уже написал -- пулами.
BZ>это не гарантирует пропадания фрагментации. представь выделение миллиона 7-байтовых ячеек, освобожддение каждой второй из них и затем выделение миллиона 8-байтовых
Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
Здравствуйте, BulatZiganshin, Вы писали:
NBN>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался.
BZ>асм ещё универсальней. подумай, почему с 80-х годов им перестали пользоваться
Здравствуйте, BulatZiganshin, Вы писали:
BZ>вот то-то и оно, что C++ почитай описание GC. ведь это очень просто — если последний большой GC нашёл 10 мб реальных объектов, то следующий GC можно сделать когда общий объём распределённой памяти будет 20 мб или даже 11 мб. это и даёт гарантии
GC не используется в С++ только по причине отсутствия реальной необходимости в нем.
Если сильно приспичит — ничего не мешает использовать GC и в C++, это даже имеет смысл в движках активно работающих с графами.
Я (и не только я) когда-то писал
Здравствуйте, gandjustas, Вы писали:
H>>>>Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
G>>>Только общее увеличение потребления памяти получим. G>>>А кто-то еще ругается что .NET много памяти жрет.
H>>Конечно получим, куда же мы денемся. Только оверхед сильно меньше, чем у .Net . Это я про общий случай, и по реальным приложениям это видно. G>И по какой причине он станет "сильно меньше"?
Ты сейчас о чем говоришь, об общих случаях или о той синтетике с 7-8 байтовыми ячейками? Если о синтетике, то там выделение нафиг не нужно, достаточно динамического массива с размером ячейки в 8 байт. Получим при этом оверхед в 1 байт на ячейку. Если же ты об общих случаях, то тут существующий софт тому доказательство.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
Даю подсказку
int a = 0;
int b = 3 + a;
Очень память дефрагментирует ? затратит линейное время на на выделение памяти и т.п. ?
Здравствуйте, BulatZiganshin, Вы писали:
BZ>в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких
Написал я как то монитор выделяемой произвольным процессом памяти. Дабы значицца, посмотреть что там да как происходит в закулисье.
И что я только не гонял сей прогой, но пресловутой фрагментации увидеть так и не удалось.
HeapAlloc, который уже давным давно используется вместо говноаллокатора ранних версий CRT, отлично справлялся сам.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Ты сейчас о чем говоришь, об общих случаях или о той синтетике с 7-8 байтовыми ячейками? Если о синтетике, то там выделение нафиг не нужно, достаточно динамического массива с размером ячейки в 8 байт. Получим при этом оверхед в 1 байт на ячейку. Если же ты об общих случаях, то тут существующий софт тому доказательство.
G>>Почитай как работает выделение памяти в .NET. Там нету никакого оверхеда.
H>Рихтер: H>
У каждого объекта есть пара таких полей: указатель на
H>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них
H>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в
H>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту
H>по 16 байт
H>Это оверхед не аллокатора, а организации данных. Но тем не менее.
указатель на таблицу виртуальных методов есть почти всегда и в неуправляемых языках, так что реальный оверхед создает SyncBlockIndex, который меньше оверхеда стандартного аллокатора C++.
G>>Оверхед может возникнуть из-за того что создается больше обеъктов, но это уже зависит от программы, а не от аллокатора. H>На практике мы видим, что .Net софт потребляет больше нежели нативный со всеми его пулами. Это позволяет говорить о том, что вся инфраструктура управления памятью в .Net имеет больший оверхед нежели в нативном софте.
Большее потребление памяти вовсе не означает оверхеда аллокатора или какой-то-там "ифнраструктуры управления памятью".
Это больше зависит от объектной модели. В .NET, как и в java, как и в Delphi(!) все обеъекты создаются в куче, причем учитывая неопределенное время жизни объектов в упрвыляемых языках в среднем объектов получается больше примерно на размер двух поколений GC (это не так много).
В C++ большая часть короткоживущих объектов создается на стеке.
Кроме того для работы аллокаторы .NET необходимы непрерывные куски памяти, а это требует резервирования и выделегния большего объема оперативной памяти, чем реально испольхуется программой (это к тому что не надо верить цифирке в Task Manager).
Причем все эти особенности выделения паяти в .NET только ускоряют работу.
Кроме всего прочего фреймворк постоянно использует возможности, которых просто нету в C++ (метаинформация, культуры и прочее), что потребляет дополнительную память.
Все это создает статическую прибавку к потребляемой памяти и практически не влияет на быстродействие.
Черезмерное потребление памяти программами на .NET — исключительно вина разработчиков.
Здравствуйте, sergey2b, Вы писали:
NBN>>У шестёрки в первых версиях был галимый аллокатор, точно помню... S>Большое спасибо за ответ. S>Может вы вкурсе, они его исправили в sp5 or sp6 или нет?
Дык свой напиши на HeapAlloc, если сомневаешься в качестве стандартных.
Перекрой глобальные new/delete если на С++
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
H>>Рихтер: H>>
У каждого объекта есть пара таких полей: указатель на
H>>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них
H>>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в
H>>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту
H>>по 16 байт
H>>Это оверхед не аллокатора, а организации данных. Но тем не менее. G>указатель на таблицу виртуальных методов есть почти всегда и в неуправляемых языках, так что реальный оверхед создает SyncBlockIndex, который меньше оверхеда стандартного аллокатора C++.
Аллокатору нужны списки блоков? Нужны. Нужны размеры блоков? Нужны. Эти вещи, используемые любым аллокатором, считать оверхедом нельзя. Считать оверхедом можно большее, нежели было запрошено, выделение памяти, что присутствует в приведенном в качестве примера дельфийском менеджере (но учитывая эффективность пулов, этот оверхед обсуждать смешно).
G>>>Оверхед может возникнуть из-за того что создается больше обеъктов, но это уже зависит от программы, а не от аллокатора. H>>На практике мы видим, что .Net софт потребляет больше нежели нативный со всеми его пулами. Это позволяет говорить о том, что вся инфраструктура управления памятью в .Net имеет больший оверхед нежели в нативном софте. G>Большее потребление памяти вовсе не означает оверхеда аллокатора или какой-то-там "ифнраструктуры управления памятью".
Я и не говорю про оверхед аллокатора, я конкретно указал о каком оверхеде идет речь.
G>Это больше зависит от объектной модели. В .NET, как и в java, как и в Delphi(!) все обеъекты создаются в куче, причем учитывая неопределенное время жизни объектов в упрвыляемых языках в среднем объектов получается больше примерно на размер двух поколений GC (это не так много).
Ok. Можем назвать это оверхедом объектной модели .Net, только сути это не изменит -- кушать все равно хочется сильнее К слову сказать, в Delphi я могу, при желании, создать объект и на стеке, только чаще всего необходимости в этом нет.
G>В C++ большая часть короткоживущих объектов создается на стеке. G>Кроме того для работы аллокаторы .NET необходимы непрерывные куски памяти, а это требует резервирования и выделегния большего объема оперативной памяти, чем реально испольхуется программой (это к тому что не надо верить цифирке в Task Manager). G>Причем все эти особенности выделения паяти в .NET только ускоряют работу.
Во-первых, я не мониторю TaskManager'ом, а использую ProcessExplorer (там цифирки более другие ) Во-вторых, в Delphi менеджер памяти тоже предварительно создает пулы (в текущей версии в количестве 55(!) штук. Общая эффективность использования пулов для 12000 различных объектов составляет ~95% (это показания трекинга)), но при этом перерасхода памяти не наблюдается. В-третьих, под задачу можно аллокатор поменять (существуют и комммерческие и бесплатные решения).
G>Черезмерное потребление памяти программами на .NET — исключительно вина разработчиков.
Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Меняется не столько сам C++, сколько его реализация. Не одно и то же, однако. G>>Ну и в чем различия?
ГВ>Скажи пожалуйста, ты правда не понимаешь разницу между стандартом ANSI и реализацией стандарта тем или иным компилятором? Или просто хочешь развести меня на очередной виток объяснения очевидных вещей?
Меня не это интересует.
Меня интересует чем отличается "сам язык" (не его стандарт) от реализации этого языка в конкретном компиляторе.
Все программисты на C++ знают что стандартный C++ это далеко не тот C++ на котором пишут программы. Так что в этом контексте "сам язык"?
Здравствуйте, gandjustas, Вы писали:
G>Можете посмотреть Windows Live Writer, но анлогов вообще нет, Windows Media Center — аналогично.
Совершенно верно, аналогов этому, гхм, и правда нет.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>>>Это оверхед не аллокатора, а организации данных. Но тем не менее. G>>>>указатель на таблицу виртуальных методов есть почти всегда и в неуправляемых языках, так что реальный оверхед создает SyncBlockIndex, который меньше оверхеда стандартного аллокатора C++.
H>>>Аллокатору нужны списки блоков? Нужны. Нужны размеры блоков? Нужны. Эти вещи, используемые любым аллокатором, считать оверхедом нельзя. Считать оверхедом можно большее, нежели было запрошено, выделение памяти, что присутствует в приведенном в качестве примера дельфийском менеджере (но учитывая эффективность пулов, этот оверхед обсуждать смешно). G>>Еще раз, в .NETовском аллокаторе не нужны ни списке блоков, ни размеры. (размеры есть в метаданных)
H>Списки по любому нужны (т.е. GC все равно строит граф всех объектов в поколении).
Вы бы разобрались что скрывается под словами "строит граф", обычный рекурсивный обход без построения динамических структур.
Оверхеда там действительно нет, как бы вам не хотелось обратного.
H>Размеры, и правда можно из метаданных получать, заплатив перформансом
С чего бы? Метаданные то в памяти лежат (это как раз лишние пара метров занимаемой памяти).
H>>>Я и не говорю про оверхед аллокатора, я конкретно указал о каком оверхеде идет речь. G>>Только этот оверхед не влияет на производительность. G>>Вы же не боспокоетесь так исльно из-за лишнего дестяка мегабайт.
H>Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера: H>
Как видите, сбор мусора вызывает существенное снижение производительно-
H>сти — это основной недостаток управляемой кучи.
Только это все может работать быстрее, чем аллокатор на основе списков.
G>>Я больше чем уверен что вы спокойное кешируете в памяти множество данных, получаемых извне. H>По требованию алгоритма, но не аллокатора
А какая разница?
G>>Кстати при отсутствии необходимости создавать объекты на стеке многие С++ники часто ргугают другие языки из-за отсуствия такой возможности. H>Ну на стеке быстрее, просто...
Не всегда, размещение объектов на стеке часто приводит к копированию этих объектов когда не надо.
Для выпрямления такой ситуации в C++ есть ссылки — безопасный, но ограниченный в возможностях аналог указателей.
G>>Вообще "объем памяти, занимаемый программой" очень эфимерная величина. Есть workset, есть commited memory, есть reserved memory, причем не один из этих параметров не показывает реальной величины используемой памяти в течение какого-то промежутка времени. H>Там есть Private bytes.
И че?
G>>>>Черезмерное потребление памяти программами на .NET — исключительно вина разработчиков. H>>>Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)? G>>Нативная программа использует GDI+ для этих целей? G>>Память там в основном жрет не .NET, а GDI+ (который тоже нативный).
H>Не смеши. Не жрет GDI+ столько памяти. Более того, модель использования GDI+ отличается от GDI, требуя ресурсы (кисти и прочее) не накапливать, а создавать по мере необходимости. Я тебе могу выслать бинарник который рисует с использованием GDI+, так у него расход выше 4.1Mb не поднимается.
Меня измерения потребляемой памяти на HelloWorld не интересуют.
G>>Кроме того перечитайте еще раз мой пост о статическом оверхеде .NET, может тогда поймете почему не стоит сравнивать потребление памяти на программах типа HelloWorld H>Это далеко не HelloWorld. Впрочем, сравнивать все равно, что. У .Net, расход на аналогичных вещах выше, такова объективная реальность.
Да как раз не все равно. Ты перечитай еще раз о чем я тебе толкую. .NET поребляет больше памяти на практически константную величину. Истории о том что кто-то запустил программу на .NET и она схавала сразу все свидетельствуют о криворукости автора программы, а не об особенностях работы с памятью в .NET.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Возьмите Paint.NET — на многих задачах работает быстрее фотошопа, но это разные весовые категории.
H>Дельфовый PhotoFiltre разрывает Paint.NET на куски
Скачал и поставил себе это.
Срзу узнал дельфовую программу. Дофига непонятных непермещаемых тулбаров. Дофига пунктов в меню, даже больше чем у фотошопа.
Сам такие интерфейсы ет пять назад плодил.
Нету возможности работы со слоями, нету визуально undo/redo stack. При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET
Очень порадовали диалоки без кнопок, которые еще и не дают кликать по вкладкам выдавая мессадж бокс.
Ну и из мелких придирок — нифига не подерживает vista style диалоги.
Дельфовый PhotoFiltre разрывает Paint.NET на куски только во сне.
Хотя памяти от захавал меньше в 2 раз — 20 мб, против 40 для Paint.NET, но с моими двумя гигами мне как-то пофиг.
Скорость работы — одинаковая.
G>>Можете посмотреть Windows Live Writer, но анлогов вообще нет H>Дельфовый BlogJet... Ну ты понял
Тока он платный, так что сразу в пролете.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Списки по любому нужны (т.е. GC все равно строит граф всех объектов в поколении). G>>Вы бы разобрались что скрывается под словами "строит граф", обычный рекурсивный обход без построения динамических структур. G>>Оверхеда там действительно нет, как бы вам не хотелось обратного.
H>Рихтер с тобой не согласен: H>
При компиляции IL-кода метода JIT-компилятор создает, помимо машинного
H>кода, внутреннюю таблицу. Логически каждая строка таблицы указывает диапа-
H>зон смещений байтов машинных кодов процессора, и адреса корней для каждого
H>диапазона (или регистра процессора)
H>Далее: H>
Начиная работу, сборщик предполагает, что все объекты в куче — мусор. Ина-
H>че говоря, он предполагает, что ни один из корней приложения не ссылается на
H>объекты в куче. Затем сборщик проходит по корням, строя граф всех достижи-
H>мых объектов. Например, он может найти глобальную переменную, указывающую
H>на объект в куче. На рис. 19-2 показана куча с несколькими объектами, где корни
H>приложения напрямую ссылаются на объекты А, С, D и F, Все эти объекты стано-
H>вятся частью графа. При добавлении объекта D сборщик замечает, что этот объект
H>ссылается на объект Н, добавляет объект Н к графу и продолжает рекурсивный
H>просмотр всех достижимых объектов.
H>Далее: H>
Завершив эту часть графа, сборщик мусора проверяет следующий корень и снова
H>проходит по объектам. Поскольку он проверяет объект за объектом, при попыт-
H>ке добавить к графу объект, уже добавленный ранее, он останавливается.
Включай мозг: все что требуется от такого "графа" только возможность проверить присуствует ли объект в нем. Это значит что достаточно битовго флага.
H>>>Размеры, и правда можно из метаданных получать, заплатив перформансом G>>С чего бы? Метаданные то в памяти лежат (это как раз лишние пара метров занимаемой памяти).
H>Ты же сам про процессорный кэш упоминал... Забыл?
Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается.
Стандартный аллокатор тоже неспособствует частому попаданию в кеш при выделении относительно неболишах блоков, причем эффект проявляется при каждом выделении-освобождении.
H>>>Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера: H>>>
Как видите, сбор мусора вызывает существенное снижение производительно-
H>>>сти — это основной недостаток управляемой кучи.
G>>Только это все может работать быстрее, чем аллокатор на основе списков. H> Рихтер не авторит, да?
А причем тут авторитет? Это результатами тестов подтверждается.
H>>>Там есть Private bytes. G>>И че? H>Это реальный показатель: H>
Private Bytes represents the amount of private virtual memory a process has allocated and is the value that will rise of a process exhibiting a memory leak bug.
Такой же эфимерный показательнь для GC.
G>>>>Нативная программа использует GDI+ для этих целей? G>>>>Память там в основном жрет не .NET, а GDI+ (который тоже нативный).
H>>>Не смеши. Не жрет GDI+ столько памяти. Более того, модель использования GDI+ отличается от GDI, требуя ресурсы (кисти и прочее) не накапливать, а создавать по мере необходимости. Я тебе могу выслать бинарник который рисует с использованием GDI+, так у него расход выше 4.1Mb не поднимается. G>>Меня измерения потребляемой памяти на HelloWorld не интересуют.
H>Т.е. GDI+ реабилитирован?
Нет, это была и есть тормозная библиотека, пожирающая ресусры.
Мне в .NET несколько раз приходиллось использовать pinvoke для функций GDI чтобы рисование достаточно быстро происходило.
Здравствуйте, gandjustas, Вы писали:
H>>>>Списки по любому нужны (т.е. GC все равно строит граф всех объектов в поколении). G>>>Вы бы разобрались что скрывается под словами "строит граф", обычный рекурсивный обход без построения динамических структур. G>>>Оверхеда там действительно нет, как бы вам не хотелось обратного.
H>>Рихтер с тобой не согласен: H>>
При компиляции IL-кода метода JIT-компилятор создает, помимо машинного
H>>кода, внутреннюю таблицу. Логически каждая строка таблицы указывает диапа-
H>>зон смещений байтов машинных кодов процессора, и адреса корней для каждого
H>>диапазона (или регистра процессора)
H>>Далее: H>>
Начиная работу, сборщик предполагает, что все объекты в куче — мусор. Ина-
H>>че говоря, он предполагает, что ни один из корней приложения не ссылается на
H>>объекты в куче. Затем сборщик проходит по корням, строя граф всех достижи-
H>>мых объектов. Например, он может найти глобальную переменную, указывающую
H>>на объект в куче. На рис. 19-2 показана куча с несколькими объектами, где корни
H>>приложения напрямую ссылаются на объекты А, С, D и F, Все эти объекты стано-
H>>вятся частью графа. При добавлении объекта D сборщик замечает, что этот объект
H>>ссылается на объект Н, добавляет объект Н к графу и продолжает рекурсивный
H>>просмотр всех достижимых объектов.
H>>Далее: H>>
Завершив эту часть графа, сборщик мусора проверяет следующий корень и снова
H>>проходит по объектам. Поскольку он проверяет объект за объектом, при попыт-
H>>ке добавить к графу объект, уже добавленный ранее, он останавливается.
G>Включай мозг: все что требуется от такого "графа" только возможность проверить присуствует ли объект в нем. Это значит что достаточно битовго флага.
Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным.
H>>>>Размеры, и правда можно из метаданных получать, заплатив перформансом G>>>С чего бы? Метаданные то в памяти лежат (это как раз лишние пара метров занимаемой памяти).
H>>Ты же сам про процессорный кэш упоминал... Забыл? G>Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается.
Ты посмотри, как этот редкий процесс накручивает счетчик, когда ты мышкой водишь над кнопками на тулбаре. К тому же не забывай, я давал пример, когда на один вызод метода по XML-RPC происходит 3 сборки мусора. Не веришь мне, проверь сам.
G>Стандартный аллокатор тоже неспособствует частому попаданию в кеш при выделении относительно неболишах блоков, причем эффект проявляется при каждом выделении-освобождении.
Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету.
H>>>>Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера: H>>>>
Как видите, сбор мусора вызывает существенное снижение производительно-
H>>>>сти — это основной недостаток управляемой кучи.
G>>>Только это все может работать быстрее, чем аллокатор на основе списков. H>> Рихтер не авторит, да? G>А причем тут авторитет? Это результатами тестов подтверждается.
Так Рихтер и говорит, что управляемая куча это есть потеря перформанса. Впрочем, я уже понял, что твою слепую веру ничто не способно поколебать.
H>>>>Там есть Private bytes. G>>>И че? H>>Это реальный показатель: H>>
Private Bytes represents the amount of private virtual memory a process has allocated and is the value that will rise of a process exhibiting a memory leak bug.
G>Такой же эфимерный показательнь для GC.
При чем тут GC? Это показатель реально используемого/выделенного (не зарезервированного) объема, хоть с GC, хоть без GC
H>>>>Не смеши. Не жрет GDI+ столько памяти. Более того, модель использования GDI+ отличается от GDI, требуя ресурсы (кисти и прочее) не накапливать, а создавать по мере необходимости. Я тебе могу выслать бинарник который рисует с использованием GDI+, так у него расход выше 4.1Mb не поднимается. G>>>Меня измерения потребляемой памяти на HelloWorld не интересуют.
H>>Т.е. GDI+ реабилитирован? G>Нет, это была и есть тормозная библиотека, пожирающая ресусры.
Еще раз: ресурсы (в частности речь шла о памяти) GDI+ не жрет. У него модель использования другая. Может почитаешь уже?
G>Мне в .NET несколько раз приходиллось использовать pinvoke для функций GDI чтобы рисование достаточно быстро происходило.
GDI+ это тормоз, я не спорю, только как ты это увязал с , якобы, прожорливостью для меня остается загадкой
Здравствуйте, gandjustas, Вы писали:
H>>Так и в Paint.NET тулбары не перемещаемые, во всяком случае у меня в 3.31. G>Там панели инструментов перемещаемые и полупрозрачные чтобы под ними было видно что нарисовано.
В PhotoFiltre панель инструментов тоже отцепляемая, в настройки глянь. Хотя обсуждение фейса, это все придирки не по теме.
G>>>Нету возможности работы со слоями, нету визуально undo/redo stack. H>>У меня версия от 2004 года, тут действительно нет, но есть PhotoFilter Studio, там слои есть. G>А я поледнюю скачал, там тоже нет
Так ты студию посмотри, там есть
G>>>При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET H>>Это ты вероятно с Paint.Net спутал В нем действительно, при выделении (Magic Wand) изображения на картинке 400x647 начинаются тормоза: загрузка CPU в районе 100%, частота подскакивает до своего максимума в 1700MHz. PhotoFiltre при этом спокойно работает на минимуме в 600MHz не нагружая процессор выше 8%. G>Я проверил на одинаковых картинках, жрет процессор одинаково, но у PhotoFiltre при этом торможит интерфейс
Я тоже проверил на одинаковых, и результат изложил выше, а посему позволь тебе не поверить.
Здравствуйте, Игoрь, Вы писали:
И>PS И>существенное преимущество GC — не надо следить за уничтожением объектов, что облегчает программирование, позволяет использовать всякие инетересные техники программирования, вроде замыканий. Но за эти удобства мы платим скоростью исполнения и большим расходом памяти. Вот собственно и все.
А я и на С++ фактически не слежу за уничтожением...
Здравствуйте, gandjustas, Вы писали:
G>>>Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие? NBN>>Я использую то что нужно там где оно нужно G>Это не ответ на вопрос.
Вопрос некорректный. Есть критические места, где всё это есть. Есть места, где С++ стиль идёт по минимому — даже макросы используются.
NBN>>А чем мешают шаблоны и классы там где нужна высокая производительность? G>Вряд ли они там мешают, но не помогают — это точно.
Помогают — облегчают рефакторинг и читаемость кода.
NBN>>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа. G>С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители. А все части игры, которе тяжелых вычислений не касаются вполне можно писать на высокоуровневых средствах. Кроме того .NET не такой медленный как тут некоторые пытаются показать.
Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд.
G>Про ембед не знаю, сильно с ним не сталкивался.
Ага, а я сижу как на эмбеддеде, так и на десктопах с красивым гуём — во многом одним и тем же кодом
G>А многим ли приложениям на десктопе нужная шустрая работа? G>У меня таких только два — браузер и среда разработки. Причем опера (которая на C++) тормозит гораздо сильнее чем VS (которая на треть из managed модулей).
Не пользуйся оперой, как и я
NBN>>Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься G>Почему?
Потому что у неё будут плохие потребительские качества, хуже чем у конкурентов.
Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов.
В добавок, там нет, допустим, линка И встречаются свои глюки.
Плюс, опять же, старый код
NBN>>Кстати, люди ратующие за С и шарп неоднократно обвиняли меня, что я пишу на С++ в шарп стиле G>Да вы, батенька, извращенец.
Нет. Я пишу безопасно, просто и красиво, как оно и должно быть.
G>Кстати Linq у вас уже появился?
Он довольно тормозявый. А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество)
P.S.
Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя.
Хотя его конечно полезно использовать для прототипирования и внутренних тулов.
G>>Кстати Linq у вас уже появился? NBN>Он довольно тормозявый.
В каком месте? NBN>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество)
Разработчика, который пытается использовать ВСЮ память надо бить сильно по рукам.
NBN>Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя.
Чушь полная.
Здравствуйте, gandjustas, Вы писали:
NBN>>Помогают — облегчают рефакторинг и читаемость кода. G> G>Шаблоны улучшают читаемость только в самых простых случаях.
Фигня. Заявление аналогично: линк нужен очень редко.
NBN>>Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд. G>Ну если вашу портануть может и будет тормозить, а если нормально написать на .NET не факт что будут лишние тормоза.
Факт.
G>>>Про ембед не знаю, сильно с ним не сталкивался. NBN>>Ага, а я сижу как на эмбеддеде, так и на десктопах с красивым гуём — во многом одним и тем же кодом G>Наверное у нас разное понимание эмбеда.
WM — это эмбеддед, бывает эмбеддед и проще и сложнее.
NBN>>>>Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься G>>>Почему? NBN>>Потому что у неё будут плохие потребительские качества, хуже чем у конкурентов. G>Потребительские качества очень мало зависят от языка разработки.
02-25. Зависит. На тормозявых и неоптимальных языках нельзя писать оптимальные приложения. Практика это подтверждает самым что ни есть великолепным образом.
NBN>>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов. G>За исключением установки .NET CF (один раз) проблем нет.
1. Один раз для каждого нета.
2. Это минимум в _2_ раза усложняет процесс инсталляции, это просто недопустимо, даже для писюка.
NBN>>В добавок, там нет, допустим, линка И встречаются свои глюки. G>У вас неправильные сведения, там есть Linq. G>Там нету expression trees, но Linq to Objects и Linq to XML это не мешает.
Ага, самого клёвого нет
NBN>>Плюс, опять же, старый код G>Ну от него никуда не деться.
Ага, он делает разработку на С++ значительно проще, чем разработка на шарпе и лучший результат в конечном результате.
Тут ведь как — чуть слажал и тебя конкуренты съели
G>>>Кстати Linq у вас уже появился? NBN>>Он довольно тормозявый. G>Я уже говорил что performance-critical код можно писать на C или юзать unsafe (почти тот же С).
Вот это — настоящее извращение, ка я уже говорил — показатель невладения С++, а следовательно бессмыслености спора.
NBN>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит.
Во-первых, позволяет, а во вторых — начинается GC с использованием диска, а это п..ц и прости-прощай юзабилити
NBN>>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество) G>"Думаю" — слабый аргумент.
Достаточный. Это называется экспертная оценка
NBN>>P.S. NBN>>Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя. G>За такой громкой фразой скрываются шаровары?
Программы продающиеся индивидуальным пользователям, те которые живут в конкурентной среде. Игры с бюджетом в 10 мегабаксов для PS3 — это шаровары?
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Игoрь, Вы писали:
G>>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики. CC>Тока мемлики там другие, не такие как в unmanaged. Ну и фрагментация скорее pin-анием вызывается. Обычную кучу GC утаптывать умеет.
Не, я имел ввиду Large Object Heap (LOH), которая работает как сишная куча, и для нее дефрагментация не осуществляется из-за трудоемкости процесса.
Здравствуйте, NikeByNike, Вы писали:
NBN>Не беспокойся — с нуля на шарпе тоже не пишут Точнее пишут! Ещё как пишут, ведутся на рекламу.
Так это получается, что все в форумах NET и NET GUI просто дебилы какие-то, выбирающие инструмент по рекламкам.
Считай это как призыв не юзать подобные аргументы. Все же в деле заняты, а не в бирюльках.
Здравствуйте, Игoрь, Вы писали:
И>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Игoрь, Вы писали:
G>>>>Маленький ликбез: G>>>>1)Стандартный аллокатор поддерживает связный список блоков памяти, выделение нового и освобождение блока вызывает проход по списку, который имеет алгоритмическое время O(n) от количества блоков. И>>>Ты сам в это веришь? Это наивная реализация 80-ых годов. Сейчас используются всякого рода оптимизации, позволяющие минимизировать время поиска и частично отказаться от блокировок кучи. Например, в windows heap создается, если мне память не изменяет, на одну кучу 128 ассоциативных однонаправленных списков, не требующих блокировок. G>>Эта наивная реализация во многих местах осталась и по сей день. И>Это не аргумент, вообще.
Ну тогда все ваши аргументы по поводу GC вообще не аргументы.
G>>>>При постоянных выделениях-освобождениях памяти получются очень большие затраты на эту простую операцию. И>>>В С# в целом та же херня. G>>Доказательства? Может сначала статью про .NETовский JIT прочитаете. На этом сайте статьи есть. И>Еще раз. То, что ты написал в предыдущем посте о преимуществах хипах — ерунда полнейшая. Почему? Да потому что в С++ используется связка стэк + хип. И мелкие часто создаваемые/удаляемые объекты создаются на стэке, а не в хипе. Поэтому все те "преимущества" .net идут лесом. Когда я говорил, что "в C# таже херня", я имел ввиду ситуацию в целом, а не какие-то частные случаи.
Ну статистику покажите чтоли, а то сильно голословное утверждение.
И>А именно — работу сборщика мусора и дефрагментатора, который осуществляет перенос объектов в памяти. А это совсем не дешевые операции.
Но они дешевле работы стандартного аллокатора. Это факт подтверждаемый тестами.
И>Кроме того, если я правильно помню, то при выделении памяти под объект, происходит еще и предварительное обнуление памяти.
О, да... это супер дорогая операция.
И>Далее, все, что ты тут расписал — это касается только мелких объектов. А крупные объекты размещаются в LOH, которая работая скорее по принципу сишной кучи.
Крупные объекты — это от 84 кб, это очень много. Статистка говорит что большенство объектов в программах гораздо меньше.
G>>>>2)При выделении блока идет небольшой оверхед, который зависит от реализации, 16-32 байта кажись. Исследования исходных кодов программ показывают что средний размер объекта составляет от 32 до 128 байт, при такких размерах оверхед является очень значительным. И>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>Покажите две программы на .net и C++ с эквивалнтной функциональностью сложнее HelloWorld, потом посмотрим кто гонит. G>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. И>Расскажи как сервисы свернуть... Я поищу что-то из публичных прог.
Сервис не отменяет факта, что цифра в таск менеджере не поеказывает реального потребления памяти.
И>>>Кроме того, в С++ принято мелкие объекты создавать на стеке. А если нужно в динамической памяти разместить объект, то есть placement new, который позволяет разместить объект в уже выделенной памяти. G>>Ага, это все увеличивает энтропию языка, то есть количество свпособов сделать одно и тоже по-разному. И>Глупость.
Факт. Есть указатели и есть ссылки. Различия для них чисто синтаксические.
G>>>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>>>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики. G>>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET. И>Лучше сам дуй читать про размещение объектов в LOH и ее фрагментацию.
Как часто объекты в LOH попадают?
G>>Про мемори лики хочу узнать поподробнее, как их получить, потом сравните это с простотой получчения лика в unamanged коде. И>В unamanaged коде лик легко обнаружить и избавиться от него, в managed его получить гораздо сложнее, но и найти и избавиться сложнее. мемлики в С++ — страшилки для детей.
Ты сам понял какой бред написал?
С каких пор в unmanaged стало легче лики находить? В больших проектах только smart pointerы и RAII спасают, ручками все отследить нереально.
В managed ликов как таковых нету, проблемы чаще всего связаны с незадиспозенными объектами. Все ошибки такого рода отлавливают автоматические утилиты анализа кода.
И>Я вот сейчас глянул в С++ проект — на 10МБ кода 16 явных вызовов new.
И 6487 malloc?
G>>>>4)Алгоритм выделения памяти не потокобезопасный, требуется синхронизация. И>>>GC тоже не потокобезопасный, и зачастую требует не просто синхронизации, но и приостановки работы потоков. G>>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором. И>gc и работы гораздо больше выполняет.
Но в среднем оказывается быстрее стандартного аллокатора.
G>>>>5)В программах на С++ часто делают свои аллокаторы, которые выделяют память для маленькиз объектов чтобы избежать описанно выше оверхеда как по потребляемой памяти, так и по времени этой операции И>>>В С++ такое делают крайне-крайне редко. Потому что И>>>а) есть стэк; G>>Стек заставляет копировать объекты чаще, чем нужно. И>просто глупость.
Напишите код со сложением векторов на стеке.
И>>>b) есть placement new; G>>Теже яйца что и кастомный аллокатор, только сбоку И>Нет, кастомный аллокатор — штука серьезная, который пишется месяцами. А это бесплатная штукенция, которая позваоляет оптимизировать критичный код и уделать .net.
Только деструктор не вызывается, значит применима такая штукенция далеко не всегда.
Да и откуда память под placement new возьмется? Не из воздуха же, а будет выделена тем же стандартным аллокатором.
И>>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет. И>На С стоит писать код режима ядра, а вот околосистемные сервисы для С++ — самое оно. Например, у меня есть железка на которой крутится линукс под высокой нагрузкой. Нужно написать какой-то демон для него — однозначно С++.
Ну и флаг вам в руки.
G>>>>9)такое распределение памяти увелиичивает cache-locality И>>>стандартные аллокаторы windows тоже оптимизированы на это дело G>>Рад за аллокатор Windows, только зачем он нужен если можно выделять память смещением указателя. Быстрее просто нечего придумать. И>Запарил, учи мат часть. Далеко не всегда выделение памяти сводится к простому смещению. И кроме того, в С++ при выделении на стэке для малых объектов это буквально одна инструкция.
Я открою маленький секрет. В .net тоже есть стек и есть структуры, которые на стеке размещаются.
G>>>>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении И>>>по сути это и означает, что когда захочется, особенно если речь идет о более-менее больших системах G>>И че? сборка памяти в нулевом поколении работает быстре чем использование алоокатора на списках при выделении-освобождении того же объема памяти. И>Того же размера, это какого? Возьмем размер 100 килобайт, быстрее? С учетом того, что такой размер будет выделен не в SOH, а в LOH. А если речь опять про что-то мелкое, так оно и стэке может быть выделено.
Твое "может быть выделено на стеке" имеет мало отношения к реальности. Статистические данные, на который опирается .NETовский GC собраны были до его создания. Угадай на чем было большенство проанализированных программ написано?
G>>Самообман — думать что C++ всегда быстрее. И>Не всегда, на каких-то синтетических тестах может быть быстрее. А-ля выделение/удаление мелких объектов.
А погуглить перформанс тесты вместо написания откровенного бреда?
Причем большентсво тестов написаны с применением .NET 1.1, с тех пор перформанс неоднократно улучшали.
И>Ну я от тебя тестов тоже что-то не видел. А мое мнение базируется на трехлетнем опыте работы с .net. Не сильно много, но достаточно, чтобы делать определенные выводы.
За 3 года могли бы и разобраться как сделать на .NET программу, которая не тормозит. Это вообще говоря не очень сложно делается.
И>А ты, похоже, просто фанатик.
Кто бы говорил...
Здравствуйте, gandjustas, Вы писали:
H>>Ты этой ссылкой только подтверждаешь мой тезис о том, что инфраструктура управления памятью в .Net более требовательна к оной G>Офигеть, дайте две, а причем тут перформанс?
H>>Из заключения: H>>
При наличии большого объема памяти .NET-приложения действительно не стесняются в запросах. Но на самом деле это связано с тем, что алгоритмы GC работают более эффективно при использовании больших объемов памяти. Если памяти в системе начинает не хватать, GC переходит в более экономный режим работы.
G>Ключевое выделил.
Угу, а при его отсутствии начнется деградация производительности (ведь алгоритмы перестанут работать эффективно, как следует из цитаты)
H>>Ну и про отрицательное влияние на перформанс тоже сказано... не смотря на все оптимизации. G>Ну а где же цитата про перформанс?
Во ведении там есть несколько слов, найдешь А вообще, слова теже самые, что и у Рихтера. Я вообще удивлен, чего ты этот очевидный и признаваемый факт отрицаешь...
H>>>>>>Ты же сам про процессорный кэш упоминал... Забыл? G>>>>>Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается. H>>>>Ты посмотри, как этот редкий процесс накручивает счетчик, когда ты мышкой водишь над кнопками на тулбаре. G>>>Накручивает до определенной степени, потом переставет. H>>У меня не получилось дождаться, пока перестанет. Не перестанет он. G>У тебя определенно плохая карма. Прмерно 10 мб от первоначального объема кушат при двигании мышкой туда-сюда. G>Это обсасывали еще при появлении персого дотнета.
Мы тут не про кушали, мы тут про счетчик GC.
H>>>>К тому же не забывай, я давал пример, когда на один вызод метода по XML-RPC происходит 3 сборки мусора. Не веришь мне, проверь сам. G>>>Не надо в пример приводить какую-то левую либу.
H>>Да какой бы я пример не привел, ты назовешь его левым или говнософтом. Ладно, еще пример из говнософта. Запускаем Paint.NET и открываем в нем картинку (я открыл 1600x1200). Выделяем всю картинку Ctrl+A. Смотрим на счетчики GC и видим, что в мирно крутящем пунктир выделения Paint.NET'е, счетчик GC тикает раз-два-три в секунду. G>И че, вам жалко? Че за фобия сборки мусора?
Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное.
H>>>>Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету. G>>>"мотаться" — громко сказано, это пара ассемблерных команд. Стандартному аллокатору чтобы поместить свободный блок в список приходится мотаться. H>>Стандартный подчиняется ручному управлению, и на работу влияния не оказывает. В отличие от GC решившего вдруг марафет навести. G> G>Надо бы ло внимательнее статью читать, "вдруг" не бывает. тем более это тоже контролируется.
Именно вдруг. Работу GC ты можешь "типа контролировать" подстраивая алгоритм под его текущую стратегию. Зря чтоль Рихтер советует вызывать GC.Collect маскируя его за "тяжелыми операциями"?
G>>>http://www.rsdn.ru/forum/Default.aspx?mid=3164491
H>>Во-первых это синтетика, не имеющая ничего общего с реальным миром. Во-вторых это не правильная синтетика. G>Да, синтетика, которая как раз наглядно показывает что аллокатор в делфях медленее GC.
Синтетика все что угодно показать может, главное приготовить как надо. Ты, как надо было тебе, приготовил.
H>>Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление. G>Тебе как пользователю разница от цифирки в таскманагере есть? G>Ты даже не можешь сопоставить быстродействие с этой цифиркой никак.
Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения.
H>>Делаем простой эксперимент. Запускаем Paint.NET, который откушал сразу 35Mb (судя по твоим словам, большая часть этой цифры -- резерв, который будет возвращен в систему по первому требованию). Теперь начинаем запускать много тяжелого софта: две Delphi IDE, Open Office Writer, Abode Reader, Opera (она у меня жрет в районе 160Mb, из-за размера почтовой базы), VirtualBox. Все система ушла в своп. Смотрим на потребление Paint.NET... оно снизилось ровно на 300Кб. Выводы? G>Вывод один — тебе срочно надо курить про workset. до этого больше тут ничего не пиши.
Я тебе еще раз говорю: это не workset, это Private bytes из Process Explorer'а. Хоть для приличия бы взглянул, уж не первый раз сказано.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение.
E>Это всего лишь эффект масштаба. Для С++ схему владения надо продумывать уже для довольно небольших задач (для совсем простых можно ничего не освобождать, да и всё), а для GC для задач побольше. Зато управлять GC посложнее...
На чем основано такое мнение? Уж точно не на длительном использовании .NET и профилировании программ.
E>Есть некоторая ниша по сложности задачи, где GC работает хорошо, но и только...
Вам наверное стоит почитать на каких допущениях работает GC. И на основе каких программ эти допущения получены.
E>Кстати, в C++ наработано много всяких подходов к этому месту, так что обычно можно быть по крайней мере не хуже в области массовых аллокаций, чем GC...
Да, в C++ надо думать о том когда и как выдеоять и освобожать память.
В .NET об этом думать не надо. Если будет тормозить тогда смотреть профайлером.
E>Например, можно на каждый запрос на каждой нити создавать отдельный стековый аллокатор, и на нём ничего не освобождать, а только выделять. По окончании запроса данные, которые нужно сохранить мигрируют на обычный аллокатор, а стековый грохается целиком в начальное состояние, и мы снова готовы обработать запрос. В целом для очень многих задач такая стратегия аллокации НАМНОГО ЭФФЕКТИВНЕЕ GC...
Это теория, покажите такие программы на практике.
Обычно ручная возьня с ресурсами очень сильно увеличивает время разработки программ. Такую возьню могут позволить себе только очень крупные фирмы.
Здравствуйте, CreatorCray, Вы писали:
CC>Лично участвовал в С++ серверном проекте для унесённого ныне кризисом Lehman Brothers.
Вот именно! Видишь до чего С++ доводит?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Не поверите, такие же переменные есть в .NET E>Почему не поверю? Я советовал ведь не "проверить, есть ли в С++ автоматические переменные", а изучить, что это такое...
E>Скажем на С++ можно делать так
Здравствуйте, gandjustas, Вы писали:
И>>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>>Ты не в тот таскманагер смотришь, тебе уже сообщали. G>Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю.
И давно ты "кол-во используемой памяти" меряешь профайлером?
G>>>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET. CC>>Кстати, как там на данный момент обстоит дело с GC в условиях наличия за-pin-ованых объектов? G>То что выделено до запиненного объекта — не уплотняется. G>Перерасход памяти из-за большого количесва запиненных объекктов — признак неграмотности программиста
Т.е. использование одного компонента, написанного говнокодером херит всю стройную систему?
G>>>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором. CC>>Это как напишешь. В unmanaged в реальном коде где надо performance выделение/освобождение памяти выносят "за скобки" и делают крайне редко. G>Это примерно тоже самое что performance-critical код написать на С, а потом интеропать с ним из managed.
И не близко даже.
И>>>>а) есть стэк; G>>>Стек заставляет копировать объекты чаще, чем нужно. CC>>С чего бы вдруг? G>Передача объектов по значению вызывает копирование.
Обьясни поподробнее какая связь между аллокацией на стеке и передачей объектов по значению?
И>>>>b) есть placement new; G>>>Теже яйца что и кастомный аллокатор, только сбоку CC>>Только без затрат на выделение памяти. Т.е. совсем бесплатный считай. G>А откуда возьмется память в которой будет делаться placement new ?
Откуда угодно. Любая свободная память. Сам по себе placement new не равняется аллокатору.
И>>>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет. CC>>Как показывает практика — есть. В таком контексте С++ от С мало чем отличается, только поудобнее разве что. Не надо только на нём александрескить и говнокодить. G>Испоьзовать C++ как C_с_классами конечно можно, только это получается ну очень низкоуровневое программирование.
"С с классами" как и "функциональщина из буста" это крайности. Я не про них.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
E>>уже придётся очень крепко думать про то как же у тебя данные будут с GC взаимодействовать... G>Ты так говоришь как-будто все каждый день пишут базы данных.
Во-первых, те, кто решают сложные задачи, они этим заняты обычно каждый день. Написать большой проект -- это не быстро.
Во-вторых, я утверждаю следующее:
Есть некоторый уровень сложности задач, довольно средний, под который GC оптимизирован и на котором он работает неплохо, хотя и с некоторыми известными особенностями и косяками. Этот уровень задачи -- сложный GUI. Для задач на порядок-другой более сложных GC работает хреново. И тогда сказывается то, что GC -- это автоматическая хреновина, которую хрен настроишь по месту, так что требования к точности продумывания архитектуры сложного проекта намного жёстче, чем в случае неуправляемых языков.
G>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
Ну наверное они там долго продумывали как работа с данными будет происходить, кроме того, я сильно подозреваю, что GC Erlang'а специально под его базу и оптимизирован...
E>>Ну и поспотришь ты профайлером, и что дальше будет? G>Исправлю код там где тормозит.
Если неправильная архитектура, то тормозит везде...
G>Утстроит, где там C++? Там голый С. G>Если почитаешь ветку я многократно говорил что performance-critical части можно и иногда нужно писать на С.
Как С и С++ отличаются с точки зрения управляемости и GC? В С++ типобезопасность есть и конструкторы с деструкторами. А ещё там есть виртуальные функции, исключения и шаблоны. И что? Как это всё вообще влияет на обсуждаемые проблемы? Это всего лишь на процесс разработки может повлиять...
Тем не мнее я знаю много довольно быстрого С++ кода, который ворочает большими объёмами данных и весьма быстро. Но не могу его тут опубликовать.
E>>Обычно, ручная возня с ресурсами занимает очень маленькую часть затрат на разработку действительно сложного ПО (например переводчика, или операционной системы)... G>Ну на управляемых языках это так, на неупрвляемых — зависит от разработчика.
Нет. Не зависит. Плохой разработчик потратит на реализацию сложного проекта бесконечное время Причём на ЛЮБОМ ЯЗЫКЕ...
А вообще-то я согласен с тем, что C++ не терпит лохов, в отличии от C#. То, что C# -- это очень хороший язык для индусов, никто вроде бы и не оспаривает... Думаю, что его смело можно называть ХиндиС (шутка)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
E>>А подробности будут? E>>Я всё равно не верю, что, Ada и С++ имеют одинаковый показатель. G>Можете не верить.
Дык данные-то есть? Методика, что и как измеряли? На каких примерах? Какая получилась статистика?
E>>Кроме того, на чём же тогда статистика для С# собрана, если только КРУПНЫЕ проекты идут в счёт? На сингулярити, что ли? G>На C# очень много крупных проектов, с миллионами строк кода.
"Очень много" -- это наверное больше 10? Не затруднит привести 5 C# проектов, которые на миллион строк тянут?
Кстати, миллион строк кода -- это не очень крупный проект...
Крупный проект, это от 100-300 человеколет, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>А подробности будут? E>>>Я всё равно не верю, что, Ada и С++ имеют одинаковый показатель. G>>Можете не верить. E>Дык данные-то есть? Методика, что и как измеряли? На каких примерах? Какая получилась статистика?
Не я мерял, во многих книгах и статьях читал упоминания этого факта.
E>>>Кроме того, на чём же тогда статистика для С# собрана, если только КРУПНЫЕ проекты идут в счёт? На сингулярити, что ли? G>>На C# очень много крупных проектов, с миллионами строк кода. E>"Очень много" -- это наверное больше 10? Не затруднит привести 5 C# проектов, которые на миллион строк тянут?
MySpace вас устроит?
Лениво узнавать сколько где строк
Здравствуйте, gandjustas, Вы писали:
G>>>На C# очень много крупных проектов, с миллионами строк кода. E>>"Очень много" -- это наверное больше 10? Не затруднит привести 5 C# проектов, которые на миллион строк тянут? G>MySpace вас устроит? G>Лениво узнавать сколько где строк ))
MySpace -- это аналог "одноклассников", что ли?
Если аналог, то не устроит. Даже на 30 человеко-лет оно не тянет, IMHO...
Да и на миллионы строк, тоже что-то не очень верится. Разве что они базу данных сами писали.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, gandjustas, Вы писали:
G>>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
___>1С — УГ. ___>Я знаю программу — Супермаг 2000, написанную на Оракле, отчет пару часов для небольшого магазина. И причем здесь Оракл? Хреновую программу можно написать на любом языке.
Я про это и говорю.
Самое главное что пользователи могут и пару часов подождать.
Здравствуйте, gandjustas, Вы писали:
G>Самое главное что пользователи могут и пару часов подождать.
Это только в двух случаях.
1) Если решают что купить одни, а "подождать" -- другие.
2) Если совсем нет конкурентов
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Покажите мне программу где все это нужно одновременно.
Почти весь сложный софт. От базы данных, до фотошопа...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
Вообще-то на васике.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Фишка в том, что он с ещё кучкой прог может одновременно работать. А если всё писать на ХиндиС, то на каждую прогу придётся по компу покупать ;( G>>Большенство прог, будучи неактивнми вообще не мешают други, при необходимости скидываясь в своп чуть ли не полностью. G>>Причем это не зависит от языка разработки. E>Ты читать умеешь? Выделенное перечти, пожалуйста...
Сколько у тебя на компютере программ "одноврменно работают" без твоего участия?
E>>>Кстати, так сколько матриц-то 100х100 было нужно ОДНОВРЕМЕННО? G>>30-40 висят в памяти для истории, сколько временных создавалось при расчетах лень считать. E>Это так сложно? E>Считать не обязательно достаточно прикинуть с точностью до порядка. E>50 — 100 -- нормальная оценка?
Наверное.
E>Если да, то это всего-навсего 8 метров... Так что твоя прока тупо профукала 250 из 300, то есть более 80% использованной памяти!!!
О ужас, горе мне.
А вообще меня это нисколько не волнует.
Здравствуйте, gandjustas, Вы писали:
NBN>>>>А чем мешают шаблоны и классы там где нужна высокая производительность? G>>>Вряд ли они там мешают, но не помогают — это точно. CC>>Код писать с ними удобнее чем в С стиле. G>А на более выкогоуровневых языках еще удобнее. Вы с этим спортить будете?
Ты софист, с тобой спорить только время тратить.
Какое отношение другие языки имеют к сравнению С и С++?
NBN>>>>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа. G>>>С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители. CC>>Да ты еще и геймдевелопер я смотрю И спец по переносу расчетов на GPU. CC>>Ну-ка расскажи что там и как в геймдеве, а я послушаю. G>Не, я с геймдевом сталкивался всего пару раз и обра раза впечатления неочень.
Т.е. ты не в курсе.
Но мнение, как полагается, имеешь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>>>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут. ___>>1С — УГ. ___>>Я знаю программу — Супермаг 2000, написанную на Оракле, отчет пару часов для небольшого магазина. И причем здесь Оракл? Хреновую программу можно написать на любом языке. G>Я про это и говорю. G>Самое главное что пользователи могут и пару часов подождать.
Значит нужно писать хреновые программы?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>>>Например при ипользовании ФВП с помощью буста затайпдефить все функции не получися. CC>>>Функциональщину на С++ на данный момент я отношу к редкостным извращениям, полагая что если надо функциональщина — лучше взять другой язык. CC>>>Появится поддержка functional из С++0х в компилерах — будем посмотреть. CC>>>А пока это не для С++. G>>То есть всетаки с++ недостаточно выразительный. CC>В сравнении с С, про который речь в этой ветке?
В сравнении с другими языками, поддерживающими ФВП например.
G>>Что и требовалось доказать. CC>Сам себе придумал, сам себе доказал. Как тебе жить просто, а.
Ну почему же, вы тут упорно доказываете что все надо писать на С++.
А оказывается что там где требуется производительность там пишется все на С (или на подмножестве С++), а там где производительность не требуется выразительности плюсов не хватает.
Здравствуйте, gandjustas, Вы писали:
G>>>То есть всетаки с++ недостаточно выразительный. CC>>В сравнении с С, про который речь в этой ветке? G>В сравнении с другими языками, поддерживающими ФВП например.
А они откуда взялись в обсуждении "С или С++"?
Ты с темы не съезжай, будь так любезен.
G>>>Что и требовалось доказать. CC>>Сам себе придумал, сам себе доказал. Как тебе жить просто, а. G>Ну почему же, вы тут упорно доказываете что все надо писать на С++.
Примеры моих постов, где говорится "что все надо писать на С++" в студию. Причем там должно говориться "все надо писать на С++" и никак иначе.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
E>>Ганджустас! (И как я раньше тайну ника-то не просёк!!!) Будь человеком, отсыпь кораблик?.. G>Я уже бросил
Пока не долетело ;(
Ждёмс...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, NikeByNike, Вы писали:
G>>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. G>>И GC не будет. NBN>Потому что не сможет
Не только может но и делает.
Подумай на досуге зачем приложения на .NET мониторят \KernelObjects\LowMemoryCondition
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут. NBN>Вообще-то на васике.
Здравствуйте, Sinclair, Вы писали:
S>Я понимаю, головой думать — это тяжелая работа.
А переход на личности -- это такой способ ведения дискуссий от MVP?
S>Ок, специально для тех, кто не представляет себе, что бывает "дальше" после просмотра профайлером, маленькая история вот здесь.
Это всё конечно очень интересно, но при чём тут GC?
Кроме того, то, что он сразу же искал неэффективным образом (хотя, как я понял, это основная функциональность в проге!!!), говорит о том, что проектировать это дело он и не пытался. А пытался типа написать, потом профильнуть, потом трясти...
Что бы получилось, если бы он сначала таки подумал как сделать его прогу быстрой, потом это запроектировал, а только потом уже бомбил, не известно. Мне так кажется, что 2 секунды для этой программки -- ЭТО ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ДОЛГО.
Правда он сам себе выдал ТЗ, что "и так сойдёт", исправил грубую ошибку проектирования и получил в результате "саксесс стори". Но когда ты сам себе орбитр не трудно всегда побеждать.
А вот, если в дело вмешиваются клиенты и конкуренты, ситуация несколько меняется...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
C>Вы что же картинки в base64 гоняете? Вот такие, простите, индусоалгоритмизаторы и есть причина репутации .NET как медленной среды.
Base64 -- единственный способ передать бинарные данные в XML-RPC.
C>Хардкодинг урлов в атрибутах — моветон.
Это тестовый пример
C>Java-like нотация записи методов (getScreenshot64) — моветон.
Это негласный стандарт в XML-RPC.
C>В С# нет оператора :=
Писал по памяти. Pascal мой основной язык.
C>Неиспользование using для MemoryStream — утечка ресурсов.
Чего-то я не понял, а каким ресурсом, кроме собственно памяти, владеет MemoryStream?
C>Читабельность Picture.Bitmap.LoadFromStream(TXmlRpcBase64(XmlRpcServerProxy('http://127.0.0.1/').keyhole.getScreenshot64(320, 200)).AsStream); -- отвратительная.
Здравствуйте, hattab, Вы писали:
H>Base64 -- единственный способ передать бинарные данные в XML-RPC.
Так Вы сами себе злобные буратины, раз выбрали такой стандарт. Что мешает бинарные передавать обычным http stream`ом?
C>>Java-like нотация записи методов (getScreenshot64) — моветон.
H>Это негласный стандарт в XML-RPC.
Ой да ну? А можно ссылку на этот "негласный стандарт". Очень хочу посмотреть.
C>>В С# нет оператора :=
H>Писал по памяти. Pascal мой основной язык.
Ну мы уже поняли, что с дотнет Вы знакомы весьма поверхностно. Лишь хаете его так, будто бы программируете на нем с релиза.
C>>Неиспользование using для MemoryStream — утечка ресурсов.
H>Чего-то я не понял, а каким ресурсом, кроме собственно памяти, владеет MemoryStream?
1) для любого класса, реализующего IDisposable следует вызывать Close/Dispose
2) любой Stream по окончании работы с ним следует закрывать (помечая его тем самым closed)
C>>Читабельность Picture.Bitmap.LoadFromStream(TXmlRpcBase64(XmlRpcServerProxy('http://127.0.0.1/').keyhole.getScreenshot64(320, 200)).AsStream); -- отвратительная.
H>Еще раз: это тестовый пример.
Что-то мне подсказывает, что Ваш код выглядит не лучше этих "тестовых примеров".
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>надеюсь ты понимаешь разницу между структурой и классом в дотнете, повторяюсь — инстанцировать классы G>>Я то как раз отлично понимаю, а вы — видимо нет. Х>можно прямо сказать, дотнет етого не позволяет, я ето знаю, ты ето знаешь, зачем юлить?
Ну если вы так думаете тогда объясните принципиальную разницу между классом на стеке и структурой на стеке.
Х>>>и на посошок, или я проглядел, или ты не ответил на вопрос — сколько у тебя установлено приложений уровня "десктоп", писаных на дотнете? G>>Сколько установлено — не считал, пользуюсь двумя — paint.NET и Windows Live Writer. Это треть софта, который я ставил и пользуюсь им. Х>у тебя ~6 десктопных программ? клёво Х>музыку ты наверное не слушаешь, видео не смотришь, документы/таблицы не набираеш, программы не пишешь, гуглы ёрс не смотришь, интернеты не браузишь, скайпы не говоришь, игры не играешь, ну итд по списку 99% софта. ты просто возьми на минутку и задумайся, почему оно так в мире, не правит дотнет.
Дейсвительно, не 6, а 7 десктопных программ которыми я пользуюсь: браузер, почтовик, paint.net, live writer, qip, skype, vs2008.
Media Player был в комплекте, офис тоже.
Остальное запускаю редко.
В игры не играю, карты смотрю в браузере.
Кстати, сколько сайтов, по которым ты ходишь написаны на asp.net?
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Зачем? Для запредельного перфоманса есть С, для надежного и красивого кода есть C#, F#. G>>А С++ в этом уравнении места нет.
E>Нет, ну если ты настаиваешь, что быстрый код ОБЯЗАН БЫТЬ ненадёжным и некрасивым, то да, нет...
Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне.
E>А если вдруг тебе охота чтобы и быстрый код был и надёжным и красивым и поддерживаемым, то места мало остаётся как раз для С -- только платформы, где есть дот нет, но нет хороших С++ компиляторов...
Я не предлагал C использовать для красивого кода.
E>Кстати, если так взглянуть на это дело, то окажется, что и для С# место сожмётся, так как если в твоей проге самая нагруженная часть на С++, то не ясно, зачем оболочку-то на ХиндиС делать? У ХиндиС есть неомненный плюс -- дешёвая и быстрая разработка бригадой гастарбайтеров, в смысле индусов. Если в твоём проекте есть такие компоненты, то супер, С# твой выбор...
Ты как-то очеь интересно говоришь о том что C# позоляет писать хороший код с малыми затратами.
E>Да, то, что между черт -- это стёб... Но в каждой шутке есть таки доля шутки...
Все что ты написал в предыдущем абзаце — правда.
Когда вместо индусов пишут нормальные программисты код у них получается гораздо лучше и быстрее, чем на С++.
И только там где не хватает производительности может быть использован C.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>В структуре нет методов? Это точно на C#? Х>ммм...статические есть, но ето немного не то, правда? http://msdn.microsoft.com/en-us/library/ah19swz4.aspx
G>>Вопрос возник видимо из-за непонимания этого факта. Х>у меня отличное понимание факта.
Вы показываете обратное.
ЗЫ. Вообзе говоря не верится что вы писали enterprise систему на C# и ни разу не пользовались структурой DateTime.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, minorlogic, Вы писали:
M>>>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>>потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
M>>>Даю подсказку M>>>int a = 0; M>>>int b = 3 + a;
M>>>Очень память дефрагментирует ? затратит линейное время на на выделение памяти и т.п. ?
G>>напишите этот же код на Java, .NET, причем буква в букву. работать везде одинаково будет.
G>>У вас как в древней присказке "слышу звон, да не знаю где он".
E>Да это как раз у Вас полнейший неадекват какой-то, постоянное съезжание с темы, ответы на посты в отрыве от обсуждаемого контекста.
E>Там же написано, что подсказка. Додуматься, что очевидно имелось в виду то, что можно заменить int на произвольный класс, и никакого malloca/free не понадобится, не судьба?
E>P. S. Даже попкорн полохо лезет под такой некачественный флейм.
Думаете нельзя в C# на стеке данные размещать?
Вот в Java нельзя, только элементарные типы, в C# есть стурктуры.
Здравствуйте, MxKazan, Вы писали:
MK>Непонятно к чему тогда было следующее:
потому что я был уверен что struct в C# ето только данные и все операции с ним аля положить в массив и вызвать метод происходят только в его боксовом представлении
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Да это как раз у Вас полнейший неадекват какой-то, постоянное съезжание с темы, ответы на посты в отрыве от обсуждаемого контекста.
E>>>Там же написано, что подсказка. Додуматься, что очевидно имелось в виду то, что можно заменить int на произвольный класс, и никакого malloca/free не понадобится, не судьба?
E>>>P. S. Даже попкорн полохо лезет под такой некачественный флейм.
G>>Думаете нельзя в C# на стеке данные размещать? G>>Вот в Java нельзя, только элементарные типы, в C# есть стурктуры.
G>>Не надо показывать свое незнание.
E>А вот обязательно было в моём утверждении подменять "произвольный класс" на "данные"? Именно это я и имел в виду, говоря про неадекват.
А вы можете объяснить разницу?
Здравствуйте, gandjustas, Вы писали:
G>>>>Думаете нельзя в C# на стеке данные размещать? MK>>>Думаю конкретно esil имеет ввиду, что нельзя разместить в стеке произвольные данные. MK>>>Массивы, например, туда не засунуть, ибо class
MK>>>А вот что имел ввиду minorlogic я, чесс говоря, тоже не понял. MK>>>Но эт не страшно
E>>Ну он как раз и имеет в виду, что мы можем произвольные типы размещать на стэке, что очень полезно, т. к. позволяет оставаться в рамках ООП-подхода и избегать множества выделений памяти в куче. G>Как будут работать виртуальные методы при размещении объектов на стеке?
Точно так же, как и при размещении в куче. По указателю на базовый класс можно получить таблицу виртуальных функций, а где в памяти объект этого класса расположен — не важно. Приме ниже привёл.
Здравствуйте, MxKazan, Вы писали:
MK> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы.
Здравствуйте, Erop, Вы писали: S>>Совершенно верно. И это — единственный способ писать хорошие программы. E>Это тебе Бог сообщил, или сам БГ?
Меньше выделывайся, больше читай. В статье написано именно про это.
E>Чего? Ты думаешь допереть, что для словаря надо использовать структуру, которая ищет эффективно ему понадобилось бы очень много времени?
Меньше выделывайся. Это модельнй пример. Ясно, что в реальном мире всё будет устроено немножко по-другому. Но ты бы устал читать статью про оптимизацию реальной дотнет программы. Впрочем, неподалеку есть неплохой блогпост — завтра дойду до офиса, кину тебе ссылку.
E>Если бы оно ориентировалось на меня как на потребителя, то 0,01 — 0,03 секунды. E>Я хотел бы менять ситуацию и сразу видеть варианты в GUI интерфейсе, например...
На всякий случай напомню, что в его случае нужен был вообще ровно один запуск. И он пишет в последней строчке именно об этом: что в другом случае (например, твоем, где есть GUI и необходимость быстро менять варианты). Еще на всякий случай напомню, что интервалы меньше 0.1 секунды ты вообще на глаз не заметишь.
E>Это которая "But I'm not"? Ну да, он действительно не может, потому что действует в рамках индусской парадигмы...
...поверь мне — он может. То, что ты не знаешь еще и английского — не оправдание. Я там рядом поместил перевод. But I'm not означает, что он не пишет realtime GUI. E>А теперь иди читать моё замечание про то, что если сам себе орбитр, то выиггрывать легко.
То есть ты имеешь наглость полагать, что чувак не смог бы получить из этой программы 0.01 — 0.03 секунды, если бы это потребовалось? Или у тебя есть какие-то иллюзии про то, что самый эффективный способ получить нужное быстродействие — это алгоритм, приведенный в статье?
E>И, кстати, тема связи этой "оптимизации" со случаем, когда мы упираемся в "особенности GC" как-то всё-равно не раскрыта... Это если конечно "But I'm not", не учитывать
Ок, завтра я тебе кину ссылку про учет особенностей GC.
почистил от перехода на личности — Кодт
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>почему он тебе нравится? то, что он красиво выглядит на бумаге, не гарантирует, что тебе понравится на нём программировать реальные большие задачи
Дык вокруг него такой ореол создали, что несколько лет назад плохое слово в сторону дизайна С++ сразу выливалось в анафему высказавшему эту мысль.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Хороший топик для потенциальных работодателей. Участников холивара можно смело на должности выше сеньора не брать
Кабздец тебе Андрюха. Заложат тебя в Джетбрэйн. Как пить дать заложат.
А если серьезно, то уровень дискуссии действительно просто супер. Плинтус горами покажется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Mamut, Вы писали:
M>Просто так, по учебникам, изучить не получится. Надо на каждом из них селать пусть п менькому, пусть для себя, но проекту
(куча мата) ... Да хотя бы начал с учебника. А ведь он начал с вопроса "где найти идиотов которые его возьмут на работу и будут платить ему за обучение".
Само собой, что теория без практики — деньги на ветер.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Mamut, Вы писали:
h>> Гуглохром например, и легаси нету и работает на десктопе
M>О, кстати. [holywar offtop on] как это так — написан на кроссплатформенном С++, а кроссплатфоренной версии нет, и в ближайшем будущем не предвидится? 0_o [holywar offtop off]
Дык не под QT написан то А если серьезно, то МакОС и Линукс версии сейчас готовятся.
M>Гуглохром хороший пример нового приложения. Толкьо вот там С++ изначально — куча. Это и вебкит, и V8.
Ну и что? Никого же не смущает использование в .Net софте нативно Трайдента
Здравствуйте, WolfHound, Вы писали:
VD>>А если серьезно, то уровень дискуссии действительно просто супер. Плинтус горами покажется. WH>Угу. Люди не знающие .НЕТ против людей не знающих С++.
Здравствуйте, gandjustas, Вы писали:
G>Круто, а фабричный метод так изобразите?
А зачем в данном случае фабричный метод?..
Но вообще-то возможно и изображу, правда тут надо бы уточнить, что ты понимаешь под "фабричный метод", так как может и изображу, а может и нет...
G>ЗЫ. Передача указателя на стек до добра не доводит, большенство уязвимостей в ПО так и получаются.
А как можно было бы такой уязвимостью воспользоваться? Ну, хотя бы, гипотетически? Это же не буфер, а объект на стеке.
Про то, что в больших программах 99% кода достаточно глубоко запрятаны для того, чтобы не смочь породить уязвимость, я и не говорю..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, Хвост, Вы писали:
Х>>>потому что я был уверен что struct в C# ето только данные и все операции с ним аля положить в массив и вызвать метод происходят только в его боксовом представлении MK>>Угу. Еще ты был уверен про уровень
разработчиков .Net. MK>>Что теперь мешает и мне написать подобный пост про тебя? Х>к тому же если ты проследишь начало темы про структуры, то она была о размещении их в массиве, и тут без ансейфа вариант действительно только один — боксинг.
Если нужно на стеке то почему бы не использовать ансейф?
Ансейф не означает отказ от возможностей шарпа и не объявляет о бажном коде. Это просто код где потенциально могут возникнуть ошибки, на C++ например вся программа такая, и ниче.
Х>C# (особенно в версии 3.5) ето очень мощный язык, но для приложений требующих производительности, малой затраты ресурсов, быстрой реакции интерфейса ето просто моветон.
Это каких таких приложений? И причем тут интерфейс? Вы скорость полета WPF видели? Очень рекомендую посмотреть доклад PC46 c PDC2008, повторите такое же на С++ тогда вам поверят.
Х>Дотнетчики же говорят "ааа, да ты чего, купи 4 ядра, возьми 16 гб" меня просто умиляют
Да ну, ссылку кините?
Как раз большенство софта работает на обычных современных компах, с парой гигов и максимум двумя ядрами.
Это только на вопли С++ников, что оно кушает много памяти, так отвечают.
Х>вы поймите, что достойная производительность ето дополнительный функционал, ето когда спеллчекер подчёркивает красным не через две секунды после набора слова а сразу, ето когда в CAD'ах скролл рабочей области работает плавно, ето когда скриптовый google docs интерфейс не лагает, ето когда ты можешь в корелдро видеть тридцать слоёв одновременно а не пять, или когда диаграмму в таблице можно увидеть не только в плоском виде а в 3д и повращать, т.е. ещё раз, дополнительные ресурсы — дополнительный функционал.
А вы можете показать где .NET реально тормозит, кроме убогих поделок говнокодеров?
Убогие поделки и на С++ есть.
Х>Вся ета дотнетчина на десктопах ето от бедности, когда нет денег нанять высокопрофессиональных программистов на С++ чтобы сделать проект и планка качества невысока, сойдёт и сишарп. Ентерпрайз лично у меня никогда не ассоциировался с качественным кодом, имхо там главная цель — лишь бы правильно работало, а уж быстро ли, медленно ли, интерфейс кривой или прямой — ето уже волнует в пятую очередь.
А что есть качество?
Х>Что насчёт дотнета на серверах — я только за, там дотнет ето просто клей, логика, вся тяжёлая работа лежит на сиквел-серверах + если надо какие-либо нейтив компоненты для обработки чего-нить быстрого (звук/картинки/видео). Заменить слово C# например на Python и ничего не поменяется, абсолютно. C# это клей, полный аналог VB конца 90-х по своему назначению, и плз, не надо его пихать в десктопы, точнее у вас ничего не выйдет, т.к. вы десктопы на C# не пишете, если вы разумны или у вас разумный руководитель.
Это какая трава так торкает?
Вы вообще-то не завбывайте что объем программ пишущихся под дексктопы в разы меньше объема enterprise и web софта.
Здравствуйте, WolfHound, Вы писали:
VD>>А если серьезно, то уровень дискуссии действительно просто супер. Плинтус горами покажется. WH>Угу. Люди не знающие .НЕТ против людей не знающих С++. WH>Смешно читать и тех и других.
Не только, люди ещё специализируются на разных направлениях.
Здравствуйте, gandjustas, Вы писали:
G>У гугла столько ресурсов, что они могуть ОС в машинных кодах написать. G>И если им будет надо — напишут.
Не понимаю я вот этого аргумента! Если они такие лохи, что всё делают неверно и неэффективно, то почему у них всё так хорошо?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>>>Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне. E>>Это всего лишь твоё неумение писать быстрый и качественный код... G>С чего ты взял?
С того, что знаю примеры быстрого кода, который сразу так и разрабатывался, как быстрый...
E>>Мне известны МНОГОЧИСЛЕННЫЕ контрпримеры, так что позволь не поверить твоему голословному утверждению... G>Уууу, а сколько мне известно примеров когда наступала попа из-за преждевременной оптимизации и раннего проектирования структур данных...
Не понимаю. Возможно проектирование выполнялось некачественно?
G>Быстры и красивый быввает очень редко. Это он может казаться красивым пока не надо какую-то мелочь поменять.
Почему это? Почему быстрый код нельзя писать НОРМАЛЬНО? Читабельно, поддерживаемо, без ребусов?..
G>С чего ты взял что я не знаю С++?
Я не думаю, что ты совсем не знаешь. Но ты тут оговорился, что якобы объект на стеке не может иметь виртуальных функций, но может быть ты именно оговорился, или это вообще не ты был?
В любом случае это не важно. Я не утверждал, что ты не знаешь, я спрашивал, что тебя заставляет выбирать С вместо С++, кроме его сложности (IMHO, если ты говоришь, что С++ сложен, то это значит, что ты его знаешь недостаточно, чтобы писать на нём хороший код)
G>А "нагруженные части" — те которые обрабатывают большой объем информации в единицу времени — для них C# подходит гораздо лучше.
Пока не нужна память и скорость -- да. Например для GUI ХиндиС -- это просто находка! G>Насчет быстрее можешь не верить, но современные языки спокойно сокращают в несколько раз время разработи по сравнению с C++.
А! Это было не про время исполнения, а про время разработки? Про время разработки верю конечно. Но только в том случае, если задача органична для C#. А если нет, то не верю.
Почти любая оболочка, например, органична. Многое из вебства поверх DB органично, ну и т. д.
А там AI, например, нифига не органичен...
G>>>И только там где не хватает производительности может быть использован C. E>>Ну вот есть такая т. з., что в случае массового потребителя, производительности не хватает практически ВЕЗДЕ. Ну ценят люди скорость...
G>Да ну, а ты не слышал что процессор настолького компа в среднем загружен на 5%, а сервера — на 20% G>На C имеет смысл писать только математику, обработка больших объемов данных гораздо лучше пишется на .NET.
Я думаю, что в твоих задачах обработка больших объёмов совсем лучше всего выполнятся СУБД... В на C# хорошо пишется интерфейс к этой самой СУБД...
Ты видимо не встречал пока других сложных задач, где нужна таки выч. мощь, кроме того, что ты называешь словом "математика"
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Круто, а фабричный метод так изобразите? G>ЗЫ. Передача указателя на стек до добра не доводит, большенство уязвимостей в ПО так и получаются.
Я заню, что круто ))
Нет, фабричный метод так не изображу. Только не надо говорить "ну тогда и нет никакого ООП на стэке". Естественно одним стэком не обойдёшься. Но стэк позволяет убрать очень много выделений памяти.
P. S. Указатель не был заменён на ссылку по соображениям наглядности для участвующих в дискуссии, которые быть может не сильно разбираются в С++.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
E>И вот таки да, предположим у нас получилость так, что из-за частых выделений/освобождений памяти наш продукт на С++ работает недопустимо медленно. Что можно с этим сделать? Для начала собрать профиль размеров выделяемых блоков, который нам покажет, что большинство выделяемых блоков имеют размер 256 байт. А дальше можно сделать например так:
E>
E>//поскипано
E>
Только делать так не нужно. В первую очередь стоит заняться алгоритмический оптимизацией или даже архитектурной, а не кидаться писать кастомный аллокатор.
Причем этот подход работает для любых языков.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, esil, Вы писали:
E>>Здравствуйте, gandjustas, Вы писали:
G>>>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
E>>И вот таки да, предположим у нас получилость так, что из-за частых выделений/освобождений памяти наш продукт на С++ работает недопустимо медленно. Что можно с этим сделать? Для начала собрать профиль размеров выделяемых блоков, который нам покажет, что большинство выделяемых блоков имеют размер 256 байт. А дальше можно сделать например так:
E>>
E>>//поскипано
E>>
G>Только делать так не нужно. В первую очередь стоит заняться алгоритмический оптимизацией или даже архитектурной, а не кидаться писать кастомный аллокатор. G>Причем этот подход работает для любых языков.
Может быть да, может быть нет. Может быть архитектура крива, а может быть она правильна, хотя в ней аллоцируется куча мелких объектов. Это вопрос чего угодно (религии, политики, философии), но только не сравнения аллокаторов.
Верным остаётся одно: на любой дурацкий синтетический тест найдёт столь же дурацкий аллокатор, который этот тест "уделает".
Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию. Кому-то такой подход кажется нормальным, кому-то нет. Но по крайней мере есть выбор. Хотя наличие выбора может кому-то тоже показаться плохой идеей. ))
Re[74]: Плохому танцору на С++ лучше не прогать...
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Исторические причины в крупных организациях играют немалую роль.
E>Странно у тебя выходит. Типа ХиндиС для десктопа подходит, но в каждом конкретном случае что-то ему мешает...
Я уже писал:
1)кодовая база, переписывание с нуля даже небольшого проекта дает только риски и нифига прибыли.
2)программистска база — если есть команда, пишущая на С++, то они не станут на следующий день писать на C#
3)Слабая изменчивость требований, требовния для бизнес-софта меняются очень быстро, бывает что софт перестает отвечать требованиям бизнеса еще до установки клиенту. Десктопный софт такой изменчивости не подвержен, в основном идет добавление по-немногу фич, улучшение юзабилити, правка багов, при этом всем надо сохранять обратную совместимость.
E>IMHO, есть огромный сегмент ПО -- это ПО, которое пишут по случаю и как можно быстрее. E>Раньше это делали на VB, теперь делают на ХиндиС. В целом это огромный шаг вперёд!!!
Раньше и сейчас это делают на скриптовых языках.
E>Но в своей нише выбор уже часто предопределён. Если тебе надо пять COM-верверов заставить хитро взаимодействовать меду собой, то ясно что не на С++ это удобно. А если ты хочешь написать распознавалку голоса, чтобы оно могло писать под твою диктовку, то ясно, что не C#, твой выбор...
Это еще надо обосновать.
E>Ну и у десктопов своя специфика -- обычно программ много, а памяти и проца -- нет.
Неверно. Память еще может заканчиваться, а проц большую частьвремени простаивает.
E>Так что экономичность программ -- это большой плюс для десктопа
Это вы так думаете.
Можете привести пример когда именно быстродействие становилось конкурентным преимуществом. А учитывая что .NET не сильно по быстродействию отличается от C++, то ваш тезис кажется неверным.
E>а скорость разработки, на уровне "надо ещё вчера" -- нет...
При разработке для заказчика только так и можно работать.
Причем заказной софт — гораздо большая часть разработки.
Re[75]: Плохому танцору на С++ лучше не прогать...
Здравствуйте, gandjustas, Вы писали:
E>>а скорость разработки, на уровне "надо ещё вчера" -- нет... G>При разработке для заказчика только так и можно работать.
IMHO, при разработке для заказчика надо работать так, как надо заказчику
G>Причем заказной софт — гораздо большая часть разработки.
Ну и что? Индусов больше всего, потом наверное код на коболе идёт...
ХиндиС -- тут очень даже к месту. Если всё, кроме сроков разработки и реакции на изменения требований, не важно, то C# -- твой выбор. Я с этим и не спорю.
И проектировать тоже тогда не надо, потому что время терять. Надо писать как можно быстрее, а если потом заказчик, или тот, кто думает, что знает нужды заказчика, это дело завернёт, попрофилять и допилить как-то побыстрее...
Всё верно. Да так и надо вести разработку в таких условиях!
Но это один такой специфический подход к программированию.
Есть и другие ниши. Скажем ретейл. Обычно коробочный софт разрабатывают по какому-то графику, есть цикл выпуска версий там, то, сё, есть время на проектирование, на тестирование, на качество разработки, короче. Если ты будешь выпускать версии раз в месяц, ты только проиграешь! Так что выгодно выпускать версии пореже, но покруче...
А ещё есть разработка технологий и моторов всяких. Скажем сидят люди из 17-й версии СУБД делают 18-ю. Там своя специфика, и C# ещё меньше в тему. Ну и т. д.
Или, наоборот, сидят люди и пишут то, что никто ещё не писал и как это писать не знает. Тоже интересная, и тоже особенная работа...
При этом все эти активности -- программирование. Но они все разные. И кому-то нравится одно, а кому-то другое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
VD>>Почему всем будет смешно, если им расскажут о подмастерьи физика, химика или врача. Так почему же подмастерья программистов обсуждаются серьезно? E>Ну посмейся. Слова "аспирант", "ординатура" и "научный руководитель диплома" и "производственная практика" для тебя новы?
Очень смешно. До аспирантуры или ординатура человек обязан отучиться минимум 4 года в профильном институте. В лучшем случае за бесплатно. Сейчас многие деньги уже платят. Тут же человек хочет со знанием ПХП без какой бы то ни было подготовки идти работать С++-программистом.
Вот пусть пойдет по учится 4 годика, а потом можно будет о подмостерье говорить. А не хочет 4 годика, так пусть хотя бы месяца три книжки почитает и примерчики по решает... дома. Глядишь вопросы сами собой отпадут, и разговоры перестанут быть такими детскими и наивными.
Я сутки работал, трое учился, а по вечерам еще с тем же С++ разбирался. Просить у кого-то за это деньги мне даже в голову не приходило.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Erop, Вы писали: E>Может уважаемый MVP снизойдёт к нам, сирым и убогим и вспомнит таки азы, а уже потом будет позориться?
А что вы назыаете "азами"? Я на плюсах в последний раз писал, афаик, в 2002. И не считаю знания таких деталей "азами". Азы — это, к примеру, понимание того, в каком порядке пишутся программы
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[29]: Дык известное дело: поспешишь - людей наспешишь ;)
Здравствуйте, Sinclair, Вы писали:
S>А что вы назыаете "азами"? Я на плюсах в последний раз писал, афаик, в 2002. И не считаю знания таких деталей "азами". Азы — это, к примеру, понимание того, в каком порядке пишутся программы
Ну, ты, кажется, вызвался довольно менторским тоном всезнайки разговаривать о С++ коде, даже не врубаясь что там написано?
Не вижу сортировки по алфавиту.
и
А он неявно сортирует??? Офигеть. Я как отвык от того, что для множества нужно задавать отношение частичного порядка.
Я надеюсь, уточнение сортировки в Case-insensitive/accent-sensitive для турецкой локали не усложнит эту безусловно прекрасную программу?
твои же слова?
Вот таки они довольно смешно звучат, особенно если сравнить твой тон и твою эрудированность в вопросе
Так что я и советую таки, перед тем как в след. раз людей смешить, разобраться таки в вопросе СНАЧАЛА...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Хвост, Вы писали: Х>просто вот когда дело доходит до новых апи — здравствуй интероп с нейтивом, хочешь массив на стеке — здравствуй ансейф, тот же пэйнт.нет афаир просто насквозь пропитан ансейфом, зачем тогда сишарп? хорошие вещи делаются только в нейтиве, вот тот же пример с выводом строк, для такой забавы как флейм на рсдн и стримы с регекспами не грех использовать, а вот если бы ето была программа промышленных маштабов — скажим анализатор логов, то здравствуй мем-маппед файлы да стейт-машины с отсутствием аллокаций, и писать етона си++ без ifstream и multiset, а не на сишарпе с gc и аллокацией на каждый чих.
О да. Анализатор логов — это конечно гораздо промышленнее сайта с дневной посещаемостью в сотню тысяч хитов.
На всякий случай напомню, что на каждую строчку лога, которую читает анализатор, этот самый сайт успевает авторизовать пользователя, сбегать в базу, раскрасить синтаксис, выдать HTML. И всё это "с GC и аллокацией на каждый чих", и стримами, и регекспами.
Но нет, конечно же авторы анализаторов логов считают себя гораздо более главными. Удачи.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, Sinclair, Вы писали:
S>>О да. Анализатор логов — это конечно гораздо промышленнее сайта с дневной посещаемостью в сотню тысяч хитов.
S>>На всякий случай напомню, что на каждую строчку лога, которую читает анализатор, этот самый сайт успевает авторизовать пользователя, сбегать в базу, раскрасить синтаксис, выдать HTML. И всё это "с GC и аллокацией на каждый чих", и стримами, и регекспами. S>>Но нет, конечно же авторы анализаторов логов считают себя гораздо более главными. Удачи. Х>авторизация — доступ в нативную rdbms, сбегать в базу — аналогично, раскрасить синтаксис — если ты говоришь об уровне расскраски как на рсдне то ето даже не смешно , выдать хтмл — нативный IIS. Х>где тут твой C#? позвать то, взять ответ, позвать другое и дать ему ответ предыдущего? клей, сопли, грусть. Ты сам-то в какой области на C# пишешь? а то я смотрю тут каждый второй на C# пишет только дальше сайтов и ентерпрайза никто своё рыльце не высовывает, потому что атата.
Таким образом разработчику сайта надо:
1)продумать систему аутентификации и авторизации
2)создать схему БД, соотвествующую требованиям, обеспечивающую целостность данных и хорошую производительность
3)написать SQL или другой код для получения и изменения данных, организовать кеширование данных (возможно распределенное)
4)сделать шаблоны страниц
5)написать код для обработки данных из базы с целью исключения XSS
6)написать код для обработки данных от пользователя и размещения из в БД
7)написать код для противодействия спам-ботам
8)взаимодействовать с веб-сервером для установки кужных параметров ответа
Таким образом разработчику сайтов надо разбираться в проектировании и оптимизации БД, очень хорошо разбираться в протоколе HTTP, разбираться в безопасности приложений, разбираться в клиентских технологиях (HTML+CSS+JS), разбираться в устройтве веб-сервера.
При это сайт не должен содержать ошибок и не должен бешено тормозить, иначе толку нет даже при отсуствии конкурентов.
Разработчики enterprise софта кроме того сталкиваются с:
1)разработкой сервисов, которые отдают данные клиентам
2)разаботкой десктоп-клиентов, со сложными интерфейсами
3)разработкй мобильных клиентов, которые не всегда могут иметь связь с сервером
4)необходимостью выполнять длительные процессы (больше чем время непрерывной работы клиентов и сервера) с взаимодействием разных клиентов
При всем этом приходится постоянно подстаивать ПО под изменяющиеся требования.
И это все не касаясь еще вопросов обработки тех самых данных — от раскраски синтаксиса до построения аналичитеских систем, способных предсказывать показатели.
так что насчет невысовывания рыльца — мимо кассы.
Вам на C++ часто приходится сталкиваться с таким объемом разных задач?
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Только делать так не нужно. В первую очередь стоит заняться алгоритмический оптимизацией или даже архитектурной, а не кидаться писать кастомный аллокатор. G>>Причем этот подход работает для любых языков.
H>Ты сам недавно писал, что архитектура ортоганальна перформансу
Да.
Архитектурная оптимизация — когда вы избавляетесь от части ненужных вычислений или делаете так что длительные вычисления не оказывают влияния на наблюдаемый перфоманс.
Здравствуйте, gandjustas, Вы писали:
E>>Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию. G>Отличная идея. GC как раз позволяет не думать о выделении и освобождении памяти вообще.
Это не правда. Если бы GC позволял не думать о выделении и освобождении памяти, то какой смысл бы был сравнивать производительность GC и стандартного аллокатора С++? Или эти сравнения в топике были бессмысленными?
Как можно не думать о выделении и освобождении объектов, если из-за этого может оказаться очень низкая производительность приложения?
G>Если производительность окажется недостаточной то надо смотреть причны и бороться с ними. G>Причем чаще всего прчиной оказывается применение неподходчщего алогоритма. Очень редко приходится нарываться на ситуацию когда низкая производительность вызвана особенностями платформы.
А причём здесь алгоритмы, если речь идёт о декомпозиции на объекты? Если бы дело было только в алгоритмах, то тогда не применяли бы ООП, а так бы и писали эти алгоритмы на структурных языках. Алгоритм может быть одним и тем же, но по-разному представляться с помощью объектов, работать с разными объектами. По вашим словам один и тот же алгоритм может быть одновременно "подходящим" и "неподходящим" в зависимости от используемой объектной модели задачи. А если Вы подразумеваете под разными алгоритмами использование разных объектных декомпозиций, то тогда Вы просто ограничиваете доступный набор этих декомпозиций, с помощью которых можно решить задачу, просто называя такие декомпозиции неподходящими из-за скорости выделения памяти. А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав?
А ты подумай Сейчас вузы выпускают примерно 9 разработчиков тяготеющих к какому нить С#, к 1 толковому на С++, при примерно равном кол-ве вакансий, чтобы не быть голословным:
Да и ниши это разные совсем, о чём тут вообще спор то идёт. Приложения то языков разные совсем, давайте ещё поспорим на тему, что лучше LISP или PHP.
Тут ответ простой и ясный на вопрос, хочешь дёшево лепить корпоративные вэб сайты/сервисы и формоклёпить со скоростью света бери С#. Хочешь в перспективе работать в Apple, Google, Microsoft, в России в к примеру в Yandex ну или ещё в одном вот из этих ( http://www.research.att.com/~bs/applications.html ) "скромных" мест, в которых как известно работают одни идиоты, которые не читают RSDN и не знают, что с использованием .Net они бы сделали всё быстрее и лучше, учи С++. Только в С++ мало приятного, что в разработке, что в изучении, которое в лучшем случае продлится лет 5, а в худшем не закончится никогда. По уровню зарплат опять же в целом C++/Unix разработчики обычно получают значительно выше, при том же уровне квалификации.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Как можно не думать о выделении и освобождении объектов, если из-за этого может оказаться очень низкая производительность приложения? G>>Спокойно, и произовдительность нормальная будет.
E>Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка?
Для систем с GC — да. Это и позволяет концентрироваться на алгоритме.
Для C++ — нет. Там надо думать о том как распределяется память под объекты.
E>>>А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав? G>>Неправ. Слабые выразительне способности C++ не позволяют мере проводить объектую декомпозицию так как хочется. E>Примеры?
1)Как минимум нельзя просто вернуть динамический объект из метода, потому что неизвестно освободят ли его.
2)Осутствуют многие языковые конструкции как yield, ФВП, делегаты, события.
3)Отсуствие метаинформации о типах не позволяет создавать решения вроде IoC контейнеров, OR-мапперов, связывания данных (binding) и других полезных фишек.
Я знаю что некоторые недостатки исправляются бустом, но обычно это порождает сложночитемый код.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, esil, Вы писали:
E>>>Здравствуйте, gandjustas, Вы писали:
E>>>>>Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка? G>>>>Для систем с GC — да. Это и позволяет концентрироваться на алгоритме.
E>>>Представьте, что надо сделать текстовый редактор типа WYSIWYG. Ваша вера настолько сильна, что Вы рискнёте для представления одного символа использовать отдельный объект некоторого класса? G>>А такое вообще может быть нужно? Я что-то не представляю сценарий, где для одного символа требуется объект класса. G>>Если что есть паттерн flyweight, который как раз позволяет не создавать кучу однотипных объектов.
E>Вот WYSIWYG-редактор -- это как раз и есть сценарий, где для одного символа хотелось бы отдельный объект.
Я к сожалению или к счастью визивиги не писал, но не очень понимаю зачем иметь объекты на каждый символ.
Может вы объясните?
E>Наша беседа становится предсказуемой. Я знал, что сейчас Вы скажите про flyweight, а я скопирую описание сего паттерна из той известной книги. E>Таки вот, копирую: E>
поскипано
E>А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные?
Какое отношение это имеет к теме разговора?
E>Вот это Ваше утверждение "Я что-то не представляю сценарий, где для одного символа требуется объект класса" исходит не из того, что такого никогда не хотелось бы, а из того, что такое не применяется. Не Вам не требуется или не хочется, а это скорее всего будет просто недопустимо. Вы считаете, что этот самый flyweight выглядит не более сложным и не менее хуже читаемым и спопровождаемым, чем отдельный объект для каждого символа?
Не понял что вы этим хотели сказать.
Давайте так: объясните зачем создавать какой-то класс, если уже существует подходящий тип в базовой библиотеке.
E>>>Представьте, что надо реализовать какую-нибудь числодробилку. Ваша вера настолько сильна, что Вы рискнёте для представления числа использовать класс? G>>А что значит класс? G>>Например в C# сами числа являются наследниками Object, имеют методы и реализуют интерфейсы.
E>Класс — это значит уж точно не то, что представляют из себя примитивные типы с автоматическим боксингом в C#.
Так что представляют из себя классы? Причем тут боксинг вообще?
E>Кстати, это не с Вами мы разбирали тот пример с обходом plain-массива по индексам и обхода через интерфейс? Или я путаю?
Не припоминаю, наверное не со мной.
G>>Я надеюсь вы сами понимаете, что выдумываете что-то нереальное. не нужно создавать классы для символов и чисел, они уже есть и отлично работают. G>>А если каких-то абстракций нету в стандартной библиотеке, то я буду создавать классы. G>>Очень надеюсь что все программисты так поступют.
E>В каком смысле нереальное? Нереальное в плане затрат на реализацию? Так оно о том и речь. С тем, что скорее всего можно найти объектную декомпозицию, которая будет менее затратной по производительности, и более-менее "красивой", никто и не спорит. Но это никак не противоречит неверености вашего исходного утверждения о том, что все объектные декомпозиции имеют производительность одного порядка.
Нет, вы придумываете ситуации, которые не встечаются в нормальных приложениях.
На выдуманых примерах можно вообще показать что угодно.
G>>>>Для C++ — нет. Там надо думать о том как распределяется память под объекты. E>>>В каком смысле надо думать? Думать о том, когда и как память освободить? Ну тогда это утверждение выглядит бредово, с учётом предыдущего. "Производительность будет отличаться на порядки, потому что надо думать". Память выделяется и освобождается в обоих вариантах, но во втором варианте надо думать, чтобы её освободить, поэтому производительность будет хуже. G>> G>>Ниче не не понял.
E>Имелось в виду, что здесь очередной плевок в сторону С++ и unmanaged-языков был абсолютно не уместен, потому что здесь либо для обоих вариантов ответ да, либо для обоих нет.
Это надо еще доказать. Ваш пример с визивигом доказательство не является, потому что он явно надуманный и нифига не обощается. Далеко не во всех программах есть очень много одинаковых объектов.
Здравствуйте, les_paul, Вы писали:
>>> с чего начать: С++ или С#?
_>А ты подумай Сейчас вузы выпускают примерно 9 разработчиков тяготеющих к какому нить С#, к 1 толковому на С++, при примерно равном кол-ве вакансий, чтобы не быть голословным:
Да, разработчиков на дот нете развелось очень много. Согласен. Мне кажется, что их даже больше, чем требуется.
_> Тут ответ простой и ясный на вопрос, хочешь дёшево лепить корпоративные вэб сайты/сервисы и формоклёпить со скоростью света бери С#. Хочешь в перспективе работать в Apple, Google, Microsoft, в России в к примеру в Yandex ну или ещё в одном вот из этих ( http://www.research.att.com/~bs/applications.html ) "скромных" мест, в которых как известно работают одни идиоты, которые не читают RSDN и не знают, что с использованием .Net они бы сделали всё быстрее и лучше, учи С++. Только в С++ мало приятного, что в разработке, что в изучении, которое в лучшем случае продлится лет 5, а в худшем не закончится никогда. По уровню зарплат опять же в целом C++/Unix разработчики обычно получают значительно выше, при том же уровне квалификации.
Согласен на 100%. Только могу добавить от себя, что разработчики на С++ находят себе применение и в гораздо более скромных фирмах, чем вышеперечисленные.
Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
Здравствуйте, ppp222, Вы писали:
P>Сборщик мусора противопоказан С++. Стихия С++ — это эффективный код, где строки — это массив символов, завершающийся нулём, а не вызов библиотечных функций. И не потому, что стандарт С++ какой — то недоразвитый, а потому, что работая таким образом мы получаем прирост производительности от десятков до сотен процентов.
Во-первых, если говорить о строках в применении к C++, то это скорее std:string, нет?
А во-вторых, о какой эффективности идёт речь, если «строки — это массив символов, завершающийся нулём»?
Здравствуйте, ppp222, Вы писали:
P>Стихия С++ — это эффективный код, где строки — это массив символов, завершающийся нулём, а не вызов библиотечных функций.
Этот перл достоин отдельго осмеяния.
Если строки — это массив символов, завершающийся нулём, то насколько эффективно получение длины строки?
Да и вообще-то строки как массивы символов используются в C, а не С++
Здравствуйте, ppp222, Вы писали: P>Сборщик мусора противопоказан С++. Стихия С++ — это эффективный код, где строки — это массив символов, завершающийся нулём, а не вызов библиотечных функций. И не потому, что стандарт С++ какой — то недоразвитый, а потому, что работая таким образом мы получаем прирост производительности от десятков до сотен процентов.
Юморист. Пиши еще. Строки без длины — это конечно прирост производительности, это да.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, SleepyDrago, Вы писали:
G>>>>>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. Х>>>>смешно G>>>Ага, я тоже от души поржал когда резщультаты тестов смотрел.
SD>>а потом мы все от души поржем когда кто-нибудь знающий покажет вам результаты F... Fortran'а
C>А что мы там увидим? Неужто еще больший прирост производительности?
C>Я думаю, что gandjustas подразумевает, что на F# получается более эффективный код по критерию (лаконичность+читабельность) / производительность.
Да вот в этот раз нет. Именно по замерам времени выполнения код на F# оказался быстрее C++_ного варианта в 8 раз.
Правда никто мегаоптимизацией на С++ не занимался.
Вот и хочется увидеть вариант решения задачи на С++ от крутых перцев из КСВ.
Здравствуйте, ollv, Вы писали:
G>>>Да хватит уже кросплатформенностью меряться. Самые кроспалформенные GUI-фреймворки уже давно придуманы это HTML+CSS+Javascript, чуть меньшей кроссплатформенностью обладают Flash и Silverlight. С++ c Qt даже рядом не валялся.
ГВ>>Ну, если xML — это путь кроссплатформенных GUI, то чем дальше C++/Qt от них, тем оно лучше. O> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов.
Откуда у С++ "высокие абстракции"? Вы явно что-то путаете. Если Вы считаете уличную магию Александресску — высокими абстракциями, то вынужден Вас разочаровать...
"Архитектурные решения" на С++ тоже довольно примитивны на фоне управляемых языков. Простейшие примеры: IoC/DI и AoP, из более сложных — метапрограммирования типа того, что в Nemerle, ну и конечно всякие DSL...
C++ выигрывает там, где требуется детерменированное освобождение памяти и низкоуровневые оптимизации, но за это приходится платить сложностью разработки и сопровождения, а соответственно и ценой.
Здравствуйте, Sorantis, Вы писали:
S>Можно конкретный пример? Очень интересно, что за абстракцию можно сделать на плюсах которая будет невозможна на Java например?
ну например std::auto_ptr.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Здравствуйте, catBasilio, Вы писали:
S>>Можно конкретный пример? Очень интересно, что за абстракцию можно сделать на плюсах которая будет невозможна на Java например?
B>ну например std::auto_ptr.
Это абстракция? Это костыль помогающий ходить без одной ноги в условиях когда нет автоматического управления памятью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>ИМХО лучше вместо кривых костылей с самописными GC, "умными" указателями и прочей лабудой использовать нормальные языки. Х>"нормальные" языки дают оверхед на пустом месте, единственный высокоуровневый язык без оверхедов — С++
Ага, с такими же "высокоуровневыми абстракциями". Заканчивай, не смешно уже.
Кстати тесты по быстродействию операций выделения-освобождения памяти в с++ и .NET я приводил — C++ сливает.
И это без умных указателей и прочей лабуды, с ними банальная вещь — работа с памятью — будет еще медленнее.
Здравствуйте, Хвост, Вы писали:
G>>ИМХО лучше вместо кривых костылей с самописными GC, "умными" указателями и прочей лабудой использовать нормальные языки. Х>"нормальные" языки дают оверхед на пустом месте, единственный высокоуровневый язык без оверхедов — С++
Очень смешно.
Здравствуйте, criosray, Вы писали:
Х>>или ммм... такую "фичу" как множественное наследование, C>Множественное наследование — моветон, сродни goto. Это ХОРОШО, что его нету, иначе количество граблей, генерируемых индусами возразло бы экспоненциально.
Ты уверен, что апелляция к "индусам" в этом контексте выглядит позитивно?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем? Х>потому что бизнес-логика может писатся хоть на скриптах, всем начхать на оверхед, упирается в базу обычно. То что интерфейс лагает слегка — не имеет ни для кого значения. Обсуждалось уже вроде.
так С++ такой крутой, с высокоуровневыми абстракциями и прочей лабудой, чего бы на нем не писать все это?
G>>Из игрушек кстати Halo 3 вполне на C#. Х>Пруфлинк. Могу допустить что там игровая логика написана на C#, но движок — никогда.
Движок — XNA, набери в гугле — сразу все увидишь.
Здравствуйте, gandjustas, Вы писали:
G>>>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем? Х>>потому что бизнес-логика может писатся хоть на скриптах, всем начхать на оверхед, упирается в базу обычно. То что интерфейс лагает слегка — не имеет ни для кого значения. Обсуждалось уже вроде. G>так С++ такой крутой, с высокоуровневыми абстракциями и прочей лабудой, чего бы на нем не писать все это?
дык потому что мало C++ программистов, дорого они стоят, а бизнес-систем много. и поддерживать их будут программеры "на местах", а им лучше язык попроще дать, без острых углов.
G>>>Из игрушек кстати Halo 3 вполне на C#. G>Движок — XNA, набери в гугле — сразу все увидишь.
я вот призадумался, ты или не знаешь что такое движок, или толком не понимаешь что такое XNA, или ты так далёк от игростроя что почитав "интернеты" придумал свой мир где дотнет захватил игрострой :-D
p.s.
погуглил
Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>>>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем? Х>>>потому что бизнес-логика может писатся хоть на скриптах, всем начхать на оверхед, упирается в базу обычно. То что интерфейс лагает слегка — не имеет ни для кого значения. Обсуждалось уже вроде. G>>так С++ такой крутой, с высокоуровневыми абстракциями и прочей лабудой, чего бы на нем не писать все это? Х>дык потому что мало C++ программистов, дорого они стоят, а бизнес-систем много. и поддерживать их будут программеры "на местах", а им лучше язык попроще дать, без острых углов.
Судя по форуму — совсем немало. А судя по вакансиям хорошему программисту на шарпе платят больше, чем хорошему программисту на С++.
G>>>>Из игрушек кстати Halo 3 вполне на C#. G>>Движок — XNA, набери в гугле — сразу все увидишь. Х>я вот призадумался, ты или не знаешь что такое движок, или толком не понимаешь что такое XNA, или ты так далёк от игростроя что почитав "интернеты" придумал свой мир где дотнет захватил игрострой :-D
Я отлично знаю что такое движок, даже сам писал что-то подобное, и даже дописал. А потом понял что херней занимался долго время.
Х>p.s. Х>погуглил Х>Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA.
Да ну. И на чем ты напишешь игру для XBox 360?
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, ollv, Вы писали:
O>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках
O>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>А вот наоборот — редко бывает.
пустые слова, шарп расхолаживает
O>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает.
Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом,
биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. а при писанине на дотнете после плюсов всегда чувствуешь тормоза, и ограниченность, т.к. хочется сделать красиво, а не можется
G>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. возможность перегружать это от бедности?
O>>Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так) G>Какой гибкой архитектуры? C++ не умеет интеропать ни с какими другими языками, даже при интеропе с другой либой на С++ могут возникнуть проблемы.
ему это и не надо, а для предоставления интерфейса наверх и предоставлен менеджед С++, и ком O>>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее G>За последние 5 лет какое развитие было?
фреймворки ж)
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Хвост, Вы писали:
Х>>>Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA. G>>Да ну. И на чем ты напишешь игру для XBox 360? Х>я врятли напишу, но будь моя воля то движок ессно куцый C++/Direct3D
А я вот специально задался вопросом как писать для XBox 360 без XNA. Вообще материалов в сети по этой теме нету.
Никаких средств разрабтки без XNA не нашел.
Видится мне что на XBox игры только на XNA, а соовественно .NET\C#
Игр таких много — http://ru.wikipedia.org/wiki/Список_игр_на_Xbox_360
Здравствуйте, ollv, Вы писали:
O>>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>>А вот наоборот — редко бывает. O> пустые слова, шарп расхолаживает
Мы говорим об индусах или программистах? Не согласен. В шарпах не приходится тратить время на вещи которые должны быть даны, что в свою очередь позволяет сосредоточиться на коде как токовом и думать о алгоритме, логике.
В шарпах писуть гуй проще намного, это ли ваш повод утверждать что шарп расхолаживает?
O>>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает. O> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом,
Здравствуйте, gandjustas, Вы писали: G>Читать больше надо. От константности отказались как раз в силу сложности обеспечения честной константности.
а теперь расскажи мне, в чём сложность обеспечения четной константности, если даже C++ ето отлавливает на етапе компиляции? если в с++ запретить касты, разрушающие константность то окромя прямой работы с памятью возможностей изменить константный объект нет, почему же весь такой сейфанутый C# не одолел модификатор const?
Здравствуйте, gandjustas, Вы писали:
G>А я вот специально задался вопросом как писать для XBox 360 без XNA. Вообще материалов в сети по этой теме нету. G>Никаких средств разрабтки без XNA не нашел.
ну как, есть железка для дебага — xbox 360 dev kit, ето тотже ящик только с возможностью подключения к нему с персоналки и дебага всех потрохов, разработка ведётся так — на свой компутер ставишь студию, ставишь дхсдк, рядом ставишь хящик девкит, девкитовский софт ставишь себе на компутер. И всё, здравствуй С++ и Direct3D, фигач — заливай в девкит, дебажь в студии как обычный C++ код (вроде удалённой отладки), радуйся жизни. XNA ето такой небольшой фреймворк для создания казуальных игр скорее, или прототипирования идей, но на хне производительности не добиться, на платформах где игры в целях оптимизации работы аллоцируют динамическую память только один раз за сеанс — гц, дотнет, сишарп, хны пролетают.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Отдельное спасибо за удачную подборку саму по себе.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, ollv, Вы писали:
O>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, ollv, Вы писали:
O>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Здравствуйте, ollv, Вы писали:
O>>>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>>>>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках O> ну посмейся, может в процессе придет понимание того, что в с++ есть возможность сделать то, чего нет в других языках, и есть возможность сделать подобие того, чего в нем изначально не было, и есть в других.
Ну тогда в студию GC, с такими же performance характеристиками, как в managed.
O>И это при том, что в нем можно работать как в менеджед, так и в анменеджед,
Это не является преимуществом.
У unmanaged вообще говоря достаточно мало преимуществ.
O>Сравнивать же менеджед и анменеджед — изначально бредово, т.к. если идет сравнение возможностей, то последние молчат при необходимости работы с МАПИ и библиотеками с ансаппортным диспатч и т.д.
.NET умеет работать с COM.
O>>>>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>>>>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>>>>А вот наоборот — редко бывает. O>>> пустые слова, шарп расхолаживает G>>Чего расхолаживает? O> Ощущение , что попал в песочницу с необходимостью постоянно в случае невозможности рыть совочком, прыгать опять за забор или через импорт апишных методов, или чз написание дополнительных утилзов на сях
Ты неверное в другом мире живешь.
Сколько я проектов сделал на .NET необходимость в вызовах нативных методов возникала раза два.
Неверное это от твоего незнания библиотеки.
O>>>>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>>>>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает. O>>> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом, G>>А в чем? Зачем скобки переопределять надо? O> ты изначально поставил глупый вопрос, нафига в нете делегаты, что методов мало ?
Делегаты можно считать навороченным "указателем на функцию", так как в .NET сам методы не являются FCO.
А в C++ не было ни делегатов и ФВП, были только указатели на функцию, которые как и все указатели наделены родовыми травмами.
Перегрузка скобок дает возможность делать что-то издалека похоже на делегаты .NET или ФВП, в остальном такая перегрузка нафиг не нужна.
O>>>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. G>>Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь? O> А ты подумай немного, ..как реализовывать late fastening в дотнете ? Когда конструирование аргументов, владельцев методов, и создание каскада вызовов разведено во времени? — никак. а через поздний биндинг это решается.
Ты вывалил все оставшиеся слова, которые знаешь? Покажи пример кода на С++.
O>>>т.к. хочется сделать красиво, а не можется G>>Красиво это как? Нафигачить шаблоков? G>>И как на плюсах сделать красиво IoC-контейнер? O> да запросто, причем реализовывается с ограничение депенденси, при превышении даже собираться не будет
Ну код в студию.
G>>>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O>>> возможность перегружать это от бедности? G>>Нет, примерение этой возможности — от бедности. G>>В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу. O> ах в бууст даже запятую перегрузили .. ты меня реально утомил. Плюсы на столько гибкий язык, что позволяет имлементить реализации модифицирующие синтаксис, да еще и чик __asm и ты уже там . А тебя это раздражает Да
Если каждый начнет "имплементить реализации" (шибанутое словосочетание) модифицирющие синтаксис, то будет попа. Код станет абсолютно нечитаемым.
O> Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си.
Это ты сам себе придумал? Из C# отлично дергаются нативные методы, да нужны они очень редко, а работа с комом происходит гораздо проще.
G>>>>За последние 5 лет какое развитие было? O>>> фреймворки ж) G>>Мы про язык\стандартную библиотеку. O> опять за рыбу деньги, — фреймворк внесенный в стандарт становится частью языка. Просто понимаешь какая штука, за время своего существования плюсы стали академическим языком, просто так внести новый фреймворк, не так просто нужно доказать, что в этом есть необходимость.
Не отмазывайся.
Здравствуйте, gandjustas, Вы писали:
ГВ>>OK, теперь давай выясним, что такое "красиво". Желательный интерфейс набросаешь кратенько? G>Угу. Есть метод Register, который заносит в контейнер пару (тип интерфейса, тип реализации), и метод Resolve, который по заданному типу интерфейса выдает объект нужного типа реализации. G>Когда получится можно сделать так чтобы если тип реализации имеет конструктор с параметрами, то при создании объекта в параметры конструктора подсчтавлялись бы объекты полученные через Resolve.
OK, сегодня-завтра набросаю. В принципе, сразу можно сказать, что вот такой примерно интерфейс вполне достижим:
Не уверен, насколько надёжной может быть реализация Resolve в смысле параметров, но это только "пока что не уверен".
С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил.
ГВ>>И как это опровергает сказанное мной? Что если фича реализована средствами языка — это не недостаток самого языка? G>Если фича востребована, а реализация делается через непонятно что. причем за много лет в самом языке это не было исправлено, то это однозначно свидетельствует о недостатке языка.
В лучшем случае, это свидетельствует о недостатках процесса управления разработкой языка. Мало ли какие фичи могут оказаться востребованными?
ГВ>>Вопросы были риторическими. Иными словами, на самом деле проблем с совместимостью и интероперабельностью хватает у всех, так что выпячивать аналогичные недостатки C++ как некие особенные тут нет никакого смысла. G>На самом деле проблем нету, потому что все описанное является только потенциальными проблемами и очень редко встречается в жизни. Тогда как интероп между C++_ными библиотеками встречается часто.
Как ни странно, но даже это вполне объяснимо количеством производителей компиляторов. В отличие от той же Java и тем более — от .Net. Кстати, заморочки с переносом кода между .Net и Mono, AFAIK, имеют место быть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, ollv, Вы писали:
O>>> ну посмейся, может в процессе придет понимание того, что в с++ есть возможность сделать то, чего нет в других языках, и есть возможность сделать подобие того, чего в нем изначально не было, и есть в других. G>>Ну тогда в студию GC, с такими же performance характеристиками, как в managed. O> нахрен он нужен если есть шаред птр? чтобы морочить себе голову вызовом принудительной сборки для попытки освободить ресурс в прогнозируемое время
шаред птр — дополнительные тормоза на каждой операции присваивания и каждом выходе из блока. .NETовский GC порвет релизацию работы с динмамической памятью на shared_ptr как тузик грелку.
O>>>И это при том, что в нем можно работать как в менеджед, так и в анменеджед, G>>Это не является преимуществом. G>>У unmanaged вообще говоря достаточно мало преимуществ. O>ты совсем ляпнулся или как ? Код по работе из менеджед с МАПИ? (даже не пытайся, по твоим суждения видно что ты не доганяешь принципиальной разницы диспатч саппортинга )
А нахрен он нужен в .NET?
O>>>Сравнивать же менеджед и анменеджед — изначально бредово, т.к. если идет сравнение возможностей, то последние молчат при необходимости работы с МАПИ и библиотеками с ансаппортным диспатч и т.д. G>>.NET умеет работать с COM. O> : насмешил мои тапочки очередной раз ..ну подними IUnknown
А зачем? .NET отлично работает с com без вникания в детали реализации этого COM. Не нужно знать про IUnknown, AddRef и Release, про CoCreateInstance и прочее/
То что ты считаеь крутостью является на самом деле ненужной шелухой.
G>>Ты неверное в другом мире живешь. G>>Сколько я проектов сделал на .NET необходимость в вызовах нативных методов возникала раза два. G>>Неверное это от твоего незнания библиотеки. O>Ха, какой библиотеки если есть области для которых менеджед код не имеет библиотек, МАПИ — это лишь одна — совсем малая из них. Ты что до сих пор не понял, роль менеджед Си?
Да нахрен не нужен MAPI, .NET и без него почту слать умеет.
G>>Делегаты можно считать навороченным "указателем на функцию", так как в .NET сам методы не являются FCO. G>>А в C++ не было ни делегатов и ФВП, были только указатели на функцию, которые как и все указатели наделены родовыми травмами. G>>Перегрузка скобок дает возможность делать что-то издалека похоже на делегаты .NET или ФВП, в остальном такая перегрузка нафиг не нужна. O> Да нифига, си благодаря своей гибкости () позволяет реализовать то, что есть в других языках без изменения самого Си , функторы появились зодолго до делегатов, — , которые в принципе ничем не отличаются от указателя на функцию, кроме оверкодинга в декларации. O> идиома mem_fun и bind это гораздо более широкое понятие, чем делегаты именно благодаря позднему связыванию, когда O>декларации вида: O>
//нечитаемая фигня опущена
O>с возможностью биндить как аргументы, так и владельцев
А в чем крутость если тоже самое достигается передачей объекта как параметра?
O>>>>>т.к. хочется сделать красиво, а не можется G>>>>Красиво это как? Нафигачить шаблоков? G>>>>И как на плюсах сделать красиво IoC-контейнер? O>>> да запросто, причем реализовывается с ограничение депенденси, при превышении даже собираться не будет G>>Ну код в студию. O> денег давай будет — а пока можешь уже готовые решения посмотреть , а они есть ..
Зачем тебе денег? Все контейнеры бесплатные. Нормальных решений для С++ нету.
Слив засчитан.
G>>Если каждый начнет "имплементить реализации" (шибанутое словосочетание) модифицирющие синтаксис, то будет попа. Код станет абсолютно нечитаемым. O> на этой попе, простите, сидит весь NET
Примеры покажешь как весь .NET сидит на модификации синтаксиса?
O>>> Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си. G>>Это ты сам себе придумал? Из C# отлично дергаются нативные методы, да нужны они очень редко, а работа с комом происходит гораздо проще. O>Опять смешишь тапочки, ? создай в шарпе натив экземпляр и вызови от него метод.
Натив экземпляр чего?
Я уже много лет как ушел с С++, и как же я рад этому... Глядя на ЭТО понимаю на сколько правильным оказался мой выбор.
O>task<_1call, task<_2call > > t (bind(&_1call::m<dyadya_vasya>), task<_2call, task<_3call >... >... );
Здравствуйте, catBasilio, Вы писали:
B>Если С# так хорош, то почему всякие Crysis, Quake, FarCry и прочее на нем не пишут?
Банально выжимают производительность. Тот же Quake писался на С. Кормак ООП в принципе не приветствовал никогда.
Кстати, большой объем кода в играх — это логика игры. И его ни один идиот на С не пишет.
Есть и игры написанные на 90% на управляемом коде. Так что выигрышь от применения С++ и С не велик.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Не, так не честно. Слюноотделение есть, а вкуса нет.
Слюни можно употребить в качестве аргументации. Как раз подходящий форум.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>>>Ой не верю. Для этого нужно GC. ГВ>>Нет. GC для этого не обязателен. VD>Из известных мне вариантов есть еще только подсчет ссылок. [...]
Повторю: ни GC, ни подсчёт ссылок для ФП-стиля не обязательны.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
ГВ>>>И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо. C>>Это очень плохо. Язык должен развиваться. Посмотрите на С# — кому плохо, что за эти 7 лет на пороге уже 4ая версия языка, где каждая версия — серьезный шаг вперед?.. Х>язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь.
Если бы Вы что-то знали о С# и об Андерсоне, Вы бы не писали такой чуши.
Здравствуйте, Хвост, Вы писали:
Х>>>язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь. C>>Если бы Вы что-то знали о С# и об Андерсоне, Вы бы не писали такой чуши.
Х>Ганс Христиан? Как же, знаком, знаком. "Принцесса на горошине", "Дюймовочка", "Гадкий утёнок", да что там, "Стойкий оловянный солдатик", ето же всё классика и знакома каждому.
Опечатка. Подразумевался Андерс. Андерс Хайлсберг. Х>А по существу, в чём чушь? Удиви меня.
В том, что для С# никогда не будет "десятков компиляторов и платформ" — язык будет продолжать развиваться во много раз быстрее С++ до тех пор, пока будет куда развиваться, а путей развития для него все еще — море.
Здравствуйте, criosray, Вы писали:
ГВ>>Началось... Давай вспомним все значения слова "стоимость" и все контексты, к которым его можно привязать. C>Началась демогогия... Вам есть что по делу сказать?
Я уж сказал, вроде. Стоимость для конечного пользователя — это, в числе прочего, и стоимость аппаратных ресурсов, необходимых для выполнеия программ.
ГВ>>Ух ты. А что это такое — 1% от ФЯ? А почему не 0,76% и не 3,84%? C>Еще одна порция демагогии. По делу нечего сказать? Под 1% подразумевалась — малая доля, если Вы ничего больше придумать не можете, кроме как цепляться к словам. C>Функциональщины в том же С# больше, чем в С++0х (хорошее название, кстати, точно выражает инопланетное происхождение синтаксиса языка), но это не делает С# функциональным языком.
Прости, а кто-то утверждал, что C++ — функциональный язык? Говорили, что он поддерживает функциональный стиль. Это несколько не одно и то же. Не надо додумывать, а потом спорить с додуманным.
ГВ>>Это как-то опровергает то, что Lisp медленнее C++? C>Нет, это означает что во многих (в большинстве, коли Вам так будет угодно) контекстах аргумент производительности конечного продукта абсолютно иррелевантет.
Да и шут с ними, со многими контекстами, в которых производительность не важна. В огороде бузина...
C>>>Лучшее — враг хорошего. ГВ>>Бесспорно. На C++ получаются вполне хорошие решения. C>Смотря по каким критериям оценивать и в зависимости от задач.
+1
ГВ>>С кем-то я совсем недавно спорил по поводу читабельности... А, с Владом как раз. Давай, теперь с тобой. Что такое "читабельность"? Какова связь читабельности и, например, open/close principle? C>Самая что ни есть прямая.
Сначала ответь на первый вопрос: что такое "читабельность"?
ГВ>>Вот те раз, а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы. C>Легкость понимания зависит от выразительности и лаконичности синтаксиса языка и структуры кода (и других менее значимых факторов). В этом плане С++, скажем прямо, сосет. И Ваша реализация IoC тому самое явное доказательство (для сравнения смотрите исходник Сastle MicroKernel).
Я разве утверждал, что C++ — лаконичный язык? Его относительная многословность — вполне медицинский факт.
Кстати, что касается IoC, то мы начали с желательной модели использования. И кстати, содержательных комментариев так пока и не последовало.
ГВ>>Следовательно, для этой ниши C++ вполне подходящий и продуктивный язык, где ему нет достойных конкурентов. C>На безрыбьи и рак — щука.
Да ну? Разве ж C++ — это безрыбье? Безрыбье — это автокод.
ГВ>>Будь я разработчиком компилятора того же C++, меня такая ситуация очень бы устраивала (стабильность спецификации). C>Какой процент разработчиков компилятора от общего числа программистов?
Меня это устраивало бы, потому что можно сделать высококачественный компилятор и спокойно его отшлифовать, не опасаясь очередного виража стандартизаторов. А не потому, что я нашёл тихую заводь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
class Foo {
public:
int foo(){...};
};
std::vector<Foo*> vec;
find_if (vec.begin(), vec.end(), bind(&T::foo, _1) != 42);
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
. S>>Обращение не конкретно к ГВ, а к тем, кто пожелает защитить честь неуправляемого кода, или просто помочь человеку разобраться с тем, что он делает не так.
COF>Это не сравнение управляемого и неуправляемого кода, а тестирование подсистем ввода-вывода
Дело не в том как написано и что тестируется и даже не в конкретном экспериментаторе (который думает что разница в контроле типов в рантайме), а в интерпретации результата.
Победил C# — недоумение
Победил С++ — значит C# — тормоз
Притом человеку не важно, что тесты заняли около 3х секунд, если бы и 30 в обоих случаях, он бы не удивился. Ему важно что на такой синтетике (10 тыс. раз по 10 тыс символов) что-то быстрее, притом что он гораздо больше потеряет в эффективности принимая непутевые решения.
Здравствуйте, criosray, Вы писали:
C>и это заметно. Чистота вообще не шибко кого заботит в мире С++ и появляются на свет уродливые творения, где над каждой строкой кода надо раздумывать так же долго, как при чтении Ницше...
Лишь только NDA останавливает меня от постинга особо смачных кусков проекта на C# писанного индусами с гринкартой.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>- арифметикой указателей можно и не пользоваться; G>Можно и С++ не пользоваться. G>А если пользоваться С++, то постоянно следить чтобы нигде не накосячить, чтобы не использовать арифметику указателей вмето итераторов, чтобы не использовать обычны указатели вместо умных итп. G>В нормальных языках за этим следит компилятор и рантайм. В C# для работы с указателями программист должен описать это явно. А вызывающий код может отказаться вызывать, то что небезопасно.
В пору, когда я писал на C++ мне были абсолютны чужды и непонятны лозунги о безопасности управляемого кода. У меня в руках был мощный инструмент, использовать который я знал как (к сожалению, в прошедшем времени). Тогда казалось: неумеешь писать надежный код на небезопасном языке — не берись, а умеешь — так если что, все под рукой.
Теперь я немного другого мнения о безопасности кода: Это как ABS! Если умеешь эффективно пользоваться тормозами и регулярно оттачиваешь свои навыки — ABS не нужен. Если ездишь из точки A в точку B без жажды адреналина, или за руль эпизодически садится жена — лучше бы ABS иметь чем не иметь. Пристегиваешь ремень безопасности, потому как не уверен за джигитов, которые носятся вокруг.
И убеждать водителей, не привыкших к ABS, что они без ABS не смогут ездить, дохлый помер...
Так и с unsafe кодом. Боишься не за себя, а за соседа, у которого нет нужных навыков. А раз компилятор ограничивает от потенциально опасных действий всех одинаково, можно внимание, необходимое для контроля за этим, направить в другое русло.
Здравствуйте, COFF, Вы писали:
ГВ>>>Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв". G>>И что? 2-3 виртуальных вызова вообще незаметны будут ни при каком раскладе. G>>Давай конкретно, о каком penality идет речь?
COF>Так скажем, не будут заметны в большинстве случаев. Однако, опираясь на практику как критерий истины , я могу однозначно сказать, что не только виртуальные, но и обычные вызовы влияют на производительность. Проверяется это очень просто — я интенсивно использую инлайны в проектах на C++, так вот время отклика для релизной версии в несколько раз (если не на порядок) лучше чем в отладочной — скажем 40-50 мс и 300-400 мс. Что это значит для пользователя я думаю объяснять не надо. Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает. На C++ так извращаться не надо — в итоге программы получаются эффективными, но асбсолютно не теряют в читаемости.
Сложно потерять то, чего изначально не было.
COF>В принципе, это была изначальная цель при создании C++ и она с успехом достигнута.
Достигнута.
COF>У C++ конечно есть недостатки и наверное можно придумать язык лучше, но по моему проблема в том, что вместо лучшего навязывается другое. Скажем, лисп — это отличный язык, но он не лучше и не хуже C++, он просто другой. То же самое с C# и явой.
Ну давайте разовьем мысль:
С++ не лучше Паскаля — он просто другой
С++ не лучше Бейсика — он просто другой
...
Вы хоть понимаете, что это демагогия и софистика? Да С++ не лучше лиспа, а хуже. С++ не лучше С#, а хуже. С++ не лучше явы, а хуже. Если Вы скажете что это тоже демагогия, то будете правы потому, что любое сравнение не имеет смысла, если проводится в отрыве от контекста реальных задач программиста, и если не указаны критерии сравнения.
S>>Если кто так не сделает, то его код будет работать медленнее, чем C++ и ему никак не догнать плюсы по перфомансу, что означает конец карьеры программиста
COF>На самом деле, это все (и еще много чего другого) я делаю когда пишу на C++, если надо написать действительно быстрый код. То что Вас это забавляет показывает только то, что с задачами, критичными по скорости Вам сталкиваться не приходилось. Увы...
Быстрый код получается не тогда, когда Вы тратите 90% времени на техническую оптимизацию кода и 10% на алгоритмизацию, а 90% на алгоритмизацию, 10% на техническую оптимизацию.
Здравствуйте, criosray, Вы писали:
C>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
Здравствуйте, COFF, Вы писали:
COF>Хорошо, вот более релевантная ссылка — просто не имею привычки (к сожалению) локально сохранять все статьи, которые я прочитал, чтобы при случае была возможность блеснуть на rsdn Поэтому пришлось погуглить немного COF>http://xman892.blogspot.com/2005/11/compact-framework-performance-hints.html
И где там про то, что всё нужно пихать в один большой метод? Наоборот вот на инлайнинг указывают...
Я так и не понял, причем здесь рекомендации по Компакт FW и обычный PC'шный FW?
А так списочек вполне стандартный, но он лишь указывает на возможные узкие места.
Кстати, в С++ нет виртуальных методов? А, просматривая, например, исходники Гугл Хрома, не смущает что и там есть всякие set/get а-ля свойства?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>>>- bind — это уже не низкий уровень; G>>>>Очень низкий. Связыванием должен заниматься компилятор, а не программист. Для простых типов и арифметических операция в C++ этого удалось добиться, а для всех остальных — нет. ГВ>>>Ну вот уже ты, по-моему, путаешься. Описанием связывания в любом случае занимается программист. G>>Да ну. Вот я пишу лямбду на C#: x => x.SomeMethod() == someValue, при этом someValue создает полноценное лексическое замыкание, которое в С++ невозможно вообще. Где здесь связывание?
ГВ>А упоминание someValue вот здесь: x => x.SomeMethod() == someValue — это что, как не описание того, что нужно связать, сиречь, описание связывания?
Только описание неявное, программисту не надо об этом заботиться, оно все само работает. Вариантов ошибиться нету.
ГВ>Ровно то же самое делается на C++: bind(&X::SomeMethod, _1) == someValue. И тоже, знаешь ли, полноценное лексическое замыкание. В конце концов, главное при создании замыкания что? ИМХО — связать переменные локального контекста с параметрами (или переменными) некоторой функции. Совершенно не важно, используем мы ссылки или значения.
Важно. Если связать что-нить с объектом в хипе, выделенном в текущем скоупе, и время жизни лямбды больше, чем текущий скоуп, то получится утечка.
ГВ>По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#.
Не надо торговаться. лямбды и замыкания в С++ ущербны.
ГВ>Но и в том, и в другом случае программист описывает, что именно связыватся.
Нет, в случае C# программист пишет функцию. Ему не надо вникать что там внутри компилятора происходит. В случае C++ он должен заниматься сввязыванием.
ГВ>>>И потом, bind — это, в общем-то, не полноценные лямбды, как ни крути. Показательно то, что на C++ их можно реализовать. G>> Показательно то что их нет в современном языке.
ГВ>Как это — нет? А новый стандарт? А новый компилятор от MS (который, правда, я ещё не щупал)? Всё есть, вроде. И опять таки, bind — пусть и не полноценная замена, но по крайней мере, для "маленьких функций" — вполне подходящее решение. Примечательно же оно тем, что получено средствами самого C++.
Ну и где этот стандарт?
ГВ>>>>>P.S.: Не хочешь высказаться по IoC
? G>>>>Хочу. Код также свидетельствует о черезмерной низкоуровневости С++. Метаинформацией о типах дожен заниматься рантайм, а не программист. ГВ>>>А где ты там метаинформацию нашёл? G>>TypeName, TrivialClassTraitDep1, TrivialClassTraitDep2, методы контейнера RegisterDep1, RegisterDep2, RegisterDep. В той или иной мере реализуют метаинформацию.
ГВ>Хм. Я бы так не сказал, поскольку Traits используются для конструирования типа (для инстанцирования RegisterDep). Ну а сами RegisterDep просто зависят от типа используемого конструктора (учтём, что сигнатура = тип функции), точно так же, как и любая функция требует параметров вполне определённых типов.
Это и есть метаданные типов.
ГВ>Программист в данном случае должен только выбрать, как именно регистрировать в контейнере тот или иной тип. Но это всегда обязанность программиста, выбор нужного конструктора полностью на компилятор не переложишь.
На компилятор — нет, а на контейнер — можно.
ГВ>Исключение, пожалуй, TypeName — эта структура, действительно, похожа на метаданные — то есть такие данные, которые сопоставляются типу, но прямо в него не включены. Но от TypeName можно избавиться посредством type_info — тогда метаданными будет заниматься только рантайм. Мне просто хотелось оставить возможность назначать объектам идентификаторы разных типов: GUID, int, const wchar_t * и так далее.
Ты считаешь что описание количества и типов параметров конструктора, совмещенное с методами создания объекта, не является метаданными?
Не стоит себя обманывать.
На type_info все не заменишь, типизированность пропадет, генериков в рантайме у С++ нету.
Здравствуйте, COFF, Вы писали:
VD>>На самом деле это многое говорит... о тебе.
COF>Я просто стараюсь избегать преждевременной пессимизации кода.
Так это и есть пессимизация кода, если Вы во время написания кода стараетесь экономить на количестве тактов процессора и байтов памяти, там, где это абсолютно не принципиально и только отвлекает Вас от, собственно, решения поставленной задачи.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#. G>>Не надо торговаться. лямбды и замыкания в С++ ущербны. ГВ>Не "ущербны", а специфичны для C++. У любого языка есть своя специфика. Не надо торговаться, не на рынке находимся.
ГВ>>>Но и в том, и в другом случае программист описывает, что именно связыватся. G>>Нет, в случае C# программист пишет функцию. Ему не надо вникать что там внутри компилятора происходит. В случае C++ он должен заниматься сввязыванием. ГВ>Ну всё, я уже понял. C++-ник должен отследить согласованность ЖЦ. Да, это есть, хотя и далеко от чудовищной проблемности, приписываемой такому подходу. Ну и опять таки.... Ладно, хватит уже про shared_ptr.
Какую согласованность, какого ЖЦ? Придумыванием терминов ущербность не скрыть.
ГВ>>>Как это — нет? А новый стандарт? А новый компилятор от MS (который, правда, я ещё не щупал)? Всё есть, вроде. И опять таки, bind — пусть и не полноценная замена, но по крайней мере, для "маленьких функций" — вполне подходящее решение. Примечательно же оно тем, что получено средствами самого C++. G>>Ну и где этот стандарт? ГВ>Планируется к принятию. Компилятор, AFAIK, уже вышел. (Можно подумать, что появись этот стандарт прямо сейчас, что-то бы изменилось в твоей риторике! Ага, верю я...)
Про стандарт уже давно говорят, а его пока нет.
ГВ>>>Хм. Я бы так не сказал, поскольку Traits используются для конструирования типа (для инстанцирования RegisterDep). Ну а сами RegisterDep просто зависят от типа используемого конструктора (учтём, что сигнатура = тип функции), точно так же, как и любая функция требует параметров вполне определённых типов. G>>Это и есть метаданные типов.
ГВ>Понятно. Значит, любую привязку к типу сейчас нужно называть использованием метаданных. А мужики-то...
Не любую привзку типу, а любые структуры данныих или методы, которые так или иначе описывают некоторый тип и его содержимое.
ГВ>>>Программист в данном случае должен только выбрать, как именно регистрировать в контейнере тот или иной тип. Но это всегда обязанность программиста, выбор нужного конструктора полностью на компилятор не переложишь. G>>На компилятор — нет, а на контейнер — можно.
ГВ>А как контейнер вычислит, что мне нужен именно определённый конструктор? Допустим, что у объекта два конструктора, оба с двумя аргументами, типы которых известны контейнеру. Контейнер сам примет решение? А на основании каких критериев?
На основании каких хочет, это его дело.
G>>Ты считаешь что описание количества и типов параметров конструктора, совмещенное с методами создания объекта, не является метаданными? G>>Не стоит себя обманывать. ГВ>Хм. Это есть явное указание типа (сигнатуры) используемого конструктора. Где тут метаданные? От цифр в названиях методов можно избавиться.
От этого метаданные не исчезнут.
G>>На type_info все не заменишь, типизированность пропадет, генериков в рантайме у С++ нету. ГВ>Как это — типизированность пропадёт? Какая? Где? std::string(raw_name) и полный вперёд!
Ну код в студию: типобезопасное создание в рантайме ообъекта по заданному type_info.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ> ГВ>> C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель.
ГВ> M>Учитывая, что два последних — это, по сути, одно и то же...
ГВ> Все они одно и то же — значение чего-то.
Я имею в виду — что ссылка _ это адрес чего-то, что указатель — это адрес чего-то
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>Вполне возможно что вместо прохода по массиву каждый раз надо было результаты вычислений закешировать или, например, использовать другие структуры данных для улучшения ассимптотики вычислений.
G>>Кстати. Твой знакомый работал и никого не беспокоило быстродействие кода, а ты в первую очередь занялся "выпрямлением интерфейсов", что сократило простор для алгоритмической или архитектурной оптимизации.
COF>Вообще, я не верю в подход — сделай как-нибудь, потом запустим профайлер и посмотрим где тормозит.
Зря. Это единственный возможный подход. В люом нетривиальном случае только профайлер может сказать где тормозит.
COF>Скорее всего, окажется, что тормоза равномерно распределены по всей программе.
Ты ни разу профайлером не пользовался? Почти всегда тормоза сосредоточены в 10% кода. Только без профайлера не узнаешь что это за 10%.
COF>Часто говорят, что о безопасности надо думать с самого начала и всегда, невозможно небезопасную программу сделать безопасной.
В большенстве случаев это верно. Вопрсы безопасности влияют на архитектуру.
COF>Вот то же самое, я уверен, можно сказать и о производительности — о ней надо думать всегда.
В большенстве случаев это неверно. Вопросы производительности, касающиеся вычислений, рекдо влияют на архитектуру.
Вопросы производительности, связанные с IO и многопоточностью, которые как раз влияют на архитектуру, "выпрямлением интерфейсов" не решаются.
Здравствуйте, COFF, Вы писали:
COF>Это культура. Если одинаково просто написать ++j и j++, for( int j = count; j-- > 0; ) и for( int j = 0; j < count; j++ ), то при прочих равных надо выбирать оптимальный вариант — это и называется избегать пессимизации кода.
Это махровое ламерство. Собственно данная беседа для меня потеряла всяческий интерес.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
S>Срок жизни такого замыкания ограничен блоком, в котором объявлена лямбда. А значит за пределами этого блока при обращении к лямбде ждет UB. Т.е. лямбду можно передать аргументом, но вернуть в качестве результата ни лямбду, ни что-то ее использующее нельзя. Как можно говорить о классическом замыкании то что работает как замыкание только в одну сторону?
в с++ лямбда может копировать контекст по значению, тогда UB отменяется.
Здравствуйте, VladD2, Вы писали:
VD>Собственно, что и ожидалось. Недолямбды в недоязыке. VD>
VD>Of course, if a lambda function object outlives local variables that it has captured by reference, you get crashtrocity.
во-первых, ето полноценные лямбды и полноценные замыкания, ты ето сам прекрасно знаешь и к чему ета клоунада "недолямбды в недоязыке" мне непонятно, во-вторых, тебе как к очередному фанату управляемой памяти вопрос, где написано что замыкания обязаны захватывать контекст по ссылке и никак иначе?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>С передачей переменных (собственно — замыканием) дело обстоит точно так же, как и с передачей фактических параметров в функции, возвратом значений, формированием объектов и т.п. То есть можно, например, создать объект, один из членов которого будет ссылаться на локальную переменную:
ГВ>
ГВ>
ГВ>Но если так сделать, то ты сам себе недобрый Буратин. Аналогичное ограничение с лямбдами.
Об этом и говорю.
S>>Т.е. лямбду можно передать аргументом, но вернуть в качестве результата ни лямбду, ни что-то ее использующее нельзя.
ГВ>Возвращать лямбду как функцию, судя по всему, тоже можно. Вот фрагменты из примеров, которые приведены по той ссылке, что я давал:
ГВ>
ГВ>function<void (int)> g = [](int n) { cout << n * n * n << " "; };
ГВ>
Нет замыкания...
ГВ>
ГВ>vector<int> a;
ГВ>vector<int> b;
ГВ>// ...
ГВ>auto prime = [](const int n) -> bool {
ГВ> if (n < 2) {
ГВ> return false;
ГВ> }
ГВ> for (int i = 2; i <= n / i; ++i) {
ГВ> if (n % i == 0) {
ГВ> return false;
ГВ> }
ГВ> }
ГВ> return true;
ГВ>};
ГВ>keep_if(a, prime);
ГВ>keep_if(b, prime);
ГВ>
И тут нет замыкания
S>>Как можно говорить о классическом замыкании то что работает как замыкание только в одну сторону?
ГВ>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>>>Еще как стаовится. Исчезает целый класс применения.
ГВ>>>Да ну? И какой же это класс? S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Редкосная демагогия. Просто противно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю. VD>Редкосная демагогия. Просто противно.
Последи лучше за собой. O'K?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
Х>>>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага). G>>Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.
ГВ>Вот это вот очень сильно бабушка надвое сказала. Всегда остаётся возможность оптимизировать передачу захватом по ссылке и одновременным контролем жизненного цикла. Собственно, это обычная техника для C++.
Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.
А shared_ptr — дополнительный оверхед к распределению памяти в куче.
Очень странная ситуация для "языка без оверхедов"
Х>>>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления. G>>Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам. ГВ>Похоже, что ты не прав. Хотя, конечно, никто тебе не запретит называть C++-ные лямбды "недолямбдами".
Ну также как другим никто не запретит называть недолямбды С++ (которых пока еще нету) лямбдами.
Здравствуйте, gandjustas, Вы писали:
G>Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.
Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
CC>>Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.
ГВ>Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
Это то о чем Вам говорил Влад. Лямбды С++ — неудобные недолямбды. Потому ими и не пользуются.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>По-моему, явление по имени "C++" нужно рассматривать в комплексе с такими штуками, как куча производителей, которые реализовывали язык, как заблагорассудится, неторопливой активностью комитета и тем фактом, что некоего единого владельца С++ нет в природе. В отличие от десятков других языков, у которых есть владелец, есть узкий круг лиц, занимающихся развитием и нет "отвязного" комитета. Я не хочу сказать, что второе — плохо, но это главным образом определяет отличия динамики развития C++ от Java, C# и иже с ними.
Да, это не плохо, что язык застрял на мертвой точке и вот уже больше 10 лет сдвинуться с нее не может. Это просто замечательно.
ГВ>Так что, как бы там что-то во что-то ни перерастало, и какими бы метафизическими свойствами C++ ни наделялся, но он как раз является плодом объёмного договорного процесса очень разных разработчиков программного обеспечения. "Какой-то там" стандарт можно принимать хоть по десять раз на дню, а такой, что удовлетворит кучу разных участников и принимается не для проформы, вырабатывать, всё же, посложнее. 10-12 лет для таких взаимодействий — не то, что мелочь, а так, цветочек понюхать не успеешь.
Ой, ну может хватит чушь молоть-то? 10-12 лет это МОРЕ времени. Посмотрите на С# и Nemerle, которых 12 лет тому назад еще и в планах не было.
Здравствуйте, criosray, Вы писали:
ГВ>>[...] но это главным образом определяет отличия динамики развития C++ от Java, C# и иже с ними. C>Да, это не плохо, что язык застрял на мертвой точке и вот уже больше 10 лет сдвинуться с нее не может. Это просто замечательно.
ИМХО, это real world и ничего больше. И потом, как видишь, ничего он не застрял. Что за манера называть синее зелёным?
ГВ>>Так что, как бы там что-то во что-то ни перерастало, и какими бы метафизическими свойствами C++ ни наделялся, но он как раз является плодом объёмного договорного процесса очень разных разработчиков программного обеспечения. "Какой-то там" стандарт можно принимать хоть по десять раз на дню, а такой, что удовлетворит кучу разных участников и принимается не для проформы, вырабатывать, всё же, посложнее. 10-12 лет для таких взаимодействий — не то, что мелочь, а так, цветочек понюхать не успеешь.
C>Ой, ну может хватит чушь молоть-то? 10-12 лет это МОРЕ времени. Посмотрите на С# и Nemerle, которых 12 лет тому назад еще и в планах не было.
Скажем так, я изложил свои соображения, почему считаю, что в данном случае 10-12 лет — не так уж и долго, как может показаться на первый взгляд. Не буду спорить с тем, что на первый взгляд 10-12 лет — это уйма времени. C# и Nemerle в данном случае не уместный пример, поскольку у этих языков есть владелец, Главные Разработчики и т.п. Стандарта ANSI, насколько я знаю, ни на тот ни на другой — нет (вот только про ECMA в данном контексте упоминать не стоит, это не смешно).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Отнюдь. Даже если в окончательную версию стандарта лямбды не войдут (что выглядит фантастично), их из компиляторов никто убирать не будет
Еще как будут, как убирали несоответствия с 98-ым стандартом.
ГВ>Поэтому с формальной точки зрения ты прав — стандарта ещё нет, и казалось бы, обсуждать нечего, но коль скоро на практике фичи в компиляторах уже есть (больше того, описание фич прямо ссылается на драфт стандарта), следовательно, утверждать, что их нет — абсурд. И следовательно, нам вполне есть, что обсуждать.
Никаких расширений пока нет. Речь идет о бэтах которые не зарелизятся до 2010 года.
Мне кажется, что включение фич из черновика стандарта является своеобразным протестом против глупого затягивания его принятия и способом подтолкнуть его принятие хоть в каком-то виде, потому как комитет давно живет ради собственного развлечения.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Есть ещё совсем ничего не подсчитывающий auto_ptr. Как минимум. G>>Семантика владения в лямбде никак не подойдет. Еще варианты есть? ГВ>Почему не подойдёт? Как по мне, так вполне подойдёт.
G>>Может всетаки уже стоит признать что в С++ в обозримом будущем не будет нормальных лямбд. ГВ>Знаешь, это очень сильное колдунство — признавать отсутствие наличествующего. "Видишь суслика? А его нет!"
Точно, ты ведь до сих пор не признаешь что нету и не будет в С++ нормальных лямбд, а в других языках есть.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Я признаю наличие в других языках других реализаций лямбд. Но я не считаю "единственно нормальной" реализацию лямбд в каком-то определённом языке, или их наборе. Например, то, что лямбды в "других" языках непременно требуют вовлечения GC я считаю изъяном их реализации, пусть и повсеместно встречающимся. Я, например, знаю, что использование лямбда-выражений не всегда требует отдельного управления жизненным циклом замкнутых переменных. Отсюда, я не думаю, что непременное привлечение GC — "нормально", т.е., сродни эталону.
А другие варианты есть? Явное управление временем жизни не подойдет, надеюсь это понятно.
Здравствуйте, VladD2, Вы писали:
VD>Для особо одаренных повторяю. Нет никакого С++0х. С++0х — это рабочее название черновика.
Камрад, от того, что ты твердишь "нету его" он не исчезнет.
Он есть, и используется. Это факт.
VD>А в "кампилирах" есть еще свойства и поддержка COM. И что с того?
Это к терапевту.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, VladD2, Вы писали:
VD>Никаких расширений пока нет. Речь идет о бэтах которые не зарелизятся до 2010 года.
Ты это интелу расскажи, а то пацаны не в курсе.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, VladD2, Вы писали:
VD>Есть он только в твоем воображении. То что кто-то использует черти что созданное на основе черновиков — это их личная инициатива. Не более того.
А Microsoft с Intel-ом и не знают, что они отсебятину несут.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, minorlogic, Вы писали:
S>>Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров. M>А ведб не все так просто. Я некоторое время размышлял над полезностью и вредом при использовании лямбд. Использование функторов и функций ненавязчиво подталкивает к обобщенному коду и переиспользованию.
Угу, об этом и речь.
M>"Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров." не всегда является достаточным аргументом, например
M>Глобальные переменные удобнее тем, что их можно использовать из любого места и не придется передавать как толпу параметров.
Глобальные переменные — это зараза ещё та, надо тебе сказать. Я когда-то (по очень синеглазой юности) сознательно приучал себя не пользоваться глобальными переменными — в противном случае сопровождаемость рискует упасть ниже плинтуса.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
G>>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен. ГВ>ИМХО, нельзя.
Обоснования?
G>>Не в библиотеках вопрос, лексическое замыкание накакими библиотечными функциями не заменишь, там нудно по-другом управлять временем жизни объектов. ГВ>Опять двадцать пять.
G>>Так действительно на С++ все глюкаво и ненадежно. ГВ>Во-во, слово в слово. Все 14 лет.
Так за 14 лет ничего не поменялось
С++ и по сей день остается языком, на котором больше всего завалено проектов было.
Здравствуйте, gandjustas, Вы писали:
M>>А ведб не все так просто. Я некоторое время размышлял над полезностью и вредом при использовании лямбд. Использование функторов и функций ненавязчиво подталкивает к обобщенному коду и переиспользованию. G> G>Ну прям мыслитель. G>Как поможет обобщенный код в процитированном примере, если SOMETHING_LOW и SOMETHING_HIGH зависят от контекста?
Буду предельно откровенен: в случае, когда SOMETHING_LOW и SOMETHING_HIGH зависят от контекста (2/3 параметров), этому коду поможет только Delete. Не знаю уж, обобщённый это будет Delete или нет.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Это действительно бета, как ты правильно заметил (вернее — CTP, я не знаю, как он соотносится с альфа/бета/RC по обычной классификации).
CTP — значит Community Technology Preview. Что по-русски значит — сделали промежуточную сборку и почти не тестируя отдали поиграться народу. То есть, это может быть даже не бэта. Это может быть продукт который еще 5 раз изменится до выхода.
Собственно я не сомневаюсь, что эти недолямбды попадут в релиз. Просто релиза не будет до конца года, а стало быть говорить в общем-то не о чем.
Если же стандарта не будет до конца года, то это будет еще одно нестандартное расширение толку от которого будет не много, так как не все захотят воспроизводить неизвестно что, что есть у МС.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, criosray, Вы писали:
G>>О как, а только пару страниц назад было утверждение что в С++ нет оверхедов. C>Все правильно: пару страниц назад в С++ не было оверхедов, но язык развивается — успел обрасти оверхедами, понимаете ли какое дело...
какие оверхеды? концепция с++: не плати за то что не используешь, в случае с с++ лямбдами исполнено на 100%, в дотнете же оверхеды на ровном месте, т.е. беспричинно, в силу его устройства.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, criosray, Вы писали:
G>>>О как, а только пару страниц назад было утверждение что в С++ нет оверхедов. C>>Все правильно: пару страниц назад в С++ не было оверхедов, но язык развивается — успел обрасти оверхедами, понимаете ли какое дело... Х>какие оверхеды? концепция с++: не плати за то что не используешь,
Да ну, а O(n) при выделении и освобождении памяти?
Х>в случае с с++ лямбдами исполнено на 100%,
На 200%, лямбд просто нету Есть только жалкое подобие.
"не плати за то что не используешь" часто оборачивается тем, что приходится слишком много платить чтобы получить фичи, которые есть в других языках.
Х>в дотнете же оверхеды на ровном месте, т.е. беспричинно, в силу его устройства.
А примеры будут? или опять пердение в лужу?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>какие оверхеды? концепция с++: не плати за то что не используешь, G>>Да ну, а O(n) при выделении и освобождении памяти? Х>здесь поподробней пожалуйста, что имеется ввиду?
Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно.
Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении.
Х>>>в случае с с++ лямбдами исполнено на 100%, G>>На 200%, лямбд просто нету Есть только жалкое подобие. Х>может ты найдёшь определение lambda в интернет и перестанешь нести ахинею?
Ты прочитай 3 предыдущие страницы. Нормальные лямбды подразумевают лексические замыкания, которых нету и не будет в С++.
Х>>>в дотнете же оверхеды на ровном месте, т.е. беспричинно, в силу его устройства. G>>А примеры будут? или опять пердение в лужу? Х>да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед.
Не разводи демагогию, давай факты.
Здравствуйте, VladD2, Вы писали:
ГВ>>Нет такой ссылки, потому что компилятор от MS ещё не продаётся. VD>Значит и обсуждать не чего.
Так и не обсуждай. Тебя кто-то заставляет?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>А что за недостатки (кроме синхронного подсчёта количества ссылок)? G>>сам по себе подстчет ссылок — не лучшый механизи. Дает оверхед по памяти и по быстродействию, не разруливает циклы, непотокобезопасны. G>>auto_ptr с передачей владения не намного лучше обычных указателей, при этом надо ими пользоваться очень осторожно и хорошо понимать что происходит "под капотом".
ГВ>OK, принято. ИМХО, самый серьёзный недостаток такого способа — потенциальные заморочки с циклическими зависимостями. Ну что же, действительно, опциональный (библиотечный) GC иной раз не помешал бы. В принципе — не помешал бы. Другое дело, что острота потребности в GC, ИМХО, невероятно преувеличена. Вот тут, честно тебе скажу, доказать ты её (острую потребность) не сможешь. Потому что придётся доказывать, исходя из субъективных моментов, а субъективно как раз таких проблем нет — C++-ники привыкли управлять своими объектами и им это вполне удаётся. Хорошим C++-никам — удаётся, а кто не умеет — тот плохой C++-ник, и к его мнению не особо прислушиваются.
Как раз таки привычки субъективны. А потребность в высокоуровневых языках в большенстве задач очень объективна.
Но при этом существует достаточно много программистов на С++ со своим субъективным мнением.
ГВ>ИМХО, потому про GC хоть и поговаривают, но не особо.
Еще раз. Не получится на C++ сделать CG с характеристиками, близкими к .NETовскому.
Сам язык должен быть рассчитан на работу GC.
Практически любая реализация GC на C++ будет вносить достаточно большой оверхед чтобы отказаться от его использования.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Ключевое слово — пул. G>>Угу, очередной "закат солнца вручную". Кроме того с пулом возникают дополнительные проблемы управления временем жизни.
ГВ>Это какие такие проблемы? Что объекты должны быть уничтожены до уничтожения самого пула? Так это — то же самое, что и общее предотвращение утечек памяти.
Опять возвращаемся к ручному управлнию памятью, никаких shred_ptr и прочего.
G>>>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. ГВ>>>Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении. G>>Угу, но работают медленно. Даже при однопоточном выделении. Блокировки небесплатные. ГВ>Ты уж определись: работают стандартные аллокаторы в многопоточном окружении или нет.
Раьотают, но медленно
Здравствуйте, Хвост, Вы писали:
MK>>Что за темы? Х>тебе дать ссылку на тему которую завёл ты сам?
Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>OK, принято. ИМХО, самый серьёзный недостаток такого способа — потенциальные заморочки с циклическими зависимостями. Ну что же, действительно, опциональный (библиотечный) GC иной раз не помешал бы. В принципе — не помешал бы. Другое дело, что острота потребности в GC, ИМХО, невероятно преувеличена. Вот тут, честно тебе скажу, доказать ты её (острую потребность) не сможешь. Потому что придётся доказывать, исходя из субъективных моментов, а субъективно как раз таких проблем нет — C++-ники привыкли управлять своими объектами и им это вполне удаётся. Хорошим C++-никам — удаётся, а кто не умеет — тот плохой C++-ник, и к его мнению не особо прислушиваются. G>>Как раз таки привычки субъективны. А потребность в высокоуровневых языках в большенстве задач очень объективна. ГВ>Приехали. C++ — высокоуровневый язык. Или вы хотите поговорить о DSL? Ну давай, поговорим про DSL.
С++ очень низкоуровневый по сравнению с современными языками.
G>>Но при этом существует достаточно много программистов на С++ со своим субъективным мнением. ГВ>Если мнения этих программистов хватает, чтобы решать поставленные задачи, значит, потребность в языках местами преувеличена, т.е., не всегда объективна. Сам понимаешь, материя "потребности" тонкая, весьма зависимая от "интеграла по субъективным суждениям".
Ну ты страшный бред говоришь. Это примерно как думать что не нужны машины, потому что лошадей хватает решать задачи.
ГВ>>>ИМХО, потому про GC хоть и поговаривают, но не особо. G>>Еще раз. Не получится на C++ сделать CG с характеристиками, близкими к .NETовскому. G>>Сам язык должен быть рассчитан на работу GC. G>>Практически любая реализация GC на C++ будет вносить достаточно большой оверхед чтобы отказаться от его использования. ГВ>Не совсем так. Дело в том, что GC для C++ не должен решать задачи управления абсолютно всеми объектами и никто ничего такого и не предлагает. Но для каких-то отдельных моментов он вполне может оказаться приемлемым решением, лучшим, чем reference counting. Ключевое слово: "какие-то отдельные моменты".
Ну а тепереь давай точнее. Как будет происходить разделение между управляемыми GC объектами и остальными? Какие это даст преимущества?
Здравствуйте, gandjustas, Вы писали:
ГВ>>Почему? Самое обыкновенное управление модулями в программе на C++. В числе прочих, фаза завершения работы модуля может включать и очистку статических (глобальных) указателей. G>Ох ё....
А по сути?
ГВ>>То есть, "нормальная" в твоей терминологии работа — это работа без блокировок, я прав? G>Правильная работа — это когда не надо думать выделять память или нет.
Понятно. Всё, что не C# — неправильно. Так бы сразу и сказал.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
Х>>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода? MK>Легко. Эти структуры размещаются не на стеке, а в полях класса, который и лямбду оборачивает.
Х>>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода? S>Структуры, являющиеся контекстом лямбды изначально расположены не на стеке, а в хипе вместе со всем контекстом лямбды. Потому боксинга здесь нет.
эээ, ребят, вы таки определитесь как оно работает
Здравствуйте, gandjustas, Вы писали:
COF>>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. G>Осмысленное в твоем понимании — ручное?
Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>Здравствуйте, gandjustas, Вы писали:
G>>>>А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер? Х>>>даа, вся программа состоит из аллокаций в хипе, такую ещё поискать надо, а как же твои незабвенные 10% кода отнимают 90% ресурсов? или ето не распространяется на высоконагруженные сервера? G>>Не путай. 10% кода выполняются 90% времени в вычислтеьных задачах. G>>При высоких нагрузках надо оптимально управлять ресурсами. Х>ну вот, пошли уточнения про вычислительные задачи а уж если надо оптимально управлять ресурсами то использовать C++ ето сам бог велел.
И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)?
G>>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего. Х>да что же ты будешь делать, повторяю, три раза: контекст может копироваться, копироваться, копироваться. Х>т.е. в лямбду скопируется значение переменной на стеке Х>для закрепления: Х>копироваться может контекст Х>не только по ссылке а и по значению Х>копироваться Х>контекст Х>по значению Х>запомнил?
Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
Х>>>>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность G>>>>Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету. Х>>>я рад за тебя что у тебя нет проблемм с производительностью, а в коде над которым я работаю нет утечек памяти, и явные delete можно пересчитать по пальцам, и что? G>>И кто же память освобождает? shared_ptr, так они оверхед создают... Х>ух-хаха, я вообще не использую shared_ptr, представляешь? удивительно, да?
И что же ты используешь?
G>>А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed. Х>есть статистика, что на десктопах пользователей подавляющее большинство приложений — unmanaged, ето на мой взгляд самая лучшая статистика.
Эта статистика очень слабо связана с техническими аспектами. Обсуждали уже сотню раз.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего.
ГВ>Да ёлки ж зелёные! Значения (синоним в данном контексте: копия переменной) плюсовыми лямбдами замыкаются с лёгкостью неимоверной. А дальше — хоть выводи функцию из скопа, хоть прихлопывай.
Нет. Нужно лексическое замыкание (не копирование значения).
Здравствуйте, gandjustas, Вы писали:
ГВ>>Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую) G>Не надо такие умные слова говорить. Говори честно — копирование значения. Копирование лексическим замыканием не является.
Расскажи это лисперам. В лиспе исторически замыкания создавались копированием используемых переменных.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
COF>>>>Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки S>>>Что, программы на дотнете ни разу не ездят впринципе? COF>>Медленно и печально G>От чего такая уверенность? G>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать)
тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает
Здравствуйте, gandjustas, Вы писали:
ГВ>>Да ёлки ж зелёные! Значения (синоним в данном контексте: копия переменной) плюсовыми лямбдами замыкаются с лёгкостью неимоверной. А дальше — хоть выводи функцию из скопа, хоть прихлопывай. G>Нет. Нужно лексическое замыкание (не копирование значения).
"Лексическое замыкание" — это обобщённое название всей операции объединения лямбда-выражения и переменных контекста, в котором порождена лямбда. Копирование значений — способ реализации.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) Х>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает G>>20 тысяч векторных примитивов с прозрачностью? Х>круто, да?
Слабо верится.
Здравствуйте, VladD2, Вы писали:
ГВ>>Расскажи это лисперам. В лиспе исторически замыкания создавались копированием используемых переменных.
Ну, поскольку я знаю твою манеру ведения дискуссии, то обращаю внимание на слово "исторически". А если точно, то я отсылал к common lisp чёрт-те какой давности. В современных диалектах, AFAIK, это уже не так.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую, тут даже такая вещь как проверка индекса на допустимый диапазон при обращению к массиву даёт проседание в 30%, куда здесь C# тулить? MK>Ой да ладно. Ты пробовал или снова "боксинг"?
что да ладно? про индексы ето факт, если ты про C# то ессно не пробовал, потому как не взлетит очевидно.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Координатная система тоже 25 раз в секунду меняется? Х>не понял что имелось ввиду. Координаты подавляющего большинства примитивов хранятся всегда в неизменном виде, и их при каждом скролле или зуме необходимо пересчитывать в екранные координаты.
Вообще OpenGL и сам умеет пересчитывать координаты, правда только афинные и почти афинные преобразования, те что можно описать матрицей.
Знаю, что хранятся другие координаты, например, геодезические. Но, их ведь можно преобразовать единожды при чтении в "почти экранные", т.е. в такие координаты, которые легко преобразуются как GDI так и OpenGL-ем. Естественно, все операции с координатами следует проводит с оригинальными координатами, а "почти экранные" хороши для рендеринга. Тогда преобразование координат (кроме первоначального) полностью ляжет на железо.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Знаю, что хранятся другие координаты, например, геодезические. Но, их ведь можно преобразовать единожды при чтении в "почти экранные", т.е. в такие координаты, которые легко преобразуются как GDI так и OpenGL-ем. Естественно, все операции с координатами следует проводит с оригинальными координатами, а "почти экранные" хороши для рендеринга. Тогда преобразование координат (кроме первоначального) полностью ляжет на железо.
Х>абсолютно верно, но ето к сожалению шило на мыло, потому как видимых елементов на екране на порядок/порядки меньше чем есть на самом деле, а для возможности акселлерации прийдётся их трансформировать все, а не только видимые, в случае с GDI ето просто смертельно. Что немаловажно, постоянные трансформации вносят ошибки, поетому оказалось проще и еффективней реализовать схему которая есть.
На самом деле, мы уже выбились из темы и перешли к деталям реализации GIS-ов.
Но я отвечу.
Порядки не важны, т.к. есть набор видимых элементов, который обновляется в зависимости от позиции и масштаба вьюхи. Есть эффективные алгоритмы пространственного индексирования объектов, которыми можно пользоваться для того, чтобы читать только те объекты, которые требуется отображать. Потому ни трансформировать все объекты ни читать их в память для отрисовки не обязательно. Те что прочитаны — трансформируются один раз софтом в промежуточную систему координат, все остальные разы железом.
Постоянные трансформации не могут вносить ошибки если эти трансформации не туда-обратно. Всегда есть правильные (родные координаты объекта) и все остальные, полученые из них. Вся логика типа кадастра работает с родными координатами, либо непосредственно полученными из родных.
А отрисовке — пофик на точность. Там на пиксель набежит больше любой погрешности.
Х> G>И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)?
Х> пул потоков обычно нативный, причём здесь С++? зелёные треды очень хороши для серверов, ага)))
Они гениальны для серверов. Erlang это только доказывает. Возможность ненапряжно выделить несколько тысяч процессов/потоков, если надо, рулит
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, samius, Вы писали:
S>>Но и эффект будет не тот, как в рендеригне без мапинга изображения. В GIS случаются немонотонные заливки, там важны толщины и структуры линий, значки (иконки). Все это поплывает при аффинном мапинге кэшированного изображения.
M>Скорее всего ты неправильно меня понял.
Похоже на то
M>>>1. Данные мапятся на плоскость треугольника единожды и кешируются.
M>Имелось ввиду не кеширование растра , а кеширование спроецированных данных. GIS Data(Vector data(lat lon)) -> Projection Data(Vector data) M>Projection Data — может быть и Equiretangular а может и на сферу.
Теперь кажись понял. Но тут мы получаем дополнительную задачу разбиения примитивов по треугольникам с разными преобразованиями. Например, если взять полигон-контур России, то он размажется по многим треугольникам, аппроксимирующим эллипсойд. Сразу получим проблему стыков частей такой фигуры по границам аппроксимирующих треугольников. Без введения дополнительных точек не представляю как решать.
Нужен gluTess, либо своя реализация теоретико-множественных операций над точками, ограниченных контурами полигонов. Решается. Да и порядочный GIS должен иметь такую штуку в арсенале.
M>А кешированеи отрендренной текстуры на треугольник это допольнительная фича, так сказать по требованию. Напрмиер при быстром показе мы может отрисовать закешированный растр и потом когда будет время отрендрить заново с лучшим качеством.
Угу. Пойдет в качестве "быстрого" варианта.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. CC>Ты пожалуйста ссылку дай на стандарт С++, где написано что именно так работает "стандартный аллокатор С++".
Стандарт C++ не определяет реализацию выделения памяти. Во всех известных мне реализациях С++ работает именно так.
G>>Не разводи демагогию, давай факты. CC>Симметрично!
Я уже приводил код, где GC работает быстрее алокатора С++.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Расскажи это лисперам. В лиспе исторически замыкания создавались копированием используемых переменных.
ГВ>Ну, поскольку я знаю твою манеру ведения дискуссии, то обращаю внимание на слово "исторически". А если точно, то я отсылал к common lisp чёрт-те какой давности. В современных диалектах, AFAIK, это уже не так.
Демагог, есть демагог. Нет никакого исторического наследния CL. CL — это стандарт вышедший таким каким он есть.
И вообще, твои слова банальная демонстрация некомпетентности. Лисп изначально имел сборщик мусора и стало быть делать урезанные в нем не имело никакого смысла.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, CreatorCray, Вы писали:
CC>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока.
Кстати с явным Free тоже бльшая попа. Все это придется оборачивать в очередные умные указатели чтобы не было утечек.
Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий.
Здравствуйте, gandjustas, Вы писали:
Х>>Ну как, "мы наш, мы новый мир построим", HeapAlloc + ручное управление памятью, указатели, MyMemMgr.alloc() етц, только пользовать ето будет сложнее, смартпоинтеров то нет G>Ты прикалываешься или реально тупость говоришь? G>1)HeapAlloc работает медленнее, чем GC G>2)Даже если выделишь память с помощью unmanaged, то ты не сможешь создать .NET объект в ней. G>3)Ты не сможешь хранить ссылки на managed объекты в таком блоке памяти.
я разве где-то утверждал обратное? а то что будет нелегко (пункты 2, 3) так етож C#, он такой)
G>В итого это не будет ни быстрее, ни надежнее. Если ты серьезно считаешь что таким вообще стоит заниматься в каком либо случае, то тебе надо срочно обратиться к доктору.
менежмент руками будет быстрее, надёжнее или нет — ето больше радиус кривизны рук решает.
я считаю что таким действительно не стоит заниматься, C# для етого не предназначен, он высокоуровненвый и медленный, хочешь высокоуровневый и быстрый — бери С++.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Приведи парочку компиляторов С++ промышленного качества, в которых аллокация по кардинально другом алгоритму делается. ГВ>При чём тут компиляторы? Управление памятью — это библиотеки.
new и delete — часть языка. Неважно через что они реализуются.
CC>>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>>Значит уже забыл. Пулы интересуют еще меньше, так как они требуют подгонки размеров блоков и пулов. G>>Как аллокатор общего назначения использовать смысла нету. ГВ>Что за вздор?! Чацкий прямо:
"Вон из Москвы, сюда я больше не ездун... не ездец... не ездюк..., тьфу сюда я я больше ни приеду".
А по сущству есть что сказать? Или ты честно считаешь что в своем проекте будешь вмеесто стандартных new, delete и всего что с ними связано применять тот код, который привел CreatorCray?
Здравствуйте, VladD2, Вы писали:
VD>Пока в С++ не будет введено понятие "управляемого GC указателя/ссылки" ничего путного в С++ сделать не удастся. Только не строгий GC который крайне не практичен.
Мне пока видится, что возможный GC для C++ должен быть сопряжён с каким-то особым указателем, вроде gc_ptr<T>. В любом случае использование обычных указателей C++ будет отличаться от использования GC-указателей.
VD>Проблема проста до банальности. С++ спроектирован в расчете на то, что адреса в указателях неизменны. А качественный GC предполагает, что как раз таки объекты можно перемещать, а значит их адреса изменятся. [...]
VD>Пример доработки С++ — это C++/CLI и Menaged C++. Там были введены специальные типы указателей которые описываются в метаданных и контролируются рантаймом. По другому никак.
Согласен, что это подходит в качестве примера подключения GC к C++.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Даже если какие-то там фины умудрились написать книжку про промежуточную версию CL в которой и правда замыкания не были реализованы до конца — это никак не говорит в пользу того, что это правильный подход.
Да меня не волнует, правильный это подход или нет. Я за что купил, за то продаю — вот такие сведения у меня есть, ты их можешь принять во внимание или послать подальше — твоё право. Более надёжных источников, относящихся к тому периоду у меня нет.
Здесь два соображения. Первое — что какими бы "какими-то" эти финны ни были, но их книга издана и в Финляндии, и в СССР. Второе — что описанный подход вполне соответствует идее об устранении побочных эффектов (чистоты) в функциональных программах. По-моему, вполне достаточные основания считать, что подобная реализация замыканий имела место быть в определённом историческом периоде и можно даже допустить, что серьёзно обсуждалась в качестве "правильной".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>>>Приведи парочку компиляторов С++ промышленного качества, в которых аллокация по кардинально другом алгоритму делается. ГВ>>При чём тут компиляторы? Управление памятью — это библиотеки. G>new и delete — часть языка. Неважно через что они реализуются.
Именно. А реализуются они библиотечными функциями. new/delete — конструкции языка, а то, что под ними лежит на самом деле — вопрос библиотек.
G>А по сущству есть что сказать? Или ты честно считаешь что в своем проекте будешь вмеесто стандартных new, delete и всего что с ними связано применять тот код, который привел CreatorCray?
Если мне приспичит подменить реализацию всех new/delete я просто заменю RTL-ные malloc/realloc/free. Это первый вариант. Второй вариант — переопределю глобальные new/delete. Третий вариант — определю нужные new/delete для необходимых классов. И ты знаешь, во всех этих случаях даже shared_ptr останутся работоспособными. Непосредственно ThreadPoolAlloc::Alloc/Free само собой, я везде писать не буду.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
CC>>>>>Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"? G>>>>Еще раз: все известные мне реализации так работают. CC>>>Мы о С++ либо об известных тебе реализациях? G>>Думаешь я мало компиляторов видел? CC>Ты с темы не съезжай.
Это ты не съезжай. Кивать на стандарт в случае С++ не стоит. Его мало кто реализует.
G>>>>Твой наколенный непотокобезопасен. CC>>>Можно узнать с какого перепугу ты так решил? CC>>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>>Значит уже забыл. Пулы интересуют еще меньше, так как они требуют подгонки размеров блоков и пулов. CC>Ясно. Как работают пулы ты тоже не в курсе. CC>Известно ли тебе что HeapAlloc в LFH режиме тоже на пулах?
Еще раз: меня это вообще не интересует.
G>>Как аллокатор общего назначения использовать смысла нету. CC>Расскажи это разработчикам Hoard, TBB и того же Windows Heap
А это тут причем? Ты будешь на задумываясь использовать свой аллокатор в продакш коде?
Кстати, получилось что GC порвал в 5 раз виндовый аллокатор, который на пулах, так?
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
CC>>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>>Кстати с явным Free тоже бльшая попа. Все это придется оборачивать в очередные умные указатели чтобы не было утечек. CC>А вот ты никак не можешь прожить без того, чтоб за тобой кто нить не прибирал твои выделения. CC>Никакой попы там нет. Работает простой жизненный принцип: убирай за собой. Это нормально.
Не смеши. Если это нормально, то почему сейчас такое засилие "умных указателей"? Как раз для того чтобы програамист не думал что и когда ему надо убирать.
G>>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий. CC>Каких усилий? CC>Все потери на твоем С++ тесте исключительно в системной функции HeapAlloc. CC>Это многопоточный аллокатор общего назначения. Синхронизация в нем через критическую секцию, что медленно. CC>Пул в моем аллокаторе постольку поскольку, меня больше интересовало насколько будет быстрее если убрать тормоза критической секции.
Ты до сих пор не понял что создание таких аллокаторов — нетривиальная задача. Далеко не каждый программист сможет справиться. В тоже время GC работает достаточно быстро, а программисту при этом даже не требуется заботиться об освобождении памяти.
Здравствуйте, samius, Вы писали:
S>Насколько я понимаю, interlocked add работает только для одноядерной машины. И то я не уверен... Тут надо курить семантику освобождения. На многоядерной машине и intelocked не нужен. Просто add. Ну и проверка на достижение границы 256Kb куска.
Вааааау!
Всё совсем наоборот.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Q>>Как на C++ реализуется перемещающий менеджер памяти? CC>Можно. Но с заменой указателей на обёртки...
Я правильно понимаю, что:
1) Такой менеджер нельзя внедрить прозрачно — сломается код как твоей библиотеки, так и пользовательский код.
2) Увеличится расход памяти на каждый указатель.
3) Добавится лишний уровень косвенности при вызове.
4) Ухудшится cache locality, как пространственная, так и временная?
Насколько просто будет реализовать такую обёртку, с корректным учётом квалификаторов const и volatile и их комбинаций?
CC>...и вводом ограничений на использование сырых указателей.
Это как? Написать в хэдере комментарий «Сырые указатели — ни-ни!»
Обычные ссылки тоже нельзя будет использовать? И функции, принимающие что-нибудь по ссылке (на константу)?
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, samius, Вы писали:
S>>Насколько я понимаю, interlocked add работает только для одноядерной машины. И то я не уверен... Тут надо курить семантику освобождения. На многоядерной машине и intelocked не нужен. Просто add. Ну и проверка на достижение границы 256Kb куска. CC>Вааааау!
CC>Всё совсем наоборот.
Ну тогда уж просвети, кому нужно наоборот, если
В многопроцессорной системе поколение 0 управляемой кучи разделено на несколько арен памяти — по одной на каждый поток. (С) Рихтер. CLR via C#
VD>Спорить с тем, что есть можество разных реализаций языка которому 50 лет я не буду. К не буду спорить о том, что если в языке есть императивное присвоение и замыкания, то полноценным замыканием будет только то, что позволяет изменять захваченые переменные из замыкания.
Что-то я логики не понимаю относительно "полноценности". Один из самых популярных сценариев замыканий — это просто карринг, некая "параметризация" ф-ии. И вот мы, типа, параметризировали ф-ию одним из аргументов, а потом, ввиду передачи этого параметра по ссылке, можем получить абсолютно непредсказуемые эффекты в моменты вызова этой ф-ии. Что, собственно, частенько и происходит. Где уж тут полноценность? ИМХО, полноценность — это когда мы можем явно указать требуемую семантику, и сдается мне, что семантикой по-умолчанию должна быть, разумеется, byvalue, как наименее "граблястая".
V> По C++ : Не слушайте тех, кто пытается его похоронить, глупости это все субъективные. Съездите на конференцию "Параллельные вычисления"(можете заглянуть на parallel.ru), там мужики и не знают наверное, что есть языки другие, кроме C++.
NBN> M>Так как оба языка Тьюринг-полные, то сомнительно
NBN> Языки то да. А костыли для шарпа не везде есть и не везде подходят. NBN> См. те же игры, ембеддед/мобилы/покеты и кроссплатформенное программрование.
Здравствуйте, Mamut, Вы писали:
NBN>> M>Так как оба языка Тьюринг-полные, то сомнительно
NBN>> Языки то да. А костыли для шарпа не везде есть и не везде подходят. NBN>> См. те же игры, ембеддед/мобилы/покеты и кроссплатформенное программрование.
M>Во всем этом есть .NET и, следовательно, C#.
Гы.гы.гы. Либо не везде, либо реальное использование сопровождается множеством оговорок
Как следствие — С++ монополист и надолго им останется.
Здравствуйте, criosray, Вы писали:
C>Ответьте на этот вопрос:
C>
C>Ну хорошо, расскажите тогда что в С++ "немного по другому", что программам на С++ нет пользы от автоматического тестирования. Внимательно Вас слушаю.
Вопрос стоит вовсе не так, и я дважды пытался поправить постановку вопроса. Видя твою невнимательность, мне крайне неохота что-либо объяснять, ибо опять может уйти в космос... Тем не менее, для истории:
Программам на С++ есть такая же польза от автоматического тестирования как и всем остальным. Мало пользы лишь от того способа организации тестирования, какой реализован в моковских фреймворках. Я не буду утверждать, что сэмулировать на С++ аналогичный подход к организации автоматического тестирования невозможно, но я точно могу утверждать, что такое вложение труда совершенно неразумно, т.к. не окупится. Поэтому автоматизируют тестирование путем тесного совмещения юнит, интеграционных и регрессионных тестов, для С++ это должно быть в одном флаконе, иначе толку совсем мало на выходе.
Основное отличие в том, что нативный код — это черный ящик. Например, у нас результатом компиляции явилась некая DLL в которой одна точка входа "GetPlugin", и через эту точку входа доступна функциональность некоего плагина, заметь, самый высокий уровень функцинальности, где класические юнит тесты закончились еще на пару уровней ниже. А сам этот некий плагин в исходниках состоит из где-то трех сотен классов, которые тоже охота погонять на тестах, начиная от юнит, и заканчивая интеграционными, но раздельного доступа к этим классам в этой ДЛЛ, понятное дело, нет. И вот специально для тестов собирают совсем другой бинарный образ(ы), вовсе не такой, какой пойдет в релиз. В этом бинарном образе содержится некий тестовый фреймворк (ииногда самописный, но и сценарии применения С++ не в пример богаче, чем у управляемых платформ), и некий тестовый код, осуществляющий вызовы тестируемых классов/функций внутри этого тестового бинарного образа.
Таким образом, в подавляющем большинстве случаев на С++ в юнит-тестах тестируется по-сути исходный код, скомпиллированный в тестовый бинарник с некими тестовыми эмуляторами и прочей хернью. Учитывая, что в С++ имеется помимо полиморфизма на виртуальных ф-иях еще и "шаблонный полиморфизм", то скомпиллированный тестовый бинарный вариант некоего класса может иметь вообще мало общего с им же в целевой сборке.
-------
А вообще, я ведь не настаиваю, просто рассказываю как дела обстоят в других областях.
Здравствуйте, criosray, Вы писали:
V>>Я даже не знаю на что отвечать, настолько ты не понимаешь о чем речь.
C>Ответьте на этот вопрос: C>
C>Ну хорошо, расскажите тогда что в С++ "немного по другому", что программам на С++ нет пользы от автоматического тестирования. Внимательно Вас слушаю.
C>Даю слово, что приложу максимум усилий, чтоб понять о чем речь.
Да... Боюсь, что усилий придётся прикладывать много. Но я тебе подскажу. Сначала обрати внимание на то, что ты сам придумал тезис, текст которого я отметил полужирным шрифтом, в сообщении vdimas его не было. Ну а дальше, думаю, всё просто.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, vdimas, Вы писали:
VD>>Спорить с тем, что есть можество разных реализаций языка которому 50 лет я не буду. К не буду спорить о том, что если в языке есть императивное присвоение и замыкания, то полноценным замыканием будет только то, что позволяет изменять захваченые переменные из замыкания. V>Что-то я логики не понимаю относительно "полноценности". [...]
Парадоксально, что как раз иммутабельность переменных (и её вариация — замыкание byvalue) нередко подаётся апологетами ФП как несомненное преимущество. Вот и думай тут, где истинные ФП-шники, а где — падшие вероотступники.
P.S.: В прочем, конечно, если смотреть на "парадигму ФП" как на ещё один вариант "anything but C++", то... То всё как всегда.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
NBN>>И то и другое неполный отстой, даже близко не являющимся решением реальных проблем.
C>Понятно... еще один неграмотный тролль. Вы даже сформулировать не сможете в чем заключается неполнота.
Ты со своей религией продолжай минусики расставлять, авось полегчает
NBN>>С++ тут монополист, это факт. Твои минусы это не испраят
C>Да-да, именно по тому у меня из 10 приложений на мобилке почти половина на .NET CF.
По сути группа поклонников не самого популярного языка доказывает группе поклонников другого не самого популярного языка, но примерно равному по популярности, что язык противников тухлый.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>А моки вообще не в почете?
V>Что-то слишком много чести им в последнее время... Хотя до сих пор наиболее популярные во всем мире моки — это ручные моки, они же заглушки и этому способу тестирования учат у нас вроде на 3-м курсе.
Моки и заглушки — разные вещи, использующиеся в разных сценариях тестирования.
V>Просто надо четко понимать, что автоматически-генерённые моки — это костыль по сути, для ситуаций чудесного дизайна, когда одно гвоздями прибито к другому. А так, там где можно обойтись в юнит-тестах классичесскими ассертами — это и синтаксис нагляднее, и проще поддерживать.
V>У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась. Так что лично мне они как стразы на ж-пе, модно, но не практично.
Разве речь о Вас в совокупности с тупым диспетчером сообщений?
Здравствуйте, criosray, Вы писали:
V>>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
C>Пример классического ламеризма. Может стоило бы для начала что-то узнать о предмете обсуждения? Например, что версия CLR все еще 2.0.х, а не 3.0
Насколько я понял, ты просто не в курсе какие тут шли обсуждения сразу после выхода второго фреймворка. Порой заносило даже весьма уважаемых мною коллег (уажаемых за то, что их обычно не заносит). А ламеризм — это когда читают оппонента, и при этом десятое сообщение подряд совершенно не втыкают, о чем речь... Речь о том, что мы все унутренне готовились к несколько другому развитию событий, а оно вишь как вышло — застряли малость.
И вот это твое замечание насчет версий фреймворков... неожиданный ход, прямо скажем.
Я только не понял, какую мою мысль должен был опровергнуть твой выпад, не пояснишь нам, убогим?
Здравствуйте, criosray, Вы писали:
V>>Просто надо четко понимать, что автоматически-генерённые моки — это костыль по сути, для ситуаций чудесного дизайна, когда одно гвоздями прибито к другому.
C>С точностью до наоборот — нормальные моки и стабы генерируются автоматически. т.к. автоматическая генерация исключает возможность допустить ошибку или не учесть чего-то.
Расшифруй, пожалуйста, слово "нормально" и слово "автоматически", а так же набор возможностей этого "автоматически".
V>>А так, там где можно обойтись в юнит-тестах классичесскими ассертами — это и синтаксис нагляднее, и проще поддерживать. C> C>Вы вообще не понимаете что такое юнит-тесты. Не надоело показывать неграмотность?
А да, что такое юнит-тесты требуется еще и понимать... Не надоело рефлексировать и показывать в очередной раз свой поверхностный взгляд? Все твои вызовы мокков ради ассертов, собственно и сделаны. И хоть они теперь не в фас, а в профиль — они были и есть цель любого автоматического теста (не обязательно юнит...)
V>>У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась.
C>Перечень того, что не возможно сделать средствами RhinoMocks + xUnit в студию, как говорится.
Любую динамическую среду/заглушки, которые генерят переменный по насыщенности траффик или сообщения с разной задержкой и произвольным наполнением. Фишка в том, что реальных задержек-то и нет, текущее время эмулируется, но тестирующая последовательность слишком длинная, чтобы записывать её ручками, она генерируется программой. А таких последовательностей/программ у меня — мама не горюй.
Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое.
А теперь смотри что получается: автомоками удобно пользоваться для оформления относительно несложных тестов, где внешние условия и реакцию на них вполне можно описать декларативно и синтаксис все еще не будет раздражать. Т.е. типа, сказали ему "открой рот", убедились что рот открыт, далее "скажи А", убедились, что сказал А. Не много ли чести для подобной возни? У меня в одном методе юнит-теста дружно открывают рты сразу два десятка подобных объектов. Найди мне смысл оформлять отдельный юнит-тест, если затраты на оформление сравнимы со сложностью теста. Тоже самое с автомоками, я слишком часто вижу, что их используют в тех самых случаях, где одно-дву-строчного Assert из nUnit более чем достаточно.
Ах да, чуть не забыл... разумеется без них практически никак, если у кого-то был неудержимый понос на Ынтерфейсы в период дизайна. Собственно для них в первую очередь оно и есть.
Здравствуйте, criosray, Вы писали:
c> Откройте для себя .NET CF и Mono.
Вот тут все про моно да про моно. Но хоть бы кто-нибудь показал мастер-класс на оном, а то складывается впечатление, что его защитники видели его только на картинках, а те, кто его пользовал, молчат, дабы не было стыдно.
Здравствуйте, criosray, Вы писали:
V>>Не надоело рефлексировать и показывать в очередной раз свой поверхностный взгляд? Все твои вызовы мокков ради ассертов, собственно и сделаны. И хоть они теперь не в фас, а в профиль — они были и есть цель любого автоматического теста (не обязательно юнит...) C>"Все твои вызовы мокков ради ассертов, собственно и сделаны" — это напоминает генератор цепей Маркова. Взять два умных слова, и связать их между собой связующими. Получается билеберда, но звучит вроде как умно для стороннего человека.
C>Так вот, ликбез: мокинг выполняется с целью изолировать тестируемый объект от внешних зависимостей.
Ух ты! А я-то думал, что мокинг нужен для отслеживания последовательности внешних вызовов.
C>Пример мокинга:
C>
C>Что означает, что ожидается, что будет вызван databaseManager.BeginTransaction(), а потом в любом порядке будут вызваны Withdraw и Deposit.
C>Ассерты это всего-лишь предикат, который по-определению всегда true.
C>Assert.Equals(10, someObj.SomeIntProperty); C>Assert.IsTrue(someObj.SomeBoolProperty); C>и т.д. и т.п.
А по-твоему, Expect — это не тот же самый Assert в профиль? Assert — утверждение, Expect — утверждение о некотором ожидаемом событии. Тот же Assert, только специализированный.
C>Ассерты и моки не цель. Это средство и ключевой механизм реализации юнит тестов.
Любое автоматическое тестирование сводится к проверке последовательности утверждений. Иначе оно совсем не нужно. Дальше только вариации способов записи этих утверждений. vdimas прав в том смысле, что если логика достаточно сложная, то и полные тесты достаточно трудно записывать. Вот тебе простейший пример (псевдокод):
{ Тестируемый код }
if (incomingMessage(channel0) is Message1)
sendMessage(channelA, MessageA);
else
{
sendMessage(channelX, MessageX);
sendMessage(channelB, MessageB);
}
{ приблизительный код теста }
when(incomingMessage(channel0) is Message1)
{
check(sentMessage(channelA, MessageA))
}
else
{
check(sentMessage(channelX, MessageX))
check(sentMessage(channelB, MessageB))
}
То есть нужно проверить, что указанные сообщения ушли по заданным каналам, и только после определённого входного сообщения, и только в указанной последовательности, а потом ещё и желательно выдать осмысленное сообщение об ошибке. И получится, что сложность (словарь, длина и т.п.) теста объективно сопоставима со сложностью тестируемой программы, и это даже от языка не зависит. Добавить диагностику — и получится вообще превышение сложности.
Но собственно, я отклонился. Так вот, по сути дела всё, что делает тест — проверяет соответствие программы сложному утверждению, включающему, в том числе, утверждения о последовательности событий. Так что, формально vdimas прав по части assert-ов.
C>При чем тесты ни коим образом не захламляют код. Все тесты находятся в отдельной сборке, которая "видит" (и только она одна) внутренности тестируемых сборок.
Очень рад за вас.
V>>>>У нас в последней системе в центре тупой диспетчер сообщений, и все тупо шлют в систему сообщения, никто ни о ком не знает... что по одиночке, что в любой комбинации прекрасно все тестируется, и произвольные тестовые заглушки прекрасно пишутся с логикой произвольной сложности, которая автомокам и не снилась.
C>>>Перечень того, что не возможно сделать средствами RhinoMocks + xUnit в студию, как говорится. V>>Любую динамическую среду/заглушки, которые генерят переменный по насыщенности траффик или сообщения с разной задержкой и произвольным наполнением. Фишка в том, что реальных задержек-то и нет, текущее время эмулируется, но тестирующая последовательность слишком длинная, чтобы записывать её ручками, она генерируется программой. А таких последовательностей/программ у меня — мама не горюй. C>Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests.
Это зависит от того, что в данной конфигурации полагается модулем, а что — интеграцией. Поскольку структура любой сложной программы иерархическая, то модуль на одном уровне — это сборная конструкция на другом.
C>При чем ничего невозможного в реализации этого нет — описанное реализуется элементарно в .NET.
А разве кто-то говорил, что такое тестирование невозможно реализовать средствами .Net? Вопрос в автоматической генерации.
V>>Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. C>Элементарно средствами RhinoMocks.
И неужто будет проще, чем аналогичная заглушка? Это если учесть, то заглушка реализуется в естественном синтаксисе, а мок — перехватом вызовов. Второе будет почти гарантированно сложнее.
V>>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое. C>Демагогия.
Боюсь, что реальность. Хотя я в курсе, разумеется, что самая надёжная основа своей позиции — искусное отрицание очевидного.
C>Выглядит преотлично. На много лучше, чем то, что у вас есть (а точнее нет) в unmanaged C++. lambda выражения и fluent interface дают прекрасную читабельность.
C>
Можно подумать, что в документации приводят сложные нечитабельные примеры. Наверное, там ещё должны были написать о нерешённых проблемах, в том числе — фундаментальных.
V>>А теперь смотри что получается: автомоками удобно пользоваться для оформления относительно несложных тестов, где внешние условия и реакцию на них вполне можно описать декларативно и синтаксис все еще не будет раздражать. C>Модульные или unit тесты ОБЯЗАНЫ быть несложными. В этом их СУТЬ.
Угу. А ещё программы должны быть простыми. Это и называется искать решение сложных проблем простыми средствами, сиречь — руководствоваться лозунгами.
V>>Ах да, чуть не забыл... разумеется без них практически никак, если у кого-то был неудержимый понос на Ынтерфейсы в период дизайна.
Собственно для них в первую очередь оно и есть. C>Нет, не для них. Вам не надоело ламерствовать?
Это тебя регулярно заносит в область квадратуры круга циркулем.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, IID, Вы писали:
IID>P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить.
И тебе подсказка: код на промежуточном языке компилируется при первом вызове, после чего скорость его исполнения в определенной степени перестаёт зависить от "выполнения некоторой С++ программы".
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
G>>Самообман — думать что C++ всегда быстрее.
IID>Можно пример программы на .NET, которую невозможно будет обогнать программой на С++ ? Желательно не скатываться на I/O, т.к. в этом случае будем мерять скорость работы сервисов ОС, и отставание .NET станет менее заметным. Под программой на С++ понимаем любой код, компилирующийся современным С++ компилятором, и дающий аналогичный результат работы.
IID>P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить.
Пример не приведу, ибо очень большо получится. Но основная суть в том, что в .NET можно генерировать код в рантайме.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, IID, Вы писали:
IID>>P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить. MK>И тебе подсказка: код на промежуточном языке компилируется при первом вызове, после чего скорость его исполнения в определенной степени перестаёт зависить от "выполнения некоторой С++ программы".
Отвечу в этом месте обоим: JIT связан по рукам и ногам временными ограничениям. У С++ компилятора свободы (времени) гораздо больше. Насколько я понимаю, кода никто не приведёт, и можно засчитывать слив ?
Здравствуйте, Mamut, Вы писали:
MK>> Например, "WikiPedia uses Mono for its search facilities. The indexing and the actual searching is done by Mono-based applications". M>Уже нет. Уже Java + Lucene
Мотороллер не мой
Здравствуйте, Геннадий Васильев, Вы писали:
V>>>Не надоело рефлексировать и показывать в очередной раз свой поверхностный взгляд? Все твои вызовы мокков ради ассертов, собственно и сделаны. И хоть они теперь не в фас, а в профиль — они были и есть цель любого автоматического теста (не обязательно юнит...) C>>"Все твои вызовы мокков ради ассертов, собственно и сделаны" — это напоминает генератор цепей Маркова. Взять два умных слова, и связать их между собой связующими. Получается билеберда, но звучит вроде как умно для стороннего человека.
C>>Так вот, ликбез: мокинг выполняется с целью изолировать тестируемый объект от внешних зависимостей.
ГВ>Ух ты! А я-то думал, что мокинг нужен для отслеживания последовательности внешних вызовов.
Неправильно думали. Мокинг нужен в первую очередь для изоляции тестируемого объекта. Чтоб сделать возможной эту изоляцию возможной необходимо симулировать поведение внешних зависимостей тестируемого объекта.
C>>Ассерты это всего-лишь предикат, который по-определению всегда true.
C>>Assert.Equals(10, someObj.SomeIntProperty); C>>Assert.IsTrue(someObj.SomeBoolProperty); C>>и т.д. и т.п.
ГВ>А по-твоему, Expect — это не тот же самый Assert в профиль? Assert — утверждение, Expect — утверждение о некотором ожидаемом событии. Тот же Assert, только специализированный.
К чему вопрос?
C>>Ассерты и моки не цель. Это средство и ключевой механизм реализации юнит тестов.
ГВ>Любое автоматическое тестирование сводится к проверке последовательности утверждений. Иначе оно совсем не нужно. Дальше только вариации способов записи этих утверждений.
Само собою. Весь этот спор о том, что на С++ нет даже близко сравнимых по удобству инструментов для тестирования.
ГВ>vdimas прав в том смысле, что если логика достаточно сложная, то и полные тесты достаточно трудно записывать. Вот тебе простейший пример (псевдокод):
И что тут сложного? Элементраный тест (в условиях дотнет) с условно установленными моками.
ГВ>
ГВ>То есть нужно проверить, что указанные сообщения ушли по заданным каналам, и только после определённого входного сообщения, и только в указанной последовательности, а потом ещё и желательно выдать осмысленное сообщение об ошибке.
Вы опять же путаете модульные тесты с интеграционными тестами. Модульные тесты не тестируют работу сети/жесткого диска/клавиатуры/мыши и т.д. Модульные тесты не тестируют взаимодействие подсистем. ит.д. и т.д. Короче, разберитесь в вопросе для начала, ок?
C>>При чем тесты ни коим образом не захламляют код. Все тесты находятся в отдельной сборке, которая "видит" (и только она одна) внутренности тестируемых сборок.
ГВ>Очень рад за вас.
А я очень опечален за вас.
C>>Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests.
ГВ>Это зависит от того, что в данной конфигурации полагается модулем, а что — интеграцией. Поскольку структура любой сложной программы иерархическая, то модуль на одном уровне — это сборная конструкция на другом.
Нет, не зависит. RTFM, как говорится.
V>>>Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. C>>Элементарно средствами RhinoMocks.
ГВ>И неужто будет проще, чем аналогичная заглушка? Это если учесть, то заглушка реализуется в естественном синтаксисе, а мок — перехватом вызовов. Второе будет почти гарантированно сложнее.
С этой глупостью я даже спорить не стану.
V>>>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое. C>>Демагогия.
ГВ>Боюсь, что реальность. Хотя я в курсе, разумеется, что самая надёжная основа своей позиции — искусное отрицание очевидного.
Можете продолжать бояться. Как все-таки доберетесь до RTFM`а, то поймете, что я был прав.
V>>>А теперь смотри что получается: автомоками удобно пользоваться для оформления относительно несложных тестов, где внешние условия и реакцию на них вполне можно описать декларативно и синтаксис все еще не будет раздражать. C>>Модульные или unit тесты ОБЯЗАНЫ быть несложными. В этом их СУТЬ.
ГВ>Угу. А ещё программы должны быть простыми. Это и называется искать решение сложных проблем простыми средствами, сиречь — руководствоваться лозунгами.
Да, тестируемые участки кода должны быть простыми. В этом суть дизайна под названием Test Driven Development. Используя алгоритм write failing test -> write code -> until test succeed -> refactor ... добиваемся прекрасного качества кода с соблюдением всех правил современного программирования: DRY, SRP, и т.д.
Если Ваш код на столько сложный и запутанный, что Вы не можете написать серию простых тестов для него, значит Ваш код — плохой. Вот Вам и пища для размышлений.
Здравствуйте, IID, Вы писали:
IID>Давай тогда я пример приведу, раз от тебя внятного и короткого семпла не добиться: будем мерять скорость md5. По 64 раунда стандартного алгоритма на блок. Сложностей это закодить нет никаких, не надо ни парсеры писать, ни предметную область изучать. Жду реализацию на .NET
Ты просил пример, где программа на C++ сольет в разы. Я привел. Пример, где сольет дотнет я не просил. Доказывать что md5 на С будет немного быстрее C# мне не надо.
Здравствуйте, MxKazan, Вы писали:
MK> Да брось. То, что в разделе КСВ форума RSDN нет людей, которые разрабатывают на Mono, совершенно не означает, что этот проект какой-то не юзабельный и его нельзя приводить в качестве аргументов.
Думаю, что их как раз есть. Они-то и плюются на моно. А вот защищают его те, кто на нем даже hello word не сотворил, ИМХО. Вот этим защитникам я сначала и предлагаю попробовать написать на нем что-то вменяемое и, если не произойдет промывания желудка, защищать его, так сказать, уже во всеоружии. Моя уверенность строится на том, что после C# я пытался подходить к этому снаряду под линуксом уже раз не помню сколько — с каждым разом Qt мне нравится все больше и больше по сравнению с ним.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, criosray, Вы писали:
C>>Здравствуйте, IID, Вы писали:
IID>>>Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
C>>Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
IID>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
Если не рассматривать способ получения этого кода, то такие рассуждения не нужны.
Это сродни тому что на ассемблере можно написать программу которая будет быстрее любой программы на любом языке.
Тольео практика этот тезис не подтверждает.
Здравствуйте, gandjustas, Вы писали:
G>Если не рассматривать способ получения этого кода, то такие рассуждения не нужны. G>Это сродни тому что на ассемблере можно написать программу которая будет быстрее любой программы на любом языке.
Именно! Поэтому изначальная фраза, про то что С++ не может оказаться быстрее — глупость. Иными словами C++ всегда может работать НЕ МЕДЛЕНЕЕ дотнета.
Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например)
G>Тольео практика этот тезис не подтверждает.
Философствование насчёт практики — это выше по треду, когда коробочные продукты просили .NETовские показать. И пришли к выводу что практика это всё-таки С++. (VladD2 даже ввёл атрибут "тиражируемый" для С++ софта). Хотя у каждого "практика" может иметь собственный смысл.
В любом случае, мне рассуждения в таком ключе не интересны. Было желание увидеть "волшебный" .NET код, обгоняющий C++. А в итоге скатились на банальщину. И ещё раз подтвердили тот факт что С++ таки уделывает .NET по скорости.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, IID, Вы писали:
IID>>Здравствуйте, gandjustas, Вы писали:
G>>>Если не рассматривать способ получения этого кода, то такие рассуждения не нужны. G>>>Это сродни тому что на ассемблере можно написать программу которая будет быстрее любой программы на любом языке.
IID>>Именно! Поэтому изначальная фраза, про то что С++ не может оказаться быстрее — глупость. G>А кто такое говорил?
IID>> Иными словами C++ всегда может работать НЕ МЕДЛЕНЕЕ дотнета. G>Не всегда, за счет динамической кодогенерации прога на .NET может работать быстрее аналогичной прогри на C++.
Ну вот давай возьмём некоторый конкретный выхлоп этой кодогенерации, перепишем на С++, и удивимся, что он работает быстрее.
Если рассматривать С# как быстрый скриптер — то очень близко к правде, он правда быстр. Но это не единственный возможный вариант для скриптинга. Например, Lua + JIT не сильно отстаёт по скорости, а по расходу памяти так и вообще впереди C#. Оставим пока скриптинг в стороне. Это, конечно, важная штука, но не везде она юзается и уж точно в одну кучу всё мешать не нужно.
G>А вообще второе твое утверждение не эквивалентно первому, изучай логику.
Первое выражение (твоё, кстати) — ложно. Чтобы сделать его истинным — применим отрицание. Что получим ?
!(C++ _никогда_ _не может_ _быстрее_) == С++ _всегда_ _может_ _не медленнее_
Или ты отрицание от С++ пытаешься взять ? :D
IID>>Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например) G>Только это будет не C++, а голый С. Все фичи, которые тут обсасываются сторонниками С++ идут лесом.
голый С это подмножество С++. Так что "это будет не С++", мягко говоря, ложь.
G>>>Тольео практика этот тезис не подтверждает.
IID>>Философствование насчёт практики — это выше по треду, когда коробочные продукты просили .NETовские показать. И пришли к выводу что практика это всё-таки С++. (VladD2 даже ввёл атрибут "тиражируемый" для С++ софта). Хотя у каждого "практика" может иметь собственный смысл. G>Почитай еще раз тему, очень много объяснений почему тиражируемый софт на С++ делается.
Была где-то хорошая мысль: если бы преимущества управляемой среды были бы действительно значимыми — переписали бы. Получается их значимость, как минимум, недостаточна.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, IID, Вы писали:
IID>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Если не рассматривать способ получения этого кода, то такие рассуждения не нужны. G>>>>Это сродни тому что на ассемблере можно написать программу которая будет быстрее любой программы на любом языке.
IID>>>Именно! Поэтому изначальная фраза, про то что С++ не может оказаться быстрее — глупость. G>>А кто такое говорил?
IID>ты говорил =) вот здесь
Ну тупи. "Не всегда быстрее" = "иногда медленее". Сам себе что-то придумываешь, а потом непонятно кому доказываешь.
IID>>> Иными словами C++ всегда может работать НЕ МЕДЛЕНЕЕ дотнета. G>>Не всегда, за счет динамической кодогенерации прога на .NET может работать быстрее аналогичной прогри на C++.
IID>Ну вот давай возьмём некоторый конкретный выхлоп этой кодогенерации, перепишем на С++, и удивимся, что он работает быстрее.
Ну и что?
G>>А вообще второе твое утверждение не эквивалентно первому, изучай логику.
IID>Первое выражение (твоё, кстати) — ложно. Чтобы сделать его истинным — применим отрицание. Что получим ? IID>!(C++ _никогда_ _не может_ _быстрее_) == С++ _всегда_ _может_ _не медленнее_ IID>Или ты отрицание от С++ пытаешься взять ? :D
Бред ты пишешь.
Если формально рассуждать, что мое утверждение выглядит как: !(ForAll(программы) реализация на C++ -> самая быстрая), ! — отрицание, -> — импликация, ForAll(программы) — квантор всеобщности.
Если спустить отрицание, то получится (Exists(программы) !(реализация на С++ -> самая быстрая)), где Exists — квантор существования.
Отрицание имликации истинно (сама импликация ложна) только в том случае, когда посылка истина, а следствие ложно.
В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
Иди ботай логику, потом возвращайся. А то тебя в КСВ будут за шеридана держать.
IID>>>Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например) G>>Только это будет не C++, а голый С. Все фичи, которые тут обсасываются сторонниками С++ идут лесом. IID>голый С это подмножество С++. Так что "это будет не С++", мягко говоря, ложь.
Это как раз правда.
Более того, голый C практически является подмножеством C#, за исключением некоторых детаей работы с указателями.
IID>Была где-то хорошая мысль: если бы преимущества управляемой среды были бы действительно значимыми — переписали бы. Получается их значимость, как минимум, недостаточна.
Страшная бредятина. С экономической тоочки зрения переписывать готовый продукт под другую платформу невыгодно совсем, несмотря на любые преимущества платформы.
А вообще если бы С++ был так крут как о нем тут пишут, то .NET даже не появился бы.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
G>>То что С++ (именно с плюсами) нах не нужен. Для быстрых числомолотилок берем код на C и нормально зовем его из любого языка.
V>Я уже не первый раз вижу это мнение, но не могу понять мотивы, может объяснишь? Наилучшие по оптимизации компиляторы — это С++, и они умеют коомпилировать С-код. Вот смысл мне не пользоваться возможностями более высокоуровневого языка, если у мня все-равно будет использован компилятор, который прекрасно компилит оба языка. Смотри: в чистом С ссылочный тип не строго типизирован, нет инлайна, нет инициализации по месту, недоступна ОО-декомпозиция (а в этом миксере участвует около десятка классов, и кое-какая шаблонность есть, правда без претензий на МП) и т.д и т.п. Поэтому поинт не понятен совершенно, по мне С++ в стиле "С с классами" все равно гораздо мощнее С. Я бы советовал ровно наоборот, там где можно, вместо С использовать С++.
Я имею ввиду не использование компилятора С, а неиспользование возможностей C++ — классов, шаблонов, динамической памяти и прочего.
Для числомолотилок оно и не нужно.
Здравствуйте, gandjustas, Вы писали:
IID>> Иными словами C++ всегда может работать НЕ МЕДЛЕНЕЕ дотнета. G>Не всегда, за счет динамической кодогенерации
При всех этих динамических компиляциях и кешированиях, Генка Риггер как то пожаловался что им скоро придётся вместе со своими продуктами продавать пакетики травы — чтобы визуально сглаживать постоянные рывки производительности
G>прога на .NET может работать быстрее аналогичной прогри на C++.
Я тебя обрадую — к С++ тоже можно приделать динамическую кодогенерацию, я это делал когда-то. Однако для С++ это не нужно он и так почти всегда близок к оптимому при прочих равных.
G>А вообще второе твое утверждение не эквивалентно первому, изучай логику.
Не тебе говорить о логике
IID>>Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например) G>Только это будет не C++, а голый С. Все фичи, которые тут обсасываются сторонниками С++ идут лесом.
Ты не знаешь С++ иначе бы не нёс ересь про С
G>Я имею ввиду не использование компилятора С, а неиспользование возможностей C++ — классов, шаблонов, динамической памяти и прочего. G>Для числомолотилок оно и не нужно.
Шаблоны и классы нужны, позволяют получить более шустрый код чем чистый си.
Здравствуйте, NikeByNike, Вы писали:
G>>прога на .NET может работать быстрее аналогичной прогри на C++. NBN>Я тебя обрадую — к С++ тоже можно приделать динамическую кодогенерацию, я это делал когда-то. Однако для С++ это не нужно он и так почти всегда близок к оптимому при прочих равных.
На С++ значит динамическая кодогенерация не нужна так как код близкий к оптимальному. А динамическая генерация кода на .NET позволяет C++ уделывать.
G>>А вообще второе твое утверждение не эквивалентно первому, изучай логику. NBN>Не тебе говорить о логике
И не тебе. Так что не влазь.
IID>>>Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например) G>>Только это будет не C++, а голый С. Все фичи, которые тут обсасываются сторонниками С++ идут лесом.
NBN>Ты не знаешь С++ иначе бы не нёс ересь про С
Ты о чем? Исходники md5 отлично собираются голым C компилятором.
G>Как шаблоны как compile-time кодогенерация действительно хорошо работает. Я там образом оптимизировал библиотеку для нейронных сетей на крусовую. G>В принципе runtime кодогенерация позволяет даже больше, но с большими усилиями.
G>А классы каким образом позволяют получить более быстрый код, на примере числомолотилки типа md5?
Функторы в виде классов лучше инлайнятся чем свободные функции. Хотя современные компиляторы уже и одиночные функции инлайнить умеют, но функторы все-равно позволяют большую гибкость не теряя в скорости.
Здравствуйте, FR, Вы писали:
G>>Пример?
FR>std::sort vs qsort
Подлог! Это разные алгоритмы.
Кстати, на пример C vs. C++ можно можно спроецировать все сказанное о C++ vs. C#. Ведь на С всегда можно написать код не медленнее чем на С++. Проблема только в трудоемкости.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>Функторы в виде классов лучше инлайнятся чем свободные функции. Хотя современные компиляторы уже и одиночные функции инлайнить умеют, но функторы все-равно позволяют большую гибкость не теряя в скорости.
Махровый бред!
Не потрудишься его обосновать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
FR>Неубедительно учитывая горячую любовь игроделов к интеловскому компилятору, который подобные вещи хорошо векторизует, плюс не менее горячую любовь к интрисикам тех игроделов которые не любят интеловский компилятор
А я сразу оговорился, что говорить про язык некорректно. Раз уж человек обобщил до языка, то его заключения обязаны быть корректны для всех компиляторов. Пример приведенный мной демонстрирует, что это не так. Значит и заключение не верно.
Что не так?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
VD>>Это чушь. По той же логике, что предъявляют фанаты С++ ассемблер как раз дает больше возможностей для оптимизаций. Например, самые новые инструкции можно заюзать и т.п. Когда там компиляторы до них подтянутся.
FR>Логика таже только ступенька на порядок выше.
Кто измерял этот порядок?
FR>Разница принципиальная между ассемблером и ЯВУ это порядок, внутри майнстримовых языков в лучшем случае разы.
Между С++ и теми же Немерле или Хаскель тот же порядок. Конечно если всеми тремя инструментами хорошо владеть.
С другой стороны это уже сближение позиций. Разница уже заключается только в оценке степени превосходства в уровне и отстования в скорости. Так?
FR>Зависит еще от размеров проекта, его сферы применения и квалификации исполнителей.
От размеров конечно зависит. Чем больше проект, тем менее рентабельно реализовывать его на С++. От сферы не зависит. По крайней мере я эту зависимость не ощущаю. Квалификация вообще показатель отдельный. Сравнивать нужно только при условии, что квалификация идентична. Иначе к затратам нужно прибавлять затраты на обучение или формирование новой команды разработчиков.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
FR>>Неубедительно учитывая горячую любовь игроделов к интеловскому компилятору, который подобные вещи хорошо векторизует, плюс не менее горячую любовь к интрисикам тех игроделов которые не любят интеловский компилятор
VD>Кстати, рассуждения о любви подкреплены какой-то статистикой или как всегда высасывание из пальца?
Влад ты перестал пить коньяк и бить жену по утрам?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>Влад ты слишком давно не писал на C++
VD>Он что с тех пор изменился?
VD>ЗЫ
VD>Хотелось бы все же услышать обоснование.
Компиляторы Си/С++ до недавнего времени не умели инлайнить по указателю на функцию,
шаблоный же параметр инлайнят компиляторы даже 10 летней давности.
ГВ>>>Ух ты! А я-то думал, что мокинг нужен для отслеживания последовательности внешних вызовов. C>>Неправильно думали. Мокинг нужен в первую очередь для изоляции тестируемого объекта. Чтоб сделать возможной эту изоляцию возможной необходимо симулировать поведение внешних зависимостей тестируемого объекта.
ГВ>Так. Обратимся к первоисточникам:
ГВ>
Mocks [...] objects pre-programmed with expectations which form a specification of the calls they are expected to receive.
ГВ>Моки — запрограммированы на ожидание вызовов в соответствии с определённой спецификацией. (Буквально: формируют спецификацию своими ожиданиями)
ГВ>Где сказано, что мок обязательно изолирует тестируемый объект от окружающих?
Даже и не знаю как Вам объяснить, что 2+2=4.
Даю наводящий вопрос: С какой целью создаются "objects pre-programmed with expectations which form a specification of the calls they are expected to receive"?
Можете мне не отвечать. Я ответ знаю. Ответьте себе. Если сможете, то поймете о чем идет речь. А не сможете — ну да и Бог с Вами.
C>>Само собою. Весь этот спор о том, что на С++ нет даже близко сравнимых по удобству инструментов для тестирования.
ГВ>Ну, если сводить "удобство тестирования" к автоматической генерации пустых объектов — соглашусь. А если не сводить, то тут очень сильно бабка надвое сказала.
Тестируются не пустые объекты, а поведение объектов в фиксированных (изолированных) условиях.
ГВ>>>vdimas прав в том смысле, что если логика достаточно сложная, то и полные тесты достаточно трудно записывать. Вот тебе простейший пример (псевдокод): C>>И что тут сложного?
ГВ>А я и не говорю, что это сложно. Я о сопоставлении сложности теста и тестируемого кода.
И? Не вижу к чему Вы клоните.
C>> Элементраный тест (в условиях дотнет) с условно установленными моками.
ГВ>Мммм... Дотнет его сам сгенерирует? Полностью? А за пивом он сгоняет?
Полностью. Сгенерирует. Не вижу причину сарказма.
ГВ>[...]
ГВ>>>То есть нужно проверить, что указанные сообщения ушли по заданным каналам, и только после определённого входного сообщения, и только в указанной последовательности, а потом ещё и желательно выдать осмысленное сообщение об ошибке.
C>>Вы опять же путаете модульные тесты с интеграционными тестами. Модульные тесты не тестируют работу сети/жесткого диска/клавиатуры/мыши и т.д. Модульные тесты не тестируют взаимодействие подсистем. ит.д. и т.д. Короче, разберитесь в вопросе для начала, ок?
ГВ>Даже если говорить о приведённом примере, то где здесь тестирование сети/жёсткого диска/...? Тестируется соответствие реального и предполагаемого протокола работы (form a specification, итить!). Или ты думаешь, что под sendMessage имеется в виду send в сокет?
Если не предполагается, то RhinoMocks прекрасно справится с мокингом в этом случае. В чем проблема?
ГВ>А потом, модульным тестированием называется тестирование модулей. Что именно мы так называем — зависит от структуры программы. Запросто может быть тестирование модуля по имени "модуль сетевого интерфейса", который запросто может предполагать одновременный запуск тестов на нескольких машинах и в то же время другой модульный тест может проверять одну-единственную функцию.
Демагогия. Вы пытаетесь рассуждать логически, строя ложные выводы, основываясь не на реальных знаниях и опыте, а на дедукции и том, что Вы считаете логичным в меру Ваших познаний.
Почитайте Мартина Фоулера, почитайте Бекка... Да хотя бы, потратьте 10 минут да прочтите http://en.wikipedia.org/wiki/Unit_testing
ГВ>Если TDD предполагает, что это неправильное употребление термина "модульное тестирование", то тем хуже для самого TDD.
Тем хуже для Вас, а не для TDD.
C>>>>Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests. ГВ>>>Это зависит от того, что в данной конфигурации полагается модулем, а что — интеграцией. Поскольку структура любой сложной программы иерархическая, то модуль на одном уровне — это сборная конструкция на другом. C>>Нет, не зависит. RTFM, как говорится.
ГВ>Какой M нужно R?
Смотрите выше.
ГВ>>>Угу. А ещё программы должны быть простыми. Это и называется искать решение сложных проблем простыми средствами, сиречь — руководствоваться лозунгами.
C>>Да, тестируемые участки кода должны быть простыми. В этом суть дизайна под названием Test Driven Development. Используя алгоритм write failing test -> write code -> until test succeed -> refactor ... добиваемся прекрасного качества кода с соблюдением всех правил современного программирования: DRY, SRP, и т.д. Если Ваш код на столько сложный и запутанный, что Вы не можете написать серию простых тестов для него, значит Ваш код — плохой. Вот Вам и пища для размышлений.
ГВ>А если пользователь поставил задачу, которая не имеет простого решения?
Знакомы с понятием "декомпозиция"?
ГВ>Значит, я не смогу написать простой тест и не смогу руководствоваться современными правилами программирования?
Здравствуйте, VladD2, Вы писали:
IID>>P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить.
VD>Замечательная логика! Точнее ее полное отсутствие.
VD>Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
G>>Проснись, оптимизация дотупа к массивам давно сущесвует.
V>То, что ты привел, работает только для i<array.Length, а это для тех же числомолотилок, которые переливают из предвыделенных буферов в буфера нереальный сценарий. Я уже как-то писал на эту тему, но могу еще раз. V>
V>_data и _buffLen — члены класса, data и buffLen — локальные переменные, на них нет ссылок по ref, а из алгоритма видно, что значения неизменяемые в теле цикла, поэтому проверить можно buffLen лишь однажды при инициализации цикла, а затем уже не проверять границы. Однако, эту оптимизацию не делают.
Это C++ники так пишут код на шарпе. Не надо так писать. Пишите нормально i<data.Length и будет счастье.
G>>Если нужет произвольный быстрый доступ, то есть unsafe.
V>Если использовать пиннинг — то тормозно (чем больше одновременных пинов, тем дороже каждый следующий), если же самостоятельно выделять память через всякие Marshal.AllocXXX, то смысл в управляемой платформе вообще исчезает, да и проблемы с ClickOnce для unsafe сборок. Вывод сделаешь сам.
А причем тут пиннинг, он имеет значние только когда выделяется память. Есть хоть один числомолотильный алгоритм, в котором удно выделять память в процессе прохода по массиву?
Такая операция в С++ взовет большие тормоза, чем проверки границ в .NET.
G>>Что касает числомолотилок, то в самых тупых линейных случаях (как md5 например), при использовании uncheked, .NET будет проигрывать на проценты. Что в реальной программе погоды не сделает.
V>Это зависит от характера вычислений. Например, фильтрация — это крайне примитивные вычисления, там затраты на проверку на границу цикла сопоставимы с полезными вычислениями (сопоставимы потому, что джиттер даже не кеширует в регистре длинну массива, а каждый раз лезет за ней через коссвенную адресацию), и вместо непосредственного приращения указателя каждый раз вычисляет адрес элемента (что вполне понятно, у нас же GC). Итого, мы сможем сделать таких простых вычислений в 2-3 раза меньше.
Фильтрация чего?
Еще раз нужен быстрый линейный проход по массиву — используйте unsafe.
G>>Кроме того такие случаи элементарно оптимизируются заменой на Сшный код или распараллеливаются (в .NET далется очень легко). V>В моей задаче распараллеливание одного вычисления не нужно, у меня их и так конкуррентно тысячи идут, я борюсь за эффективность каждого из них.
Будешь бороться за каждого — производительности не будет. Компутер гораздо лучше умеет шедулить задания, чем ты сам.
G>>ЗЫ. Я ещ не упоминул такие оптимизации, которые делает mono. См Mono.Simd
V>Спасибо, интересно. На С++ мы делаем разные сборки для без SSE, и отдельно для SSE1/2/3, которые будем подгружать динамически, в зависимости от возможностей проца. Если джиттер научится делать это сам, то кое-что можно будет пересмотреть. Однако, вот тот доступ к массивам — это затык №1 для нас, ибо обычные вычисления действительно неплохо выглядят после джиттера.
Дык используйте unsafe и указатели.
Здравствуйте, gandjustas, Вы писали:
G>Кроме того уже не за горами запуск числомолотилок на GPU, там тоже высокоуровневые языки будут более уместны, так как позволят генерить код для GPU в рантайме.
Занимаюсь я щас как раз GPU числомолотильней для финансовых расчетов.
Там пока всё мрачно и сурово.
Язык вообще роли не играет — хоть на ассемблере пиши. Все равно везде упираешься в особенности и ограничения самого железа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>А мотив очень простой. Голый C интеропается с программой на любом языке.
Ну и толку с того что он интеропается?
G> Если не использовать динамическое выделение памяти, указатели
Это вообще то всё есть и в С.
G> наследование, полиморфизм и шаблоны и прочую высокоуровневую лабуду, то пропадают все проблемы, присущие C++.
И какие же проблемы, кроме кривых рук говнокодера с вышеперечисленным связаны?
G>Кроме того, повышается переносимость кода. При удачном стечении обстоятельств можно взять код на С и запустить его на видеокарте с помощью CUDA.
Снимай уже розовые очки.
На CUDA перенести удается только хорошо параллелящиеся алгоритмы. Все остальное превращается в УГ.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
G>>Зачем мне верить, у меня результаты тестов есть. H>У тебя тест не правильный Померял непонятно что у MSVC++ и экстраполируешь на весь С++
Померял он дефакто WinHeap а не C++ аллокацию.
Зато щастлив как ребенок, что пописал.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>А мотив очень простой. Голый C интеропается с программой на любом языке. CC>Ну и толку с того что он интеропается?
Удобно использовать как высокоуровневый ассемблер.
G>> Если не использовать динамическое выделение памяти, указатели CC>Это вообще то всё есть и в С.
Кто-тоговорил что нет?
G>> наследование, полиморфизм и шаблоны и прочую высокоуровневую лабуду, то пропадают все проблемы, присущие C++. CC>И какие же проблемы, кроме кривых рук говнокодера с вышеперечисленным связаны?
Все проблемы разработки ПО так или иначе связаны с криворукостью. Это вообще свойство человека — ошибаться.
Нормальные языки должны не допускать грубых ошибок и прощать мелкие. С++ так не умеет, невнимательное кодирование приведет к тому, что программа начнет падать в самый неожиданный момент.
G>>Кроме того, повышается переносимость кода. При удачном стечении обстоятельств можно взять код на С и запустить его на видеокарте с помощью CUDA. CC>Снимай уже розовые очки. CC>На CUDA перенести удается только хорошо параллелящиеся алгоритмы. Все остальное превращается в УГ.
Читай внимательнее выделенное.
В общем ладно, может тут и моя вина, что не описал контекст, поэтому не понимаю твоего сопротивления очевидным, на мой взгляд, вещам.
В общем, сервер конференций, видео, VoIP и вся лабуда типа шаринга приложений и прочие примочки. Основная реалтаймовая и одновременно нагрузочная вещь — это именно VoIP, остальное реалтаймом можно назвать лишь условно. Что есть VoIP: это 50 пакетов в секунду на абонента в одну только сторону, т.е. итого 100 пакетов на абонента. Железка должна держать их несколько сотен, желательно под тысячу. В общем, у меня такой сценарий, что я даже не могу позволить себе такую мелочь, как лишнее копирование данных и тем паче ни о каких 100тыс выделений буферов в секунду не может быть и речи.
G>Как это "априори неизвестен"? покажи мне API которые возвращают "незивестно сколько данных".
Оно не возвращает, оно читает из сокета в наш предвыделенный буфер. После прочтения возвращает кол-во прочитанных байт. В пакете заголовок и собственно сами данные с неким смещением (зависит от заголовка). Данные обрабатываются прямо из этого буфера по указанной выше причине.
G>В таком случае надо большие буферы выделять в саом начале и кратковременно их пиннить. Известный рецепт.
Там в среднем 6 буферов на абонента, под миллион пинов в секунду — это даже на моей "сиротской" железке просто так выкинуть около 15% производительности.
G>Ну если это FIR-фильтрили что-то в том роде, то не думаю что накладные расходы доступ по индексу окажутся значимыми по сравнению с наложением фильтра.
Обычная там фильтрация, ФНЧ/ФВЧ, алгоритм рекурсивного фильтра примитивен — это просто вычисление многочленов z1*a1+z2*a2+z3*a3+..., zi — элементы последовательности, ai — константы. Думаешь, я тебе вру о том, что затраты на доступ к массиву сопоставимы с полезными вычислениями?
G>Еще раз перечитай что я писал. "уменьшить гранулярность блокировок" это как раз попытка гоняться за каждым.
Да почитал, почитал. Сейчас я тебе контекст обрисовал, ты и сам видишь, что дополнительно параллелить там нечего. Вся система асинхронная, по приходу UDP-пакета стоит задача максимально быстро его обработать и освободить тред для следующего. Кол-во таких VoIP-тредов сейчас в 4-6 раз больше, чем ядер, еще больше делать смысла нет, т.к. производительность больше не растет.
G>Ты лучше пересмотри свой взгляд на создание высоконагруженных систем. Например с либой типа CCR можно вообще без блокировок обходится при любом количестве входящих запросов
Прежде чем советовать что-либо пересмотреть, неплохо бы выяснить как оно сейчас есть... нет?
Чтобы два раза не ходить, скажу что по максимум и это у нас есть, кроме тех сценариев, для которых безблокировочные алгоритмы еще не придуманы. Если быть более точным — то некоторые существующие просто не всегда подходят, ввиду требований выделения динамической памяти для каждой порции данных.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, MxKazan, Вы писали: MK>>Ну т.е. в принципе, при наличии двух сервис-паков, Photoshop CS2 можно смело назвать Photoshop CS4??? V>Откуда такой вывод?
Ну как...
— Изначально ты написал: "И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ".
— На что получил ответ, что рантайм по прежнему 2.0, что он не менялся со времен второго дотНета, ну нету CLR 3.0 и всё.
— Тем не менее, как контраргумент ты выдвинул такое: "Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание."
Собственно отсюда и вывод, что сервис-паки каким-то магическим образом повышают версию.
Здравствуйте, MxKazan, Вы писали:
V>>Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов. MK>Короче это. Не сошлись вы в том, что один понял 3.0 как версию CLR, другой говорил о CLR, который шел вместе с 3-м FW. Вот и всё, рабочие моменты Кстати, я пару раз на собеседованиях слышал, что некоторые так и не перешли на третий FW, потому что ждут полноценно нового рантайма.
Очень глупо. 3.0 и особенно 3.5 это очень большой шаг вперед в сравнении с 2.0. CLR мало на что влияет как таковой.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, MxKazan, Вы писали:
MK>>- Изначально ты написал: "И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ". MK>>- На что получил ответ, что рантайм по прежнему 2.0, что он не менялся со времен второго дотНета, ну нету CLR 3.0 и всё. V>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например?
Видимо, потому что ты говорил о JIT-е, который таки является частью именно CLR. Ты картинку то поглядел? Мы за последнее время привыкли к незнанию предмета со стороны *упорно голосующих*, так что подобное непонимание не удивительно.
Здравствуйте, criosray, Вы писали:
C>Детский сад, вторая группа.
Да понимаешь...
В нашей профессии ничего сакрального быть не может по-определнию, и любая Методология не сложнее Алгоритма. Не понял? Прочти еще раз.
Если человек не в состоянии ни аргументировать позицию, ни дать четких определений, а в место ответа на конкретные вопросы несет нечто о "высшем знании" и своей "тайной причастности", и главный аргумент неизменно "да вы просто ничего не понимаете"... это говорит лишь о приличной каше в голове и больше ни о чем.
И вот мы честно неоднократно пытались зайти "с самого начала", задавая наводящие вопросы, но когда дошли до главного, то "рыбка сорвалась" и уплыла в свое "ах, да вы же ну точно ничего не понимаете".
Как итог, немного чувствуем себя в роли тех самых новых ворот, которым взбрендилось разговорить своего известного созерцателя... Абыдно за потраченное ни на что время... Либо еще можно махнуть рукой и откровенно развлекаться.
V>>А CLR у нас теперь отдельно от фреймворков идёт? MK>А что это меняет?
Упорядочивает логику рассуждений, очевидно.
MK>Ну слушай, уже разобрались что к чему, давай не будем пускаться в демагогию.
Ну я-то разобрался сразу, просто интересно понять, откуда был взято утверждение о моем незнании насчет версий CLR. Считай, что формат "Священных войн" позволяет мне экспериментировать с оппонентами. Просто в исходный топик можно подставить утверждение, что я не знал обсуждаемое, или же противоположное — логика-то в итоге не меняется, и даже к обсуждаемому там вопросу не относится. Так что позволю себе быть в полной уверенности, что этот всплеск эмоций был по самой банальной низменной причине — из желания назвать ламером оппонента. (такая вот месть, за то, что потрепали в другом разделе форума )
И еще один последний ликбез для Вас: рантайм о котором Вы твердите это и есть CLR — common language runtime и он НЕ обновлялся с 2005го года — со времен выхода дотнет 2.0
Повторяю: жду от Вас, вдимас, публичного признания своей неправоты и извинений.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>>>Поэтому, в спецификациях требований к окружению такой программы надо писать не <CLR 2.0.х>, а <.Net 3.5 SP1>. Разницу ощутил? S>>А как же multitargeting при разработке? S>>Скопиленное на платформе .Net3.5sp1 под 2.0 пойдет на 2.0 гарантированно? Или к 2.0 надо свои другие фиксы ставить?
V>Именно привел пример, когда гарантированно не пойдет. Конкретные классы и методы: V>Socket.AcceptSync(), Socket.ConnectSync(), и прочие xxxAsync() а так же сам класс SocketAsyncEventArgs.
Очевидно речь идет о методах Socket.AcceptAsync, Socket.ConnectAsync и т.п. Потому как об AcceptSync нет никаких упоминаний.
Эти новые методы были введены в Supported in: 3.5, 3.0 SP1, 2.0 SP1
Т.е. разрабатывая под 3.0 SP1 и используя эти методы мы получаем бинарник, которому нужен 2.0 SP1 для запуска. Если мы не хотим терять совместимость с 2.0 без sp1, то не используем. И все дела.
V>Была еще куча мелких примеров, но мы не записывали, а просто написали в требованиях <MS .Net FW 3.5 SP1>.
?
Если можно конкретнее...
P> P>>типов проверок !!!! ЧЕГО .. P> P>> мощная статическая проверка типов ..это 0 который делает из 1 десятку
P> G>
P> G>A a;
P> G>B* b = (B*)((void*)&a)
P> G>
P> G>Где тут сильные проверки?
P> G>Лучше сразу напиши что был неправ иначе заклюют.
P> тут их нет конечно же, это пример сознательного обхода проверок,
Мощная система проверки типов просто не позволила бы сделать такой финт ушами
P> есть полноценные указатели
Что такое полноценные указатели?
P> и void*
Который нужен зачем?
P> , совместимость с С и это здоровская вещь на самом деле ...
Любой современный язык имеет возможность вызывать функции из С-кода
P> понимаешь.. как тебе объяснить .. "нож хорош для того, у кого он есть, и плох для того, у кого он в нужный момент не оказывается под рукой" .
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>>>
G>>>>A a;
G>>>>B* b = (B*)((void*)&a)
G>>>>
G>>>>Где тут сильные проверки?
G>>Не надо объяснять. Не такая уж сильная типизация как тебе кажется. G>>Пример с union_ами приводить?
NBN>А чего ты всё про С да про С? Мы тут вроде про С++ говорили.
C++ в полной мере наследует все проблемы и ошибки С и добавляет свои до кучи.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, landerhigh, Вы писали:
C>>>На детские болезни программистов и прочие грабли я налетал примерно 11 лет тому назад, когда работал С/С++ программистом. Так что Ваш комментарий, молодой человек, несколько "мимо тазика". L>>Так и работал, C/C++ программистом? А это ничего, что такого языка нет и не было? C>В каком месте при чтении Вашего ответа следует начинать смеяться?
Смотри выделенное.
Засим откланиваюсь.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Pepel, Вы писали:
P>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна .. MK>Dildo Framework, Vegetable Edition
Остается окрытым вопрос: а как быть мясному рынку?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>>>На С++ тоже уже на днях станет можно. G>>А смысл?
V>Совсем предлагаешь без нативных языков обходиться?
Смотря в какой области. В системном программировании не сильно получится без нативных языков, байтики ворочить без C мало получится. C++ в такой задаче ни к чему. Аналогично для числомолотилок.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Serginio1, Вы писали:
S>>И зачем тогда на 1С пишут? (возможностей то мало, но и их хватает большинству хватает)
V>Из-за оху..., т.е. хьюговой (huge) прикладной базы.
//Суммарная скорость разработки крайне мало зависит от выбранного высокоуровневого языка
Для каждой задачи свой инструмент. Невозможно создать универсальный иснструмент, даже из С# (хотя в Net 4 динамики добавят ещё большей гибкости). Но универсальный, не значит оптимальный для определенного круга задач.
Выбрать оптимальный инструмент, главная задача производителя
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, VladD2, Вы писали:
VD>Хамский тон? Дык я со всеми говорю тем тоном который они зауживают. Ты не стоишь того, чтобы проявлять к тебе уважение. VD>Ты банально обосрался в споре и пытаться свести все к флэйму, перевести тему, перейти на личности и т.п. VD>Я не вижу никакого отношения между твоим ламерством в обсуждаемых вопросах и нашим сайтом. VD>Ну, и разговаривать о проблемах сайта с теоретиками мне по-попросту не интересно. Когда создашь сайт хотя бы в десять раз меньше популярный можно будет поговорить. VD>Тебе должно быть стыдно за свое ламерство и ту дерьмовую демагогию что ты тут разводишь. VD>В прочем, понятие совести для таких как ты вряд ли применимо, а значит разговоры о совести бессмысленны.
Старый добрый влад.
Забань себя чтоль за оскорбление пользователя.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
VD>>Хамский тон? Дык я со всеми говорю тем тоном который они зауживают. Ты не стоишь того, чтобы проявлять к тебе уважение. VD>>Ты банально обосрался в споре и пытаться свести все к флэйму, перевести тему, перейти на личности и т.п. VD>>Я не вижу никакого отношения между твоим ламерством в обсуждаемых вопросах и нашим сайтом. VD>>Ну, и разговаривать о проблемах сайта с теоретиками мне по-попросту не интересно. Когда создашь сайт хотя бы в десять раз меньше популярный можно будет поговорить. VD>>Тебе должно быть стыдно за свое ламерство и ту дерьмовую демагогию что ты тут разводишь. VD>>В прочем, понятие совести для таких как ты вряд ли применимо, а значит разговоры о совести бессмысленны.
CC>Старый добрый влад. CC>Забань себя чтоль за оскорбление пользователя.
Жаль, что на КСВ не банят за провокационное поведение, троллинг и ламерство.
NBN>>>>Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости.
C>>А необходимость возникает только тогда, когда продакшн билд начинает течь, как дырявое решето?
MX>criosray, будьте, пожалуйста, повнимательнее, даже и в КСВ. Я этого не писал.
А я Вас и не квотил.
MX>Вы вот мне лучше скажите — код, который находится этим запросом — его писали нормальные программисты или индусы (всё-таки не хочется делать далеко идущие выводы о языке на основе кода последних)? Если нормальные, то о какой высокоуровневости может идти речь? Тут как раз и получается "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва" (С) BulatZiganshin. В С++ подобного кода нет и не надо никогда.
Ваши наивные иллюзии вызывают улыбку.
Слаботипизированный С++ с абсолютно нечитабельным отвратительным синтаксисом позволяет допускать ТАКИЕ ляпы, что в С# даже индус написать не сумеет.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, catBasilio, Вы писали:
B>>Если С# так хорош, то почему всякие Crysis, Quake, FarCry и прочее на нем не пишут?
VD>Банально выжимают производительность. Тот же Quake писался на С. Кормак ООП в принципе не приветствовал никогда.
Последний pure-C движок Кармака — для Q3 (1999, т.е. 10 лет назад). Потом только С++:
Doom 3 — C++
Другие известные C++ движки:
Source — C++
UE3 — C++
VD>Кстати, большой объем кода в играх — это логика игры. И его ни один идиот на С не пишет.
Смотря что и как мерять. По объёму — может и большой. А по % времени исполнения — незначительный.
VD>Есть и игры написанные на 90% на управляемом коде.
Ага, казуалки И опять же, что меряем ? Если время исполнения — ни в одной игре с навороченной графикой больше единиц процентов не получим этого времени.
VD>Так что выигрышь от применения С++ и С не велик.
А игроделы-то и не в курсе...
Здравствуйте, vdimas, Вы писали:
V>С++ такой же низкоуровневый, быстрее в общем случае, чем С.
Насчёт быстрее в общем случае, чем Си — это вряд ли. В некоторых случаях может быть быстрее кода на Си, в этом месте как правило спешат привести хрестоматийный пример qsort vs. std::sort. Собственно, это была одной из целей Страуструпа — не сильно потерять в производительности. Но совсем этого избежать не получилось.
V>И что за повторяющаяся ахинея насчет "более сложных абстракций"?
Исключения, например, сильно мешают некоторым оптимизациям, приводят к громоздкому бинарному коду. Совсем же без исключений на C++ писать трудно, тем более что даже простой new может бросить std::bad_alloc.
Шаблоны могут привести к разбуханию и дублированию бинарного кода, что как минимум скажется на cache locality (C++FQA).
Здравствуйте! Нужен ваш совет))
Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию?
В каких областях сейчас применяется C++?
Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++
Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
У меня есть опыт работы на php, причем не только web, а еще что-то вроде создания системы документооборота)
Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, shrecher, Вы писали:
S>>MSOffice12, Microsoft Silverlight, Windows7, Vista,
BZ>мне это напомнило один школьный конкурс. две команды по очереди называли маттермины, выигрывала та, которая назовёт последний. и мы нашли золотую жилу — треугольник, четырёхугольник, пятиугольник...
Это был ответ на неверное утверждение: "cоветую забыть про с++. На нем сейчас пишут почти только игрушки/драйверы за редкими исключениями. "
BZ>массовые коробочные продукты действительно лучше написать на C++ BZ>когда человек станет квалифицированным C++ девелопером, потребность в них и вовсе исчезнет.
Эти твои утверждения протеворечивы. Тут только одно из двух: либо престанут разрабатывать на C++, что мало вероятно, т.к. очень много продуктов на нем, тогда да — c++ таланты исчезнут; либо, что более вероятно, продолжат разработку и развитие продуктов на C++, и тогда без людей не обойтись.
BZ>вот только где у нас в стране разрабатывают такие прогшраммы — с миллионами продаж?
Это где "у нас в стране". В России? Я не знаю, т.к. давно там не был, но в мире полно компаний с миллионами продаж.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>массовые коробочные продукты действительно лучше написать на C++ — хоть время разработки в несколько раз выше,
Дежурный вопрос: откуда дровишки?
BZ>зато они требуют меньше памяти и работают быстрее. вот только где у нас в стране разрабатывают такие прогшраммы — с миллионами продаж? таких мест раз-два и обчёлся, добавь к этому массу legacy C++ программистов и ты получишь, что порог вхождения в эту область слишком высок,
"Порог вхождения в эту область" ничем не отличается от порога вхождения в любую другую область программирования с устоявшимися традициями, community и т.п. Это совершенно не означает, например, что эти традиции необходимо блюсти по любому поводу. Просто по любому вопросу ты сможешь найти массу подчас противоречивых мнений, решений и т.п. И кстати, "legacy C++ программисты", это что за звери такие? Это те, которые буста шугаются?
BZ>а к тому времени, когда человек станет квалифицированным C++ девелопером, потребность в них и вовсе исчезнет. словом, это всё равно что идти учиться на кучера в эпоху первых трамваев
Что-то маловато стереотипов на квадратный сантиметр. Надо больше.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, shrecher, Вы писали:
KV>>Здравствуйте, astral_marine, Вы писали: _>>>Знаний для работы под С++ надо больше, но это изучается один раз в жизни. KV>>Гениальная фраза. А можешь дать пример знаний, которые необходимо получать дважды, трижды и т.д? S>Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи.
Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было
Здравствуйте, Геннадий Васильев, Вы писали:
MK>>Вот те раз. Оказывается на C++ ничего нового за 10-20 лет не придумали? Ну ващеееее ГВ>C++ всего-то 20 лет от роду, CRT благополучно унаследована от C. И, например, "сокеты", которым уже около 30, до сих пор живее всех живых. Ещё и WCF переживут.
Ну, спасибо за информацию. Только это никак не отменяет ошибочности заявления, что для разработки на С++ сейчас достаточно знаний 10-20 летней давности. Разве что это сугубо вычислительные задачи — сортировочки там, графобродилки... Ну и "сокеты", конечно
Здравствуйте, MxKazan, Вы писали:
ГВ>>C++ всего-то 20 лет от роду, CRT благополучно унаследована от C. И, например, "сокеты", которым уже около 30, до сих пор живее всех живых. Ещё и WCF переживут. MK>Ну, спасибо за информацию. Только это никак не отменяет ошибочности заявления, что для разработки на С++ сейчас достаточно знаний 10-20 летней давности. Разве что это сугубо вычислительные задачи — сортировочки там, графобродилки... Ну и "сокеты", конечно
Что ж это за "новые знания", которые вдруг появились? Надеюсь, лямбда-исчисление, которому уже за полтинник, ты к таковым не относишь?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, shrecher, Вы писали:
S>Заметь, "улучшает" в кавычках. Почему нельзя было сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями?
Да ё-мае, вообще не понимаю, чего нельзя было сразу с появленияем ПК сделать его идеальным раз и навсегда.
S>Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия.
Ну ты же не переживаешь, например, что Intel радикальным образом изменит набор инструкций своих процессоров. И с появлением тех же MMX и SSE их тоже приходилось осваивать. И чего? Любая версия .Net поддерживает предыдующие. Изменения делаются в новой версии.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали:
ГВ>>>C++ всего-то 20 лет от роду, CRT благополучно унаследована от C. И, например, "сокеты", которым уже около 30, до сих пор живее всех живых. Ещё и WCF переживут. MK>>Ну, спасибо за информацию. Только это никак не отменяет ошибочности заявления, что для разработки на С++ сейчас достаточно знаний 10-20 летней давности. Разве что это сугубо вычислительные задачи — сортировочки там, графобродилки... Ну и "сокеты", конечно ГВ>Что ж это за "новые знания", которые вдруг появились? Надеюсь, лямбда-исчисление, которому уже за полтинник, ты к таковым не относишь?
Ты прав. Нет таких знаний. Ничего нового в разработке ПО за 10-20 лет не изменилось. Ровным счетом, Н И Ч Е Г О...
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, shrecher, Вы писали:
KV>>>Здравствуйте, astral_marine, Вы писали: _>>>>Знаний для работы под С++ надо больше, но это изучается один раз в жизни. KV>>>Гениальная фраза. А можешь дать пример знаний, которые необходимо получать дважды, трижды и т.д? S>>Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи. MK>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было
VB улучшали непрерывно до того, что его скоро не будет. Почему с C# должно быть по другому через 10-20 лет?
Здравствуйте, shrecher, Вы писали:
S>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, shrecher, Вы писали:
S>>>Заметь, "улучшает" в кавычках. Почему нельзя было сделать один раз, хорошо, и не заниматься переделками и так называемыми улучшениями? MK>>Да ё-мае, вообще не понимаю, чего нельзя было сразу с появленияем ПК сделать его идеальным раз и навсегда. S>В контекте этого топика, как раз C++ стандарт сделан очень удачно и существует без изменений.
Для чего нужен C++0x, ума не приложу...
S>>>Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия. MK>>Ну ты же не переживаешь, например, что Intel радикальным образом изменит набор инструкций своих процессоров. S>У Intel-a была такая попытка — Itanium64. Так был послан далеко и надолго, вернулись на Amd64.
Вот и отлично. И это только учит Микрософт не совершать такое же ошибки.
MK>>И с появлением тех же MMX и SSE их тоже приходилось осваивать. И чего? Любая версия .Net поддерживает предыдующие. Изменения делаются в новой версии. S>Ха, ошибочное мнение. Так или иначе, с выходом новой версии, чтобы продуктивно работать, к примеру поддержка, выход обновлений и пр, требуется переход на последнюю версию. Весь маркетинг и пропаганда этого торгового гиганта MS упорно работают на продвижение последний версий.
Так было и будет с любым продуктом. Тем не менее, никто не обязывает тебя переходить на новую версию.
Здравствуйте, shrecher, Вы писали:
S>Здравствуйте, kochetkov.vladimir, Вы писали:
KV>>Здравствуйте, astral_marine, Вы писали:
_>>>Знаний для работы под С++ надо больше, но это изучается один раз в жизни.
KV>>Гениальная фраза. А можешь дать пример знаний, которые необходимо получать дважды, трижды и т.д?
S>Вероятно, имеется ввиду, что Microsoft непререрывно "улучшает" платформу .net. Постоянно нужно что-то доучивать или переучивать, а это отвлекает от конечной задачи.
Не, ну если у программера появляется непреодолимое желание впихнуть в проект все новоиспеченные фишки от MS, как только они появляются в виде CTP, то тогда оно конечно да. Что мешает использовать в проекте заранее оговоренный набор технологий/библиотек и т.п?
Здравствуйте, ononim, Вы писали:
_>>>Главное что бы работа нравилась, а язык — второстепенен. _>>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK>> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы. O>Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак?
Я так понимаю, сами wsWidgets или Qt от операционки никак не зависят. А Qt Software самая святая
_>>>>Главное что бы работа нравилась, а язык — второстепенен. _>>>>C++ используется больше для системных задач и задач, требующих большей эффективности, межплатформенного программирования. А так же теми, кто не любят привычку Microsoft сливать в унитаз свои новые технологии. MK>>> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы. O>>Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак? MK>Я так понимаю, сами wsWidgets или Qt от операционки никак не зависят.
Они есть под распространенные операционки, причем не только под винду.
MK>Я А Qt Software самая святая
Ой насмешили Нету такого — Qt Software. Есть лишь библиотека Qt, написанная Trolltech.
Как много веселых ребят, и все делают велосипед...
MK>>>>> Про слив понравилось! Посмотрим как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы. O>>>>Возьмет wxWidgets или Qt и напишет. А как вы напишете на C# что нить под мак? MK>>>Я так понимаю, сами wsWidgets или Qt от операционки никак не зависят. O>>Они есть под распространенные операционки, причем не только под винду. MK>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt.
Ну и что что зависят? Какая разница это программеру который пишет код под библиотеку а не операционку? .Net в текущей инкорнации сам по себе тоже не более чем надстройка над Win32 API
Как много веселых ребят, и все делают велосипед...
Здравствуйте, MxKazan, Вы писали:
MK>>>Да ё-мае, вообще не понимаю, чего нельзя было сразу с появленияем ПК сделать его идеальным раз и навсегда. S>>В контекте этого топика, как раз C++ стандарт сделан очень удачно и существует без изменений. MK>Для чего нужен C++0x, ума не приложу...
В сравнении с частотой изменений C# это почти что "постоянный".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, ononim, Вы писали:
MK>>>>Я так понимаю, сами wsWidgets или Qt от операционки никак не зависят. O>>>Они есть под распространенные операционки, причем не только под винду. MK>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. O>Ну и что что зависят? Какая разница это программеру который пишет код под библиотеку а не операционку? .Net в текущей инкорнации сам по себе тоже не более чем надстройка над Win32 API
А про .Net я ничего обратного и не говорил. Это меня пытаются убедить в меганезависимости, а не я. Хотя по правде, WPF уже не надстройка над WinAPI.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, alsemm, Вы писали:
MK>>>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было A>>VB улучшали непрерывно до того, что его скоро не будет. Почему с C# должно быть по другому через 10-20 лет? MK>Сначала Дворкин меня задалбывал этим предсказаниями чего там будет через 10-20 лет, теперь вот ты
Не-не-не, он в конце-концов сдался и написал, что "конца С# не будет и никуда он не денется" Re: Сишарпкапец наступает
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали: MK>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы?
А тем, что она все-равно зависима.
Здравствуйте, MxKazan, Вы писали:
MK>>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы? MK>А тем, что она все-равно зависима.
Начинаем спор о словах. Что такое "платформа"? Традиционное понимание — это что-то масштаба операционной системы. В этом смысле Qt предоставляет вполне приличную переносимость, в отличие от.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, shrecher, Вы писали:
MK>>Ну ты же не переживаешь, например, что Intel радикальным образом изменит набор инструкций своих процессоров. S>У Intel-a была такая попытка — Itanium64. Так был послан далеко и надолго, вернулись на Amd64.
вернулись? ты вообще в курсе какой из этих наборов когда появился?
Здравствуйте, _Vasilyev, Вы писали:
_V>По C++ : Не слушайте тех, кто пытается его похоронить, глупости это все субъективные. Съездите на конференцию "Параллельные вычисления"(можете заглянуть на parallel.ru), там мужики и не знают наверное, что есть языки другие, кроме C++.
сам ездил? C и Fortran, плюсы в ж..е.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, alsemm, Вы писали:
MK>>>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было A>>VB улучшали непрерывно до того, что его скоро не будет. Почему с C# должно быть по другому через 10-20 лет? MK>Сначала Дворкин меня задалбывал этим предсказаниями чего там будет через 10-20 лет, теперь вот ты
Я тебе вопрос задал простой — почему C# не повторит путь VB? Можешь ответить спокойно?
MK>Живи С++ и наслаждайся.
Без твоих советов разберусь.
A>>Алексей MK>Марат
Здравствуйте, MxKazan, Вы писали:
ГВ>>Начинаем спор о словах. Что такое "платформа"? Традиционное понимание — это что-то масштаба операционной системы. В этом смысле Qt предоставляет вполне приличную переносимость, в отличие от. MK>И тем не менее мы приходим к тому, что ваша "независимая" Qt'шная прога так или иначе, но зависит от библиотек и от API ОС. Реши производитель операционки радикально что-то поменять, вся ваша платформонезависимость полетит к чертям, пока та же Qt не будет доведена до поддержки нового API. Так вот тоже самое и с утверждениями про зависимость .Net от MS.
Что-то ничего не понял. Куда она полетит? Кто на ком стоял? Ты спрашивал про платформонезависмую программу с GUI на C++. Тебе ответили, что Qt вполне изолирует программу на C++ от особенностей ОС (на уровне исходников). Прямой зависимости "нашей проги" от API ОС в таком случае нет, всё сводится к тому, будет ли работать Qt-шный бинарник с новой версией ОС. А это уже вопросы к производителям ОС — поддержат они обратную совместимость с бинарниками, скомпилированными для предыдущих версий или нет. Обычная практика — поддерживать (справедлива и для Unix, и для Windows, да и вообще, операционки пишут не для того, чтобы с каждой новой версией выкидывать весь старый софт).
Рассуждать о том, что вдруг, гипотетически, вся ОС возьмёт и изменится до полной несовместимости с прежним софтом не вижу никакого смысла, вот когда изменится, там и будем поглядеть.
С .Net та же история и те же принципиальные ограничения. Притом, обрати внимание, Mono реализует дотнетовские API с некоторым запозданием. Как раз иллюстрация к твоим словам.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Что-то ничего не понял. Куда она полетит? Кто на ком стоял? Ты спрашивал про платформонезависмую программу с GUI на C++.
Заметь, я ничего не спрашивал.
ГВ>Рассуждать о том, что вдруг, гипотетически, вся ОС возьмёт и изменится до полной несовместимости с прежним софтом не вижу никакого смысла, вот когда изменится, там и будем поглядеть. ГВ>С .Net та же история и те же принципиальные ограничения. Притом, обрати внимание, Mono реализует дотнетовские API с некоторым запозданием. Как раз иллюстрация к твоим словам.
Именно этого я и добивался. Спасибо
A>Я тебе вопрос задал простой — почему C# не повторит путь VB? Можешь ответить спокойно?
Во-первых, о каком пути VB идет речь? О том, что он помирает? Ну дак и С++ не вечен и в конце-концов тоже "повторит путь VB"
Во-вторых, С# стандартизован.
S>Ха, ошибочное мнение. Так или иначе, с выходом новой версии, чтобы продуктивно работать, к примеру поддержка, выход обновлений и пр, требуется переход на последнюю версию.
Здравствуйте, alsemm, Вы писали:
A>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, alsemm, Вы писали:
MK>>>>Какие только претензии к .Net я не встречал, но чтобы раздражало улучшение платформы, такого еще не было A>>>VB улучшали непрерывно до того, что его скоро не будет. Почему с C# должно быть по другому через 10-20 лет? MK>>Сначала Дворкин меня задалбывал этим предсказаниями чего там будет через 10-20 лет, теперь вот ты A>Я тебе вопрос задал простой — почему C# не повторит путь VB? Можешь ответить спокойно?
Я отвечу.
Уже не повторил.
VB появился в 1991, закончил развиваться в 1998, окончательно умер в 2001 с выходом VB.NET (достойная альтернатива кстати).
C# и .NET появились в 2002 году, то есть по сценарию VB можно ожижать выход последней версии в 2009, но учитывая планы майкрософта по развитию языка(-ов) и платформы в течение трех лет никакой смерти не планируется, даже стагнации на горизонте не видно.
MS очень много денег уже вбухала в .NET и еще немало вбухивает в развитие, и это при том что эта платформа 100% бесплатна.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Здравствуйте, MxKazan, Вы писали: MK>>>>>Ну и что? Специально же уточнил — "сами". Внутри они точно также зависят от операционки. От ОС не зависят только те, кто юзают Qt, но не сама Qt. ГВ>>>>И чем это не ответ на вопрос: как ты напишешь программу на C++ с графическим интерфейсом, но независимую от платформы? MK>>>А тем, что она все-равно зависима. ГВ>>Начинаем спор о словах. Что такое "платформа"? Традиционное понимание — это что-то масштаба операционной системы. В этом смысле Qt предоставляет вполне приличную переносимость, в отличие от. MK>И тем не менее мы приходим к тому, что ваша "независимая" Qt'шная прога так или иначе, но зависит от библиотек и от API ОС. Реши производитель операционки радикально что-то поменять, вся ваша платформонезависимость полетит к чертям, пока та же Qt не будет доведена до поддержки нового API. Так вот тоже самое и с утверждениями про зависимость .Net от MS.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>разработка для мобильных устройств (Compact Framework), разработка игр (см XNA) NBN>По факту это остаётся в рамках приколов, их доля крайне несущественна.
С чего вы взяли?
.NET CF плотно держит рынок быизнес-приложений на мобильных устройствах.
На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA.
G>>4)Зная C# вполне можно писать кросплатформенные приложения с помошью Mono (только десктоп), которые запускаются под Windows, Linux, Mac и iPhone. NBN>Можно, только не стоит.
Ну вам может и не стоит, а другому может быть интересно.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
SA>>>>А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился. NBN>>>Игры G>>GTA 4 вроде как на XNA сделали. NBN>Маловероятно. Пруфлинк?
Насчет XNA в PC версии не уверен, но .NET юзает.
NBN>Я знаю, что есть на хна игры — но это как правило маленькие казуалки конкретно для хабокса.
для хабокса не только кауалки пишут, хабокс имеет неслабое железо и тянет очень хорошие игры.
NBN>>>ембеддед G>>эмбед обычно на голом С делают, я пару раз встречался с эмбедом с разными контроллерами, C++ компилеры для них в полном ужасе. NBN>Эмбеддед разный бывает. Например те же покеты и смарты — где пишут на самом распрекрасном С++ с бустом и прочим. NBN>И к мониторам, холодильникам, кандеям — тоже софт на плюсах пишут (сам участвовал или ходил рядом).
Да уж, вам побольше повезло. Все что мне удалось увидеть в ембеде (не считая покеты и смарты) на С++ тормозило страшно по сравнению с голым С.
Насчет покетов и смартов — там большое засилие java.
NBN>>>миддлеваре G>>это что за зверь такой? NBN>middleware->Google
Причем тут гугл?
NBN>>>шаровары G>>Я так понимаю что на С++ пришут с целью усложнения взлома, реже с целью уменьшения размера. NBN>Нет. Пишут на С++ чтобы хорошо продавалось. Причём тут взлом — вообще непонятно.
А как С++ связан с продажами?
NBN>>>Ну и всё что с ними плотно пересекается — например сильно кросплатформенные программы требующие высокого качества исполнения. G>>Что такое "качество исполнения", как оно с C++ связано? NBN>Качественный софт пишется на С++. Остальные решения скорее всего менее качественны.
Что значит качественный?
С++ имеет чуть ли не самый высокий показатель по плотности багов на единицу функционала при разработке.
NBN>>>Кроме того — части серверных решений требующие перформанса. G>>А примеры такого есть? NBN>Ну к примеру в одном из холиваров рассказывали про серверные решения для дойчебанка. Ищущий — да обрящет.
Ну единичные решения — вполне может быть, что чтобы массово С++ на серверах — такого сейчас нет, в основном java, по-немногу .NET пробирается.
C++ где-то может быть исплючительно по историческим причинам.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>>>По факту это остаётся в рамках приколов, их доля крайне несущественна. G>>С чего вы взяли? NBN>С того что эти проги очень тормозявы.
Ну далеко не всегда быстродействие имеет значение.
G>>.NET CF плотно держит рынок быизнес-приложений на мобильных устройствах. NBN>Что такое бизнесприложение для покета? Быстронаписанная утилитка для какой-то фирмы?
Чаще всего торговля, куча персонала бегает с такими девайсами. Также в ресторанно-гостиничном бизнесе применяется.
Вполне серьезные решения, которые не за неделю пишутся.
G>>На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA. NBN>Маленьких казуал. http://ru.wikipedia.org/wiki/Список_игр_на_Xbox_360
Далеко не все из них маленькие казуалы.
G>>>>4)Зная C# вполне можно писать кросплатформенные приложения с помошью Mono (только десктоп), которые запускаются под Windows, Linux, Mac и iPhone. NBN>>>Можно, только не стоит. G>>Ну вам может и не стоит, а другому может быть интересно. NBN>В том то и дело, что _интересно_. А мы тут делом занимаемся
Вопрос автора топика в чем был?
Он ищет язык для дельнейшего развития, так что ваши предпочтения мало отношения к делу имеют.
Здравствуйте, gandjustas, Вы писали:
G>>>На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA. NBN>>Маленьких казуал. G>http://ru.wikipedia.org/wiki/Список_игр_на_Xbox_360 G>Далеко не все из них маленькие казуалы.
Смотри внимательно на данные, всё что в графе "Эксклюзив." с пунктом "Нет" — скорее всего (95%) не на шарпе Если игра эксклюзивна значит она _может_ быть и на шарпе — но тоже не факт. Например Splinter Cell — хоть и эксклюзив, но плюсы.
Здравствуйте, gandjustas, Вы писали:
G>.NET CF плотно держит рынок быизнес-приложений на мобильных устройствах.
Хахаха.
G>На XNA мало пишут только для писюков, на Zune вообще ниче другого не запустишь, для Xbox 360 подавляющее большенство игр на XNA.
Муахахаххахахаха...
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>Что-то ничего не понял. Куда она полетит? Кто на ком стоял? Ты спрашивал про платформонезависмую программу с GUI на C++. MK>Заметь, я ничего не спрашивал.
Э-э-э... Значит, это был риторический вопрос.
ГВ>>Рассуждать о том, что вдруг, гипотетически, вся ОС возьмёт и изменится до полной несовместимости с прежним софтом не вижу никакого смысла, вот когда изменится, там и будем поглядеть. ГВ>>С .Net та же история и те же принципиальные ограничения. Притом, обрати внимание, Mono реализует дотнетовские API с некоторым запозданием. Как раз иллюстрация к твоим словам. MK>Именно этого я и добивался. Спасибо
Только всё равно не понятно, что ты хотел доказать. Понятно, что любая кроссплатформенная программа остаётся таковой ровно в тех пределах, в которых она поддерживается.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>C# за первые 7 лет своей жизни изменился аж два раза. G>Причем второе изменение было только расширением и сохраняло обратную совместимость как по исходникам, так и по бинарникам. G>При этом C++ как язык меняется с каждо версией компилятора от Intel\Microsoft\gcc.
Меняется не столько сам C++, сколько его реализация. Не одно и то же, однако.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, mrTwister, Вы писали:
T>Здравствуйте, ilvi, Вы писали:
I>>Может я уже чего не помню, но вот второй фреймворк прямо такки поддерживает первый?
T>Да
I>>Может быть он еще полностью обратно совместимый?
T>Да
Значит для програм написанных на первом можно поставить на машину только второй и не ставить первый. Я правильно понял?
NikeByNike пишет:
> NBN>>миддлеваре > G>это что за зверь такой? > middleware->Google
Это какие-то новые веяния. Weblogic чтоль на C++ переписали?
> NBN>>Ну и всё что с ними плотно пересекается — например сильно > кросплатформенные программы требующие высокого качества исполнения. > G>Что такое "качество исполнения", как оно с C++ связано? > Качественный софт пишется на С++. Остальные решения скорее всего менее > качественны.
Круто. По сути остального можно было и не писать Правда мне неясно
как качество (т.е. в общеупотребительном для индустрии смысле —
соответствие программы исходным требованиям) связано с языком, на
котором она написана. Как человек, писАвший на разных языках — не назвал
бы плюсы здесь фаворитом. Скорее рулит Java/.NET, для вещей требующих
низкоуровневых операций — чистый С.
> NBN>>Кроме того — части серверных решений требующие перформанса. > G>А примеры такого есть? > Ну к примеру в одном из холиваров рассказывали про серверные решения для > дойчебанка. Ищущий — да обрящет.
Есть мнение — это вас кто-то обманул. Don't ask me how I know Хотя
дойчбанк он большой, всякое может быть.
> Делать проекты большие 1000 строк, пользуясь языком С, всёравно что > строить кирпичный дом пользуясь совочком и бадейкой, для замешивания > глины и лепки кирпичей.
[В ужасе оглядывается по сторонам] Кстати, "всё равно" — пишется раздельно.
Здравствуйте, hrensgory, Вы писали:
>> NBN>>миддлеваре >> G>это что за зверь такой? >> middleware->Google H>Это какие-то новые веяния. Weblogic чтоль на C++ переписали?
Это значит, что если ты чего-то не знаешь — прежде чем задавать вопросы рекомендуется посмотреть ответ в гугле, скорее всего он там есть.
>> NBN>>Ну и всё что с ними плотно пересекается — например сильно >> кросплатформенные программы требующие высокого качества исполнения. >> G>Что такое "качество исполнения", как оно с C++ связано? >> Качественный софт пишется на С++. Остальные решения скорее всего менее >> качественны. H>Круто. По сути остального можно было и не писать Правда мне неясно H>как качество (т.е. в общеупотребительном для индустрии смысле — H>соответствие программы исходным требованиям) связано с языком, на H>котором она написана. Как человек, писАвший на разных языках — не назвал H>бы плюсы здесь фаворитом. Скорее рулит Java/.NET, для вещей требующих H>низкоуровневых операций — чистый С.
Качественный софт, это красивый, ставящийся и работающий без проблем софт с незаметными тормозами. При определённом уровне этого софта, по отношению к платформе — качественный софт можно написать только на С++.
С вообще недоязык от которого одни проблемы. Он имеет самое крохотное преимущество перед плюсами — доступность компилера, для совсем уж убитых платформ.
>> Ну к примеру в одном из холиваров рассказывали про серверные решения для >> дойчебанка. Ищущий — да обрящет. H>Есть мнение — это вас кто-то обманул. Don't ask me how I know Хотя H>дойчбанк он большой, всякое может быть.
Тем не менее С++ серверных решений достаточно дофига.
>> Делать проекты большие 1000 строк, пользуясь языком С, всёравно что >> строить кирпичный дом пользуясь совочком и бадейкой, для замешивания >> глины и лепки кирпичей. H>[В ужасе оглядывается по сторонам] Кстати, "всё равно" — пишется раздельно.
Мне пофиг, а ты нарушаешь правила форума.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>C# за первые 7 лет своей жизни изменился аж два раза. G>>Причем второе изменение было только расширением и сохраняло обратную совместимость как по исходникам, так и по бинарникам. G>>При этом C++ как язык меняется с каждо версией компилятора от Intel\Microsoft\gcc.
ГВ>Меняется не столько сам C++, сколько его реализация. Не одно и то же, однако.
Ну и в чем различия?
Здравствуйте, NikeByNike, Вы писали:
G>>Платят то за решение задачи, а не "решение задачи на С++". NBN>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
Странно читать такое... По-моему, так любой язык не тянущий на себе/с собой груза абстракций, вполне пригоден для этого. Например вот: Lazarus IDE for FreePascal
Здравствуйте, gandjustas, Вы писали:
G>Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
Статистика показывает обратное -- таки зависит. Если это не очередное сотрясание воздуха, а вопрос тебе действительно интересен, рекомендую поискать материалы о том, как родилась Ada, и что стало причиной этого рождения.
NBN>>Во-вторых, качественный — значит качественный, софт который легко ставится, имеет нативный интерфейс и тормозит незаметно. G>Офигеть, то есть пофиг чего софт делает, лишь бы нативный интрефейс и "тормозил незаметно". G>Странные у вас предстваления о качестве.
При аналогичной функциональности, выбор идет в рамках озвученных тезисов. Кстати, в ветке про Avalon, Mamut писал, что отзывчивость Avalon'а лучше чем у "прообраза" (к тому же выглядит для платформ нативным, ну или почти ).
Здравствуйте, hattab, Вы писали:
NBN>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
H>Странно читать такое... По-моему, так любой язык не тянущий на себе/с собой груза абстракций, вполне пригоден для этого. Например вот: Lazarus IDE for FreePascal
В абстрактно случае — да. В практическом — где ты возмёшь программистов, где примеры/фрагменты/куски кода и т.п. вещи?
NikeByNike пишет:
>> > NBN>>миддлеваре >> > G>это что за зверь такой? >> > middleware->Google > H>Это какие-то новые веяния. Weblogic чтоль на C++ переписали? > Это значит, что если ты чего-то не знаешь — прежде чем задавать вопросы > рекомендуется посмотреть ответ в гугле, скорее всего он там есть.
Здравый совет, воспользуюсь. Вдруг мои познания уже безнадёжно устарели,
всякое бывает.
Middleware is computer software that connects software components or
applications.
... skipped ...
Organizations
----------------------------------------------------------------
IBM, Red Hat, and Oracle Corporation are major vendors providing
middleware software.
И что же написано на C++? WebSphere (IBM), JBoss (RedHat) или OracleAS с
Weblogic (Oracle)?
> Качественный софт, это красивый, ставящийся и работающий без проблем > софт с незаметными тормозами. При определённом уровне этого софта, по > отношению к платформе — качественный софт можно написать только на С++.
"... и возмутительнее всего то, что говорите ее безапелляционно и
уверенно" (с)
Здравствуйте, COFF, Вы писали:
COF>При этом .нет на рынке уже почти 10 лет
Нормальному .Net совсем не 10 лет и даже не 5. Я говорю про .Net 2.0.
Ну а если скатится до совсем совсем 1-го FW, то и ему 7 лет, ага.
COF>Но так получается, что все интересные темы пишутся на C++.
И конца и края этому нет, ведь всегда можно сказать, что многое из уже написанного, сделано на C++. Значит надо учить С++. А если все учат только С++... И это сладкое слово "хардкор" — не то, что формощлепщик, правда
Здравствуйте, COFF, Вы писали:
COF>Codebase — это конечно да. Но 10 лет — это достаточный срок, чтобы переписать весь существующий codebase если это переписываение действительно даст преимущества. Я думаю, дело в другом, с одной стороны, управляемые языки не дают того рекламированного преимущества для действительно больших и сложных проектов. С другой стороны, они дают сильную зависимость от поставщика рантайма плюс немалую вероятность в один прекрасный момент упереться в какое-нибудь ограничение этого самого рантайма с неясной перспективой что делать дальше.
Я думал мы уже пришли
к мнению, что вся эта независимость в случае нативного языка такая же вымышленная. Все эти вероятностные рассуждения о критических изменениях и затыках точно также равносильны и в неуправляемых языках. Разве что там можно похардкорить и глядишь проскочит. Но это же не райт-вэй
Здравствуйте, gandjustas, Вы писали:
G>Кроме того даже если Sun откажеться от Java или MS откажется от .NET, ни то ни другое не исчезнет моментально, никто вам не помешает поставить .NET FW или JRE и пользовать программы.
Я работал в компании где около 40mb кода на VB6.
Когда MS отказалась от подержки VB6 и Win XP (офциально VB6 в Viste не поддерживаеться) руководство не смотрело на жизнь столь оптимистично как вы.
90% кода отнюдь не формочки и просто так его под VB.NET не втащить.
Здравствуйте, sergey2b, Вы писали:
S>Здравствуйте, gandjustas, Вы писали:
G>>Кроме того даже если Sun откажеться от Java или MS откажется от .NET, ни то ни другое не исчезнет моментально, никто вам не помешает поставить .NET FW или JRE и пользовать программы.
S>Я работал в компании где около 40mb кода на VB6. S>Когда MS отказалась от подержки VB6 и Win XP (офциально VB6 в Viste не поддерживаеться) руководство не смотрело на жизнь столь оптимистично как вы.
И прямо сразу код перестал запускаться?
До сих пор при желании код на vb можно запустить.
Кое-де до сих пор живые сайны на asp (без .NET), написанные на VB есть.
А руководсто я очень понимаю, я бы тоже на из месте расстроился.
Здравствуйте, gandjustas, Вы писали:
S>>Я работал в компании где около 40mb кода на VB6. S>>Когда MS отказалась от подержки VB6 и Win XP (офциально VB6 в Viste не поддерживаеться) руководство не смотрело на жизнь столь оптимистично как вы. G>И прямо сразу код перестал запускаться? G>До сих пор при желании код на vb можно запустить.
Код запускаеться, стоимость программы такова что клиент если эта надо будет, будет сидеть на XP еше N лет. Но рано или поздно перестанут делать драйвера для XP да можно будет под VP использовать но понятно что то надо с этим делать.
Но что вы будете делать если MS прекратит саппорт .NET или сделает .NET 10 не совместимым а у вас на руках несколько десятков мегабайт исходников.
Здравствуйте, gandjustas, Вы писали:
G>И даже несмотря на все рассказы о "стабильности" С++ (хотя это уже признак деградации), постоянно выходят новые версии библиотек типа Qt, Boost и прочих
А какое отношение QT и Boost имеют к стандарту С++?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
NBN>>Игры G>GTA 4 вроде как на XNA сделали.
Крайне сомнительно. GTA4 на XNA это такой бегемот получится что просто не взлетит.
NBN>>шаровары G>Я так понимаю что на С++ пришут с целью усложнения взлома, реже с целью уменьшения размера.
Сходи на RSDN Shareware форум — там эта тема иногда подымается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, NikeByNike, Вы писали:
NBN>>Здравствуйте, gandjustas, Вы писали:
SA>>>>>А я вот третий день брожу по улицам и думаю — где бы мне такую задачу найтить, чтобы там С++ непременно понадобился. NBN>>>>Игры G>>>GTA 4 вроде как на XNA сделали. NBN>>Маловероятно. Пруфлинк? G>Насчет XNA в PC версии не уверен, но .NET юзает.
А что именно юзает? Какой компонент?
NBN>>Я знаю, что есть на хна игры — но это как правило маленькие казуалки конкретно для хабокса. G>для хабокса не только кауалки пишут, хабокс имеет неслабое железо и тянет очень хорошие игры.
Сколько из них написано на XNA?
NBN>>>>миддлеваре G>>>это что за зверь такой? NBN>>middleware->Google G>Причем тут гугл? Тебе предлагают найти ответ на вопрос: "миддлеваре. это что за зверь такой?" в гугле.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hrensgory, Вы писали:
H>Это какие-то новые веяния. Weblogic чтоль на C++ переписали?
Не, это советуют в гугле значение термина middleware поискать.
H>Есть мнение — это вас кто-то обманул. Don't ask me how I know Хотя H>дойчбанк он большой, всякое может быть.
Лично участвовал в С++ серверном проекте для унесённого ныне кризисом Lehman Brothers.
H>[В ужасе оглядывается по сторонам] Кстати, "всё равно" — пишется раздельно.
Зануда
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, MxKazan, Вы писали:
COF>>Но так получается, что все интересные темы пишутся на C++. MK>И конца и края этому нет, ведь всегда можно сказать, что многое из уже написанного, сделано на C++. Значит надо учить С++. А если все учат только С++... И это сладкое слово "хардкор" — не то, что формощлепщик, правда ;)
Правда :) А разве бизнес — не сладкое слово, или уже не сладкое? ;)
Здравствуйте, COFF, Вы писали:
COF>Соответственно, автору топика, выбор зависит от того, чем хотелось бы заниматься. Если "хардкорным" программированием (коробочные продукты, игры, наукоемкие вещи) — то C++. Если бизнес программированием (веб, базы данных и т.п.) — то C#.
наукоёмкие вещи — скорее и наукоёмкие языки понадобятся коробки — напополам, новые продукты лучше делать на C#. в играх порядка половины кода не требует супер-быстродействия, так что опять же все шансы у более современных языков
Здравствуйте, BulatZiganshin, Вы писали:
G>>Ну во время появления ada (1993 год) вполне могло и зависеть.
BZ>1979
1974 — Инициатива МО США. Формирование требований.
1975 — Начало разработки.
1977 — Предложение о создании нового языка.
1983 — Ada становится стандартом ANSI/MIL-STD-1815A-1983
Здравствуйте, BulatZiganshin, Вы писали:
BZ>т.е. на писюки стали ставить макос вместо винды? :)
Именно, стали продавать писюки с макос. Называются imac и ibook :) Их доля хотя сравнительно невелика, но постоянно растет. Маки стали продавать в обычных компьютерных магазинах типа Кея в Питере, раньше такого не было.
Здравствуйте, COFF, Вы писали:
COF>Codebase — это конечно да. Но 10 лет — это достаточный срок, чтобы переписать весь существующий codebase
какие 10 лет? 10 лет назад была тормозная зачаточная ява без IDE. реально лет 5 назад стало очевидно, что java/c# выгодны в разработке. вот и поищи программы, которые были начаты в последние 5 лет
всякие трейдинг системы — ява/с# обычно. сейчас какой-то проект ibm-sun началмся, связанный с облачными вычислениями — там тоже ява.
Здравствуйте, COFF, Вы писали:
COF>Именно, стали продавать писюки с макос. Называются imac и ibook Их доля хотя сравнительно невелика, но постоянно растет. Маки стали продавать в обычных компьютерных магазинах типа Кея в Питере, раньше такого не было.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>наукоёмкие вещи — скорее и наукоёмкие языки понадобятся :) коробки — напополам, новые продукты лучше делать на C#. в играх порядка половины кода не требует супер-быстродействия, так что опять же все шансы у более современных языков
Я смогу назвать язык более современным чем C++ только если этот язык будет позволять сделать все то же самое что и C++ (в том числе и в плане эффективности), будет позволять сделать что-то, что C++ не позволяет, возможно избавится от косяков C++. Вот это и будет более современный язык. А назвать язык более современным только потому, что там есть сборка мусора я не могу. Это просто другой язык.
Здравствуйте, Unhandled_Exception, Вы писали:
U_E>Здравствуйте, MxKazan, Вы писали:
MK>> Хотя по правде, WPF уже не надстройка над WinAPI.
U_E>компоненты WPF не используют WinAPI?...
Не-а, рни с помощью directx рисуются
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>в таком случае языка современней машинных кодов, в твоём понимании так и не появилось. но почему-то люди, включая тебя пишут на языках постарее — асме, c++ том же
COF>Хорошие компиляторы генерируют достаточно неплохой код и то иногда приходится на ассемблере модули использовать
я говорил не об асме, а машинном коде. ты ведь понимаешь, что асм не всегда генерит тот код, который нужен?
BZ>>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
COF>Аналогия вещь хорошая, но обоюдоострая. Представь, что все начнут мусор не в урны кидать, а на землю — все равно дворник потом подберет Наверное, это будет не очень хорошо. Продуманная стратегия управления ресурсами в C++ позволяет не заботиться о памяти точно в такой же высокоуровневой манере.
точно. а продуманная структура управления регистрами и явное использование адресов памяти в программе ещё круче, вот только несколько дороговато в разработке. язык — это средство описания алгоритма, а не детального расписывания того, что должен процессор делать каждый из 3 миллиардов циклов в секунду если ты так нацелен контролировать свой процессор, то тебе нужны машкоды и что-нибудь неспекулятивное
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, BulatZiganshin, Вы писали:
G>>>Ну во время появления ada (1993 год) вполне могло и зависеть.
BZ>>1979
H>1974 — Инициатива МО США. Формирование требований. H>1975 — Начало разработки. H>1977 — Предложение о создании нового языка. H>1983 — Ada становится стандартом ANSI/MIL-STD-1815A-1983
H>Как по мне, так 1983.
Ага, это я опечатался.
Здравствуйте, gandjustas, Вы писали:
G>В такой аналогии нужно больше деталей. G>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. G>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать :) А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков?
Здравствуйте, BulatZiganshin, Вы писали:
BZ>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости.
Мемориликов в годовалом проекте нет, хотя в ходе разработки тестирования на лики не производилось.
Здравствуйте, COFF, Вы писали:
BZ>>какие 10 лет? 10 лет назад была тормозная зачаточная ява без IDE. реально лет 5 назад стало очевидно, что java/c# выгодны в разработке. вот и поищи программы, которые были начаты в последние 5 лет
COF>Я где-то в 94 году видел в книге по C++ главу — что такое ява и как скоро она заменит C++
конечно, в книгах по c++ о яве стали писать лет за 10 до её появления почитай книги о яве — наверняка там уже пищут о том, что её заменит лет через 20
Здравствуйте, gandjustas, Вы писали:
G>В такой аналогии нужно больше деталей. G>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение.
И тут вжииик, и оказывается что у меня на компе мало памяти... Всего гиг. Пока не поставил серьёзное ява приложение не догадывался, что у меня мало памяти.
G>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
Ага, особенно это интересно на телефоне, где тебе приходится заниматься колдовством, вместо нормального распределения ограниченного ресурса
Здравствуйте, BulatZiganshin, Вы писали:
BZ>точно. а продуманная структура управления регистрами и явное использование адресов памяти в программе ещё круче, вот только несколько дороговато в разработке. язык — это средство описания алгоритма, а не детального расписывания того, что должен процессор делать каждый из 3 миллиардов циклов в секунду :) если ты так нацелен контролировать свой процессор, то тебе нужны машкоды и что-нибудь неспекулятивное :)
Язык должен быть в состоянии и описать алгоритм на высоком уровне, и дать возможность распределить регистры если это нужно (а это иногда бывает нужно). Дать возможность использовать сборку мусора, где удобно, или отказаться от нее. Вот это идеал, с моей точки зрения. Сейчас C++ по сравнению с другими распространенными языками наиболее близко подходит к нему, поэтому и популярен. А когда говорят, что ручное распределение памяти вам не нужно, регистры вам не нужны, ваше дело высокоуровнево алгоритмы описывать, то сразу же возникает вопрос, а как тогда эти задачи решать и кто их будет решать? Инопланетяне? :)
Здравствуйте, BulatZiganshin, Вы писали:
BZ>в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких
Ага, напоминает известное предложение ставить большие баки на речные суда и заполнять их водой. Типа если натыкаешься на мель — просто сливаешь воду и плывёшь себе дальше
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>я в это не вкладываю какое-то идеологическое наполнение, просто мне не нравится термин "управляемые языки", поскольку ВМ я как раз считаю не самым важной в них вещью. мой опыт программирования говорит, что принципиальна как раз GC, поскольку он позволяет не задумываться о выделении и освобождении памяти и тем самым писать алгоритмы в более высокоуровневой манере. представь себе, что ты в док-ве мат. теоремы описываешь "а здесь мы освобождаем значение x, поскольку оно нам не понадобится в дальнейшем ходе док-ва"
NBN>Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости. NBN>Мемориликов в годовалом проекте нет, хотя в ходе разработки тестирования на лики не производилось.
на фортране вообще не было распределения памяти, вопрос только в том, в каком стиле при этом приходится программировать и за какими ограничениями следить, чтобы не дай бог не потерять память
Здравствуйте, denisko, Вы писали:
D>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>Здравствуйте, COFF, Вы писали:
COF>>>Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков?
BZ>>а ты следишь за всеми процесами в системе и напрягаешься от мусора в памяти?
BZ>>в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких D>Обычно, для однотипных данных, которых много, выделяют тем или иным способ свой уже фрагментированный пул. Это позволяет 1) контролировать тех, кто не отдал память вовремя 2) работать быстро и со строго ограниченным сверху размером выделенной памяти.
А некоторые вообще пишут свой GC...
D>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой?
Этого не гарантирует даже аллокатор ОС, в принципе этого не может гарантировать никто.
Здравствуйте, COFF, Вы писали:
COF>Язык должен быть в состоянии и описать алгоритм на высоком уровне, и дать возможность распределить регистры если это нужно (а это иногда бывает нужно). Дать возможность использовать сборку мусора, где удобно, или отказаться от нее. Вот это идеал, с моей точки зрения. Сейчас C++ по сравнению с другими распространенными языками наиболее близко подходит к нему, поэтому и популярен. А когда говорят, что ручное распределение памяти вам не нужно, регистры вам не нужны, ваше дело высокоуровнево алгоритмы описывать, то сразу же возникает вопрос, а как тогда эти задачи решать и кто их будет решать? Инопланетяне?
я их и решаю на C++. когда это необходимо. а остальное пишу на хаскеле. учитывая, что >90% кода не нуждается в ассемблерной эффективности, писать всё на С++ — это всё равно что всюду таскать с собой ружьё на случай нападения медведя из ЕР
Здравствуйте, NikeByNike, Вы писали:
NBN>И тут вжииик, и оказывается что у меня на компе мало памяти... Всего гиг. Пока не поставил серьёзное ява приложение не догадывался, что у меня мало памяти.
у меня столько один firefox сейчас жрёт
G>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет. NBN>Ага, особенно это интересно на телефоне, где тебе приходится заниматься колдовством, вместо нормального распределения ограниченного ресурса
вот на телефоне и занимайся шаманством с памятью на С, в 80-х годах мы как-то умещались в 640 кб
Здравствуйте, gandjustas, Вы писали:
G>А некоторые вообще пишут свой GC...
Выделить пулы не требует написания кода практически.
D>>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой? G>Этого не гарантирует даже аллокатор ОС, в принципе этого не может гарантировать никто.
А два сообщения выше вы написали, что гарантия 3x Врать не ходошо
Здравствуйте, denisko, Вы писали:
D>Обычно, для однотипных данных, которых много, выделяют тем или иным способ свой уже фрагментированный пул. Это позволяет 1) контролировать тех, кто не отдал память вовремя 2) работать быстро и со строго ограниченным сверху размером выделенной памяти.
ага. когда у тебя 10 библиотек, они вилимо собираются вместе и договариваются об общем пуле
D>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой?
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>В такой аналогии нужно больше деталей. G>>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. G>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
COF>Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков?
А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. И GC не будет.
А если кончится реальная физическая память, то страницы будут вытеснены, а освободившая память отдастся тому кому оно нужно.
Здравствуйте, gandjustas, Вы писали:
COF>>Так вот дворник сидит и смотрит — вроде пока мусор никому не мешает ходить, можно еще покурить или даже поспать А то что людям может быть неприятно, когда мусор на улице валяется так это не дворника дело. С GC ситуация та же — в рамках процесса он может и понимает что мусор может кому-то помешать, а если таких процессов в системе пара десятков? G>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. И GC не будет. G>А если кончится реальная физическая память, то страницы будут вытеснены, а освободившая память отдастся тому кому оно нужно.
И тут можно доставать травку, чтобы картинка на мониторе выглядела более плавной
Здравствуйте, BulatZiganshin, Вы писали:
BZ>читай внимательно. в языках с gc гарантия — на 3x, можно и меньше. в C++ — гарантий никаких, расход может быть каким угодно прсто потому что память усеяна мелкими дырками
C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался.
Здравствуйте, COFF, Вы писали:
COF>Ну, беты появились года за два до релиза — вот и выходит почти 10 лет.
Ну, отсчитывать от бет неприлично. Не думаешь же ты, что кто-то начинал переводить проекты при бете
COF>Потом, почему именно 2.0? Где гарантия, что завтра не будешь говорить то же самое про 3.5?
Черт. Я знал, что так напишешь
COF>Вообще, я же не против .нет, я против огульного охаивания C++ определенными дот-нетчиками
Вот тут я тебя полностью понимаю. И я тоже против огульного охаивания .Net и его приравнивания к VB.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>А программа на C++ будет корректировать выделние памяти в зависимости от загруженности компьютера? Конечно нет. NBN>При необходимости? Конечно да!
И каким образом?
G>>И GC не будет. NBN>Потому что не сможет
При необходимости? Конечно сможет, только это не надо никому.
Если память нужна, а её не хватает, то уже надо программу переписывать.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>я их и решаю на C++. когда это необходимо. а остальное пишу на хаскеле. учитывая, что >90% кода не нуждается в ассемблерной эффективности, писать всё на С++ — это всё равно что всюду таскать с собой ружьё на случай нападения медведя из ЕР
COF>Вообще, изначально вопрос стоял так — стоит ли учить C++ или C#? Я так понимаю, что все-таки C++?
неправльно понимаешь. C++ это для тех кто хочет заниматься "хардкором" в программировании. Это примерно как в "хардкорных" фильмах про то как четыре негра, размером со шкаф, трахают девушку во все мыслимые и немыслимые отверстия, только в программировании.
Изначально вопрос стоял какой язык учить для дальнейшего развития.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, COFF, Вы писали:
G>Язык C++ не обладает возможностью описать алгоритм на высоком уровне. G>Если не верите, то попробуйте написать алгоритм решения задачи: "вывести на экран все строки текстового файла, в которых более трех слов, отсортированные по алфавиту". G>Причем это долно быть не наколеночное решение, а production-quality код, в котором можно без особых услий убрать условие, или сделать вывод только уникальных строк, или вывод строк через одну.
Здравствуйте, MescalitoPeyot, Вы писали:
MP>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, COFF, Вы писали:
G>>Язык C++ не обладает возможностью описать алгоритм на высоком уровне. G>>Если не верите, то попробуйте написать алгоритм решения задачи: "вывести на экран все строки текстового файла, в которых более трех слов, отсортированные по алфавиту". G>>Причем это долно быть не наколеночное решение, а production-quality код, в котором можно без особых услий убрать условие, или сделать вывод только уникальных строк, или вывод строк через одну.
MP>А чем C# на этой задаче лучше?
Linq + yield
Можете запостить сюда код решения на C++
Здравствуйте, gandjustas, Вы писали:
G>неправльно понимаешь. C++ это для тех кто хочет заниматься "хардкором" в программировании. Это примерно как в "хардкорных" фильмах про то как четыре негра, размером со шкаф, трахают девушку во все мыслимые и немыслимые отверстия, только в программировании.
Здравствуйте, gandjustas, Вы писали:
NBN>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался. G>Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его. G>На C++ такое получится?
Я тут на днях написал программку которая сейчас находится топе5 продаж.
P.S.
Я не понял — ты хочешь длинной померяться? Так сразу и говори
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался. G>>Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его. G>>На C++ такое получится?
NBN>Я тут на днях написал программку которая сейчас находится топе5 продаж.
Продажи к свойствамя языка никакого отношения не имеют.
NBN>P.S. NBN>Я не понял — ты хочешь длинной померяться? Так сразу и говори
Не хочу меряться, хочу показать что на С++ далеко не все можно сделать с трудозатратами сравнимыми с управляемым языком.
Здравствуйте, niellune, Вы писали:
N>Здравствуйте! Нужен ваш совет)) N>Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию? N>В каких областях сейчас применяется C++?
Везде, куда ни кинь, просто где-то чаще, где-то реже. И положение ещё долго не изменится, хотя история похорон C++ насчитывает едва ли не больше времени, чем история его развиия.
N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++ N>Просто мне кажется, что объем знаний С++ требуется гораздо больший, а хочется работать и набираться опыта..
Тут дело вот в чём: на C/C++ так или иначе реализовано практически всё, с чем ты работаешь, от Web-серверов до компиляторов. Но это не означает, что заняв вакансию C++-разработчика тебе понадобится весь тот же багаж знаний, который нужен, скажем, разработчику компилятора. И следовательно, это не означает, что эти самые знания у тебя появятся по ходу работы: работа на С++ тоже может оказаться унылой и монотонной. Больше того, тебе могут запретить использовать даже какие-то аспекты C++ (встречается и такая альтернативная одарённость).
N>У меня есть опыт работы на php, причем не только web, а еще что-то вроде создания системы документооборота) N>Но php мне уже мало и он мне порядком надоел, хочется развиваться дальше.
Развиваться — куда?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, NikeByNike, Вы писали:
NBN>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
Любая встравиваемая real-life JVM — это только C.
Телефонный софт (OS, стандартные приложения) — только C.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>в языках без gc расход памяти меньше в краткосрочном плане. а вот когда память выделяется, возвращается, снова выделяется — ты получаешь фрагментированную память и ничего с ней не поделаешь. поэтому для таких программ GC выгодней — есть хоть гарантии что расход памяти будет не более чем в три раза выше, нежели реальное использование. в c++ гарантий никаких
Для избавления от фрагментации памяти примеются специальные аллокаторы/менеджеры с пулами. Например в Delphi, c версии 2006 идет FastMM:
Description:
A fast replacement memory manager for CodeGear Delphi Win32 applications that
scales well under multi-threaded usage, is not prone to memory fragmentation,
and supports shared memory without the use of external .DLL files.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, COFF, Вы писали:
COF>>Именно, стали продавать писюки с макос. Называются imac и ibook Их доля хотя сравнительно невелика, но постоянно растет. Маки стали продавать в обычных компьютерных магазинах типа Кея в Питере, раньше такого не было.
BZ>и конечно, в этом виноват C#, а не таланты Джобса
Талантами Джобса Apple сидел на PowerPC пока не стало 100% ясно, что если так будет продолжаться, то они совсем рынок потеряют.
Так что талант тут может и не причем, может просто в этот раз M$ слажал.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
NBN>>>Я тут на днях написал программку которая сейчас находится топе5 продаж. G>>Продажи к свойствамя языка никакого отношения не имеют. NBN>Имеют достаточно прямые. На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям
Черт, а я писал, наверное не так что-то делал.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение. G>>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
H>Я вчера решил помониторить сборку xmlrpc для .Net (http://www.xml-rpc.net/). В общем, на каждый вызов метода через XML-RPC (метод принимает два параметра и возвращает бинарник на ~200Kb) происходит 3 вызова сборщика мусора (мониторил ProcessExplorer'ом). Я на перформанс даже тестировать не стал...
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Ну покажите примеры программ на десктопе которые тормозят и жрут память?
H>О-о-о! Их есть у меня Это чудо называется Creative Docs .NET. После запуска, без открытого документа, мило кушает 192 метра + виртуалки в районе 180 (по показаниям ProcessExplorer'a). Скорость работы с документом тоже потрясная: при скроллинге сперва прокручиваются линейки, а потом, неспешно, за ними ползет содержимое документа. Терпения хватает только на посмотреть. PM 1.7 512Mb NVidia GeForceFX Go5200.
Ну напишите получше на C+ или на вашем любимом Delphi.
Или просто не пользуйтесь тормознутым барахлом.
Здравствуйте, gandjustas, Вы писали:
G>>>Продажи к свойствамя языка никакого отношения не имеют. NBN>>Имеют достаточно прямые. На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям G>Черт, а я писал, наверное не так что-то делал.
Ты всё время забываешь про такую штуку как требования
Здравствуйте, gandjustas, Вы писали:
G>>>>Вот так и с дворником — пока мусор никому не мешает, он его убирать не будет, перед тем как кому-то он сможет помешать — сразу же уберет.
H>>Я вчера решил помониторить сборку xmlrpc для .Net (http://www.xml-rpc.net/). В общем, на каждый вызов метода через XML-RPC (метод принимает два параметра и возвращает бинарник на ~200Kb) происходит 3 вызова сборщика мусора (мониторил ProcessExplorer'ом). Я на перформанс даже тестировать не стал...
G>Сборка мусора иногда происходит и что?
3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна.
Здравствуйте, hattab, Вы писали:
H>О-о-о! Их есть у меня Это чудо называется Creative Docs .NET. После запуска, без открытого документа, мило кушает 192 метра + виртуалки в районе 180 (по показаниям ProcessExplorer'a). Скорость работы с документом тоже потрясная: при скроллинге сперва прокручиваются линейки, а потом, неспешно, за ними ползет содержимое документа. Терпения хватает только на посмотреть. PM 1.7 512Mb NVidia GeForceFX Go5200.
Creative Docs .Net словно на бете WPF делали — жуткие шрифты какие-то
И всё же там не 192 и даже с открытым документом:
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>>>Продажи к свойствамя языка никакого отношения не имеют. NBN>>>Имеют достаточно прямые. На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям G>>Черт, а я писал, наверное не так что-то делал.
NBN>Ты всё время забываешь про такую штуку как требования
Я про требования ни разу не забывал.
Здравствуйте, hattab, Вы писали:
H>3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна.
Ну мало ли что там делает это один вызов. Ты не на число запусков сборщика смотри, а на общий перформанс. При этом я ничего не обещаю, просто хочу сказать, что не стоит так сильно заморачиваться почему происходит вызов GC. В конце концов тот же rpc-xml может это сам явно делать по каким-то своим умозаключениям. У меня вот в WPF'ной проге, окна иной раз не собираются по 10-20 минут. Можно ли быть уверенным, что моя прога в сто раз быстрее твоей?
Здравствуйте, MxKazan, Вы писали:
H>>О-о-о! Их есть у меня Это чудо называется Creative Docs .NET. После запуска, без открытого документа, мило кушает 192 метра + виртуалки в районе 180 (по показаниям ProcessExplorer'a). Скорость работы с документом тоже потрясная: при скроллинге сперва прокручиваются линейки, а потом, неспешно, за ними ползет содержимое документа. Терпения хватает только на посмотреть. PM 1.7 512Mb NVidia GeForceFX Go5200. MK>Creative Docs .Net словно на бете WPF делали — жуткие шрифты какие-то
Да, глаза он мне все поломал Там на сайте написано, что у них какая-то своя библа, вроде даже с AntiGrain.
MK>И всё же там не 192 и даже с открытым документом: MK>
У меня отложилось 192, я пробовал, когда его упомянули в теме о продуктах МС.
Здравствуйте, hattab, Вы писали:
H>У меня отложилось 192, я пробовал, когда его упомянули в теме о продуктах МС.
Я, кстати, обратил внимание, что подобное было при первом запуске. Отодрал не 192, около 112 болтался.
Но все последующие запуски держались в районе 70-80 после всяких прокруток и зумов сэмпловых документов.
Здравствуйте, gandjustas, Вы писали:
H>>>>Я вчера решил помониторить сборку xmlrpc для .Net (http://www.xml-rpc.net/). В общем, на каждый вызов метода через XML-RPC (метод принимает два параметра и возвращает бинарник на ~200Kb) происходит 3 вызова сборщика мусора (мониторил ProcessExplorer'ом). Я на перформанс даже тестировать не стал...
G>>>Сборка мусора иногда происходит и что?
H>>3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна. G>Ну так вы померяйте перформанс, а то какие-то пространные размышления ни о чем.
Чтоб полноценно померить перформанс нужно и сервер под .Net писать, а мне пока есть чем заняться Я же, просто посмотрел на работу клиентской части.
Здравствуйте, gandjustas, Вы писали:
G>Почему это? На C++ в среднем надо написать больше кода для получения того же функционала, значит больше трудозатраты, значит увеличивается делитель в формуле, а следовательно уменьшается качество.
Здравствуйте, MxKazan, Вы писали:
H>>3 раза на один вызов это иногда? Несколько последовательных вызовов сразу задирают тактовую частоту с 600 до 1700, при том, что при аналогичных действиях из нативного клиента частота поднимается максимум до 800. Тут нужно пояснить, что вся тяжелая работа (линейный скаллинг картинки) делается в нативном сервере (он запущен локально), клиентская часть лишь формирует запрос и получает ответ т.е. ее работа минимальна.
MK>Ну мало ли что там делает это один вызов.
Работа конкретно xmlrpc.net в данном случае это: сериализация двух параметров + имя метода в формат пакета XML-RPC, передача на сервер по HTTP/1.1, получение ответа и его десериализация в объектную модель.
MK>Ты не на число запусков сборщика смотри, а на общий перформанс. При этом я ничего не обещаю, просто хочу сказать, что не стоит так сильно заморачиваться почему происходит вызов GC.
Большое количество вызовов GC это прямой урон перформансу, он же не просто так дергается, он собирает чего-то. К тому же счетчик %Time In GC совсем не нулевой, да еще и на таком коротком отрезке времени (чему я был сильно удивлен). Я сейчас не говорю о каких-то цифрах, я об общем поведении.
MK>В конце концов тот же rpc-xml может это сам явно делать по каким-то своим умозаключениям. У меня вот в WPF'ной проге, окна иной раз не собираются по 10-20 минут. Можно ли быть уверенным, что моя прога в сто раз быстрее твоей?
Здравствуйте, COFF, Вы писали:
BZ>>я их и решаю на C++. когда это необходимо. а остальное пишу на хаскеле. учитывая, что >90% кода не нуждается в ассемблерной эффективности, писать всё на С++ — это всё равно что всюду таскать с собой ружьё на случай нападения медведя из ЕР
COF>Вообще, изначально вопрос стоял так — стоит ли учить C++ или C#? Я так понимаю, что все-таки C++?
я ему ответил — смотря что делать собираешься. если готов лет 5 ходить в подмастерьях и затем заниматься какими-то узконишевыми вещами — можно рискнуть
Здравствуйте, NikeByNike, Вы писали:
NBN>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался.
асм ещё универсальней. подумай, почему с 80-х годов им перестали пользоваться
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, gandjustas, Вы писали:
G>>Такая ситуация существует и на практике. Множественные операции выделения-освобождения памяти происходят гораздо бытсрее в коде на .NET, чем в коде на C++.
M>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ?
потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
Здравствуйте, hattab, Вы писали:
H>Большое количество вызовов GC это прямой урон перформансу, он же не просто так дергается, он собирает чего-то. К тому же счетчик %Time In GC совсем не нулевой, да еще и на таком коротком отрезке времени (чему я был сильно удивлен). Я сейчас не говорю о каких-то цифрах, я об общем поведении.
а причём тут короткий отрезок? малые gc достаточно равномерно по ходу выполнения распределены, если бы большие gc с такой счастотой выделялись, то >90% времени только на них бы уходило
Здравствуйте, BulatZiganshin, Вы писали:
H>>Для избавления от фрагментации памяти примеются специальные аллокаторы/менеджеры с пулами. Например в Delphi, c версии 2006 идет FastMM: H>>
Description:
H>> A fast replacement memory manager for CodeGear Delphi Win32 applications that
H>> scales well under multi-threaded usage, is not prone to memory fragmentation,
H>> and supports shared memory without the use of external .DLL files.
BZ>ага. и как можно устранить дефрагментацию памяти, а не просто в description это вписать — не подскажешь?
Собственно, я уже написал -- пулами. В гугле описание работы FastMM можно поискать, если интересно. В дельфийских демках есть приложение Usage Tracker позволяющее отслеживать состояние существующих пулов с оценкой эффективности использования (кстати, модуль трекинга можно подключить к своему софту, при необходимости).
Здравствуйте, BulatZiganshin, Вы писали:
H>>Большое количество вызовов GC это прямой урон перформансу, он же не просто так дергается, он собирает чего-то. К тому же счетчик %Time In GC совсем не нулевой, да еще и на таком коротком отрезке времени (чему я был сильно удивлен). Я сейчас не говорю о каких-то цифрах, я об общем поведении.
BZ>а причём тут короткий отрезок? малые gc достаточно равномерно по ходу выполнения распределены, если бы большие gc с такой счастотой выделялись, то >90% времени только на них бы уходило
Я о коротком отрезке к тому говорю, что МС описывает счетчик %Time In GC не, как среднюю величину за отрезок времени, а с момента последнего цикла GC, коих за кратковременный вызов 3 штуки.
Здравствуйте, hattab, Вы писали:
BZ>>ага. и как можно устранить дефрагментацию памяти, а не просто в description это вписать — не подскажешь?
H>Собственно, я уже написал -- пулами.
это не гарантирует пропадания фрагментации. представь выделение миллиона 7-байтовых ячеек, освобожддение каждой второй из них и затем выделение миллиона 8-байтовых
Здравствуйте, gandjustas, Вы писали:
D>>>>Кто сказал, что GC ГАРАНТИРУЕТ выделение памяти не более чем три раза больше чем в данный момент используется системой? G>>>Этого не гарантирует даже аллокатор ОС, в принципе этого не может гарантировать никто.
M>>Рекомендую ознакомиться с алгоритмами алокаторов более подробно. G>А с ними достаточно подробно знаком, сам писал аллокаторы на ассемблере и несколько разных для С++
вот то-то и оно, что C++ почитай описание GC. ведь это очень просто — если последний большой GC нашёл 10 мб реальных объектов, то следующий GC можно сделать когда общий объём распределённой памяти будет 20 мб или даже 11 мб. это и даёт гарантии
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>>ага. и как можно устранить дефрагментацию памяти, а не просто в description это вписать — не подскажешь?
H>>>Собственно, я уже написал -- пулами.
BZ>>это не гарантирует пропадания фрагментации. представь выделение миллиона 7-байтовых ячеек, освобожддение каждой второй из них и затем выделение миллиона 8-байтовых
H>Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
Только общее увеличение потребления памяти получим.
А кто-то еще ругается что .NET много памяти жрет.
Здравствуйте, BulatZiganshin, Вы писали:
M>>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ?
BZ>потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
В сумме — может быть и быстрее, у GC есть свои плюсы
Однако сам должен понимать, что управляемых аллокаторов есть свои многочисленные плюсы, в том числе равномерность работы
Здравствуйте, NikeByNike, Вы писали:
NBN>>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался.
BZ>>асм ещё универсальней. подумай, почему с 80-х годов им перестали пользоваться
NBN>Потому что есть не менее эффективный С++, а что?
не было в 80-х годах ни C++, ни эффективных оптимизирующих компиляторов. тем не менее полчему-то люди обходились пессимизирующими С-компляторами. садись, опять двойка
Здравствуйте, BulatZiganshin, Вы писали:
NBN>>Потому что есть не менее эффективный С++, а что?
BZ>не было в 80-х годах ни C++, ни эффективных оптимизирующих компиляторов. тем не менее полчему-то люди обходились пессимизирующими С-компляторами. садись, опять двойка
Ты сам ответил совсем неполно, а следовательно не верно
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
G>>Только общее увеличение потребления памяти получим. G>>А кто-то еще ругается что .NET много памяти жрет.
H>Конечно получим, куда же мы денемся. Только оверхед сильно меньше, чем у .Net . Это я про общий случай, и по реальным приложениям это видно.
И по какой причине он станет "сильно меньше"?
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>>>Это слишком просто Пул это блок определенного размера, в котором выделение памяти происходит так же порциями определенного размера: 12, 20, 28, 36, 44 (шаг меняется с увеличением размеров на которые ориентирован пул), есть еще и отдельные пулы для средних и крупных блоков. В твоем примере будут выделяться блоки из первого пула по 12 байт, и ни какой фрагментации. Эффективность использования пулов можно контролировать тем самым трекингом, и в случае необходимости внести коррективы в алгоритм. Надо заметить, что лично мне ни разу не приходилось затачивать алгоритмы под работу менеджера памяти.
G>>>>Только общее увеличение потребления памяти получим. G>>>>А кто-то еще ругается что .NET много памяти жрет.
H>>>Конечно получим, куда же мы денемся. Только оверхед сильно меньше, чем у .Net . Это я про общий случай, и по реальным приложениям это видно. G>>И по какой причине он станет "сильно меньше"?
H>Ты сейчас о чем говоришь, об общих случаях или о той синтетике с 7-8 байтовыми ячейками? Если о синтетике, то там выделение нафиг не нужно, достаточно динамического массива с размером ячейки в 8 байт. Получим при этом оверхед в 1 байт на ячейку. Если же ты об общих случаях, то тут существующий софт тому доказательство.
Почитай как работает выделение памяти в .NET. Там нету никакого оверхеда.
Оверхед может возникнуть из-за того что создается больше обеъктов, но это уже зависит от программы, а не от аллокатора.
Здравствуйте, gandjustas, Вы писали:
H>>Ты сейчас о чем говоришь, об общих случаях или о той синтетике с 7-8 байтовыми ячейками? Если о синтетике, то там выделение нафиг не нужно, достаточно динамического массива с размером ячейки в 8 байт. Получим при этом оверхед в 1 байт на ячейку. Если же ты об общих случаях, то тут существующий софт тому доказательство.
G>Почитай как работает выделение памяти в .NET. Там нету никакого оверхеда.
Рихтер:
У каждого объекта есть пара таких полей: указатель на
таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них
требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в
64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту
по 16 байт
Это оверхед не аллокатора, а организации данных. Но тем не менее.
G>Оверхед может возникнуть из-за того что создается больше обеъктов, но это уже зависит от программы, а не от аллокатора.
На практике мы видим, что .Net софт потребляет больше нежели нативный со всеми его пулами. Это позволяет говорить о том, что вся инфраструктура управления памятью в .Net имеет больший оверхед нежели в нативном софте.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, alsemm, Вы писали:
NBN>>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится. A>>Любая встравиваемая real-life JVM — это только C. A>>Телефонный софт (OS, стандартные приложения) — только C.
NBN>Это далеко не так, хотя этой нечисти там действительно хватает
"Далеко не так" что?
Что JVM написан на C? А на чем их еще писать, если их надо запихивать черте куда, где вменяемого C++ компилятора и не стояло?
Телефонный софт — это как правило море legacy кода, древнего как, даже и не знаю что
Symbian — формально там конечно есть C++, но какой-то он на вид своеобразный.
Здравствуйте, hattab, Вы писали:
H>Рихтер: H>У каждого объекта есть пара таких полей: указатель на H>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них H>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в H>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту H>по 16 байт
H>Это оверхед не аллокатора, а организации данных. Но тем не менее.
Ну без указателя на таблицу виртуальных методов врядли какой ООП язык обходится и в той же Делфи, если мне не изменяет память, функция New неявно по смещению сохраняет еще и объем выделенной памяти.
Здравствуйте, MxKazan, Вы писали:
H>>Рихтер: H>>У каждого объекта есть пара таких полей: указатель на H>>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них H>>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в H>>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту H>>по 16 байт
H>>Это оверхед не аллокатора, а организации данных. Но тем не менее. MK>Ну без указателя на таблицу виртуальных методов врядли какой ООП язык обходится и в той же Делфи, если мне не изменяет память, функция New неявно по смещению сохраняет еще и объем выделенной памяти.
Я ведь не сказал, что в Delphi нет оверхеда Это была фраза на отсутствие оверхеда в .Net. В Delphi еще можно вспомнить о выравнивании, пусть и отключаемом, которое тоже увеличивает оверхед но положительно влияет на производительность. Но не смотря на все это, мы имеем то о чем я уже написал
Здравствуйте, BulatZiganshin, Вы писали:
BZ>это не гарантирует пропадания фрагментации. представь выделение миллиона 7-байтовых ячеек, освобожддение каждой второй из них и затем выделение миллиона 8-байтовых
Напиши сам себе пример и выведи на карту расположение фактически выделенных тебе ячеек.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
... H>Большое количество вызовов GC это прямой урон перформансу, он же не просто так дергается, он собирает чего-то. К тому же счетчик %Time In GC совсем не нулевой, да еще и на таком коротком отрезке времени (чему я был сильно удивлен). Я сейчас не говорю о каких-то цифрах, я об общем поведении.
MK>>В конце концов тот же rpc-xml может это сам явно делать по каким-то своим умозаключениям. У меня вот в WPF'ной проге, окна иной раз не собираются по 10-20 минут. Можно ли быть уверенным, что моя прога в сто раз быстрее твоей?
H>В коде xmlrpc.net явного вызова GC.Collect нет.
Сборщики бывают нескольких типов. Может у вас параллельный сборщик работает, который в Idle time просто собирает статистику для настоящей сборки мусора, которая, благодаря такой предварительной подготовке работает очень быстро.
ЗЫ: А может и сами компоненты написаны неряшливо...
Здравствуйте, alsemm, Вы писали:
A>Что JVM написан на C? А на чем их еще писать, если их надо запихивать черте куда, где вменяемого C++ компилятора и не стояло? A>Телефонный софт — это как правило море legacy кода, древнего как, даже и не знаю что A>Symbian — формально там конечно есть C++, но какой-то он на вид своеобразный.
Я писал под брю и его потомков — WIZE и PDK, там было много старого кода на С и не меньше нового на С++, в частности вся гуйня.
Здравствуйте, CreatorCray, Вы писали:
NBN>>На яве и шарпе нельзя написать качественный продукт удовлетворяющий требованиям CC>Зависит от требований.
Нашим требованиям — создать лучший продукт. Я бы с радостью на шарпе писал, но он, как и ява недостаточно кроссплатформенны и слишком тормозявы на девайсах, для нашей достаточно сложной программы. Каждого из этих факторов достаточно, чтобы от них отказаться в пользу С++.
Здравствуйте, CreatorCray, Вы писали:
CC>Написал я как то монитор выделяемой произвольным процессом памяти. Дабы значицца, посмотреть что там да как происходит в закулисье. CC>И что я только не гонял сей прогой, но пресловутой фрагментации увидеть так и не удалось. CC>HeapAlloc, который уже давным давно используется вместо говноаллокатора ранних версий CRT, отлично справлялся сам.
Скажите пожалуйста на каких компиляторах вы тестировали и если это VS начиная с какой версии компилятор/crt нет проблем с фрагментацией.
Здравствуйте, NikeByNike, Вы писали:
S>>Скажите пожалуйста на каких компиляторах вы тестировали и если это VS начиная с какой версии компилятор/crt нет проблем с фрагментацией.
NBN>У шестёрки в первых версиях был галимый аллокатор, точно помню...
Большое спасибо за ответ.
Может вы вкурсе, они его исправили в sp5 or sp6 или нет?
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, MxKazan, Вы писали:
H>>>Рихтер: H>>>У каждого объекта есть пара таких полей: указатель на H>>>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них H>>>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в H>>>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту H>>>по 16 байт
H>>>Это оверхед не аллокатора, а организации данных. Но тем не менее. MK>>Ну без указателя на таблицу виртуальных методов врядли какой ООП язык обходится и в той же Делфи, если мне не изменяет память, функция New неявно по смещению сохраняет еще и объем выделенной памяти.
H>Я ведь не сказал, что в Delphi нет оверхеда Это была фраза на отсутствие оверхеда в .Net. В Delphi еще можно вспомнить о выравнивании, пусть и отключаемом, которое тоже увеличивает оверхед но положительно влияет на производительность. Но не смотря на все это, мы имеем то о чем я уже написал
В Delphi вообще много чего есть, например аналог сборшика мусора, который работает для строк и динамических массивов.
Причем эта фигня глючит при интеропе с DLL.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
M>Даю подсказку M>int a = 0; M>int b = 3 + a;
M>Очень память дефрагментирует ? затратит линейное время на на выделение памяти и т.п. ?
напишите этот же код на Java, .NET, причем буква в букву. работать везде одинаково будет.
У вас как в древней присказке "слышу звон, да не знаю где он".
Здравствуйте, sergey2b, Вы писали:
NBN>>У шестёрки в первых версиях был галимый аллокатор, точно помню...
S>Большое спасибо за ответ.
S>Может вы вкурсе, они его исправили в sp5 or sp6 или нет?
Да. В первых версиях деаллокация работала с линейной скоростью, а к SP5 — уже нет.
Здравствуйте, CreatorCray, Вы писали:
CC>Т.е. вся аллокация в ОС начиная от W2k производится через HeapAlloc, который является WinAPI функцией и к С/С++ уже никакого отношения не имеет. CC>А судя по картам аллокаций, которые я наблюдал на реальных приложениях фрагментации не наблюдается.
Здравствуйте, alvo, Вы писали:
MK>>>В конце концов тот же rpc-xml может это сам явно делать по каким-то своим умозаключениям. У меня вот в WPF'ной проге, окна иной раз не собираются по 10-20 минут. Можно ли быть уверенным, что моя прога в сто раз быстрее твоей?
H>>В коде xmlrpc.net явного вызова GC.Collect нет.
A>Сборщики бывают нескольких типов. Может у вас параллельный сборщик работает, который в Idle time просто собирает статистику для настоящей сборки мусора, которая, благодаря такой предварительной подготовке работает очень быстро.
В идле ничего не шевелиться, шевеления возникают в процессе работы.
A>ЗЫ: А может и сами компоненты написаны неряшливо...
Все может быть. Код, как по мне, вообще то неряшлив... Но есть другой пример: запускаем Creative Docs .Net (наверняка подойдет и Paint.Net) и начинаем его мониторить водя мышкой над панелями инструментов. В результате многократные вызовы GC и не нулевой %Time in GC. Важно понимать: я ни в коем разе не хочу этим примером показать какую-то кривизну GC, это просто еще один пример.
Здравствуйте, gandjustas, Вы писали:
H>>>>Это оверхед не аллокатора, а организации данных. Но тем не менее. MK>>>Ну без указателя на таблицу виртуальных методов врядли какой ООП язык обходится и в той же Делфи, если мне не изменяет память, функция New неявно по смещению сохраняет еще и объем выделенной памяти.
H>>Я ведь не сказал, что в Delphi нет оверхеда Это была фраза на отсутствие оверхеда в .Net. В Delphi еще можно вспомнить о выравнивании, пусть и отключаемом, которое тоже увеличивает оверхед но положительно влияет на производительность. Но не смотря на все это, мы имеем то о чем я уже написал G>В Delphi вообще много чего есть, например аналог сборшика мусора, который работает для строк и динамических массивов.
Это далеко не аналог сборщика мусора Это автоматическая расстановка финализирующих блоков
G>Причем эта фигня глючит при интеропе с DLL.
Это сведения из далекого прошлого С 2005/2006 FastMM, используемый по умолчанию, обеспечивает свободный шаринг.
Здравствуйте, sergey2b, Вы писали:
CC>>Т.е. вся аллокация в ОС начиная от W2k производится через HeapAlloc, который является WinAPI функцией и к С/С++ уже никакого отношения не имеет. CC>>А судя по картам аллокаций, которые я наблюдал на реальных приложениях фрагментации не наблюдается.
S>Большое спасибо за ваш ответ.
Носи на здоровье.
Если не забуду то приволоку завтра тул, который карту строит — поиграешься, посмотришь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, alsemm, Вы писали:
G>>>Теперь о GC G>>>6)Выделение памяти в .NET происходит очень просто — инкремент указателя. Никаких дополнительных операций не происходитю A>>Это, если память есть свободная. G>Это всегда так. память перед инкрементом свободная.
G>>>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна. A>>Конечно потокобезопасно, еще бы. Только потокобезопасность — не бесплатная. G>Любая потокобезопасноть небесплатная, но пока быстрее intelokcedAdd не существует.
Что-то мне кажется, что одним intelokcedAdd дело там не ограничивается.
G>>>9)такое распределение памяти увелиичивает cache-locality G>>>10)GC собирает мусор не тогжа когда захочется, а при нехватке памяти в нулевом поколении G>>>11)Для нулевого поколения объем памяти — пара сотен КБ, этот кусок очень хорошо ложится в кеш процессора. G>>>12)Единственный критический недостаток GC заключается в том, что он очень плохо работает когда кончается свободная физическая память, сборка мусора во втором поколении заставляет поднимать все страницы памяти из свопа и это может нереально тормозить. A>>Реальный недостаток GC — это его непредсказуемость. Эта сущность не управлется из клиентского кода никак. G>Управляется: есть классы GC и GCSettings. только практика показывает что чем больше лезешь в ручное управление GC, тем хуже все работает.
GCSettings нашел, GC — не нашел. Из того что нашел складывается ощущение, что толку от него, как от поводка для носорога. Да и не должно быть средств для управления нормальным GC, он незаметно для программы должен работать, а не выскакивать как бандит из подворотни
A>>Она может проснуться когда посчитает нужным. G>Он работает по строгому алгоритму, если вы не будете писать код, который завтавляет срабатывать GC очень часто, то все будет хорошо.
Затачивать код под алгоритм GC? Полагаю, что это одного уровня сложности задача, как и настройка управления памтью в C++ проекте.
A>>Если бы GC давал равномерную нагрузку на CPU, то никто бы от него не плевался. G>Ага, его бы просто не использовали.
А что есть выбор?
G>Странные у вас представления о CG.
Расскажите как должно быть по вашему.
G>Кстати описанный вами GC вполне можно сделать на C++, почему до сих пор не применяют?
В С++ GC не нужен.
G>>>13)Но даже этот недостаток можно побороть. Можно сборку мусора во втором поколении маскировать под каую-либо длительную операцию (например сохранение или открытие файла), а при расчетах использовать рецепт описанный здесь A>>Это все ужимки и бег на месте, навроде java.lang.System.gc(), который ничего не гарантирует. G>Ну тогда единственный правльный путь — писать на ассемблере и выделять память ручками.
Из одну крайности в другую...
A>>К сожалению, имидж управляемых сред был сильно подпорчен первыми версиями Java. Так что вы тут хоть 1000 аргументов в пользу C# приведите, стереотипы забороть очень тяжело. G>Меня стериотипы не итересуют уже давно.
А зачем тогда, спрашивается, вы в этой ветке так активно участвуете?
A>>Еще одна проблема C# — низкий порого вхождения для новичков. Собственно это не проблема — это вроде как его преимущество, теоретически. G>Да и практически. Формаклепание и написание говнокода будет востребовано еще очень долго.
Это будет востребовано всегда.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, alsemm, Вы писали:
A>>Что JVM написан на C? А на чем их еще писать, если их надо запихивать черте куда, где вменяемого C++ компилятора и не стояло? A>>Телефонный софт — это как правило море legacy кода, древнего как, даже и не знаю что A>>Symbian — формально там конечно есть C++, но какой-то он на вид своеобразный.
NBN>Я писал под брю и его потомков — WIZE и PDK, там было много старого кода на С и не меньше нового на С++, в частности вся гуйня.
BREW — та еще радость: watch dog timer, ручная многозадачность, сказка, блин
Здравствуйте, gandjustas, Вы писали:
G>В Delphi вообще много чего есть, например аналог сборшика мусора, который работает для строк и динамических массивов. G>Причем эта фигня глючит при интеропе с DLL.
Здравствуйте, shrecher, Вы писали:
S> Где гарантия, что следующие 2-3 года не выдет новая версия радикально изменяющая предыдущие? Ведь MS — монополист и может навязывать любые условия.
Есть такая гарантия. Они за 3 года новую студию не напишут.
... << RSDN@Home 1.2.0 alpha 4 rev. 1138 on Windows Vista 6.1.7000.0>>
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Рихтер: H>>>
У каждого объекта есть пара таких полей: указатель на
H>>>таблицу методов и SyncBlocklndex. В 32-разрядной системе для каждого из них
H>>>требуется 32 бита, что увеличивает размер каждого объекта на 8 байтов, а в
H>>>64-разрядной системе каждое поле занимает 64 бита, добавляя к каждому объекту
H>>>по 16 байт
H>>>Это оверхед не аллокатора, а организации данных. Но тем не менее. G>>указатель на таблицу виртуальных методов есть почти всегда и в неуправляемых языках, так что реальный оверхед создает SyncBlockIndex, который меньше оверхеда стандартного аллокатора C++.
H>Аллокатору нужны списки блоков? Нужны. Нужны размеры блоков? Нужны. Эти вещи, используемые любым аллокатором, считать оверхедом нельзя. Считать оверхедом можно большее, нежели было запрошено, выделение памяти, что присутствует в приведенном в качестве примера дельфийском менеджере (но учитывая эффективность пулов, этот оверхед обсуждать смешно).
Еще раз, в .NETовском аллокаторе не нужны ни списке блоков, ни размеры. (размеры есть в метаданных)
G>>>>Оверхед может возникнуть из-за того что создается больше обеъктов, но это уже зависит от программы, а не от аллокатора. H>>>На практике мы видим, что .Net софт потребляет больше нежели нативный со всеми его пулами. Это позволяет говорить о том, что вся инфраструктура управления памятью в .Net имеет больший оверхед нежели в нативном софте. G>>Большее потребление памяти вовсе не означает оверхеда аллокатора или какой-то-там "ифнраструктуры управления памятью".
H>Я и не говорю про оверхед аллокатора, я конкретно указал о каком оверхеде идет речь.
Только этот оверхед не влияет на производительность.
Вы же не боспокоетесь так исльно из-за лишнего дестяка мегабайт.
Я больше чем уверен что вы спокойное кешируете в памяти множество данных, получаемых извне.
H>К слову сказать, в Delphi я могу, при желании, создать объект и на стеке, только чаще всего необходимости в этом нет.
Каким образом?
Кстати при отсутствии необходимости создавать объекты на стеке многие С++ники часто ргугают другие языки из-за отсуствия такой возможности.
G>>В C++ большая часть короткоживущих объектов создается на стеке. G>>Кроме того для работы аллокаторы .NET необходимы непрерывные куски памяти, а это требует резервирования и выделегния большего объема оперативной памяти, чем реально испольхуется программой (это к тому что не надо верить цифирке в Task Manager). G>>Причем все эти особенности выделения паяти в .NET только ускоряют работу.
H>Во-первых, я не мониторю TaskManager'ом, а использую ProcessExplorer (там цифирки более другие )
Другие это какие?
Вообще "объем памяти, занимаемый программой" очень эфимерная величина. Есть workset, есть commited memory, есть reserved memory, причем не один из этих параметров не показывает реальной величины используемой памяти в течение какого-то промежутка времени.
H>Во-вторых, в Delphi менеджер памяти тоже предварительно создает пулы (в текущей версии в количестве 55(!) штук. Общая эффективность использования пулов для 12000 различных объектов составляет ~95% (это показания трекинга)), но при этом перерасхода памяти не наблюдается. В-третьих, под задачу можно аллокатор поменять (существуют и комммерческие и бесплатные решения).
Ага, наши поезда самые поездатые поезда в мире.
G>>Черезмерное потребление памяти программами на .NET — исключительно вина разработчиков. H>Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)?
Нативная программа использует GDI+ для этих целей?
Память там в основном жрет не .NET, а GDI+ (который тоже нативный).
Кроме того перечитайте еще раз мой пост о статическом оверхеде .NET, может тогда поймете почему не стоит сравнивать потребление памяти на программах типа HelloWorld
Здравствуйте, alsemm, Вы писали:
G>>>>8)Кроме того что выделение памяти выполняется моментально, эта операция еще и потокобезопасна. A>>>Конечно потокобезопасно, еще бы. Только потокобезопасность — не бесплатная. G>>Любая потокобезопасноть небесплатная, но пока быстрее intelokcedAdd не существует. A>Что-то мне кажется, что одним intelokcedAdd дело там не ограничивается.
Не вижу причин по которым нельзя ограничиться одним инкрементом.
A>>>Реальный недостаток GC — это его непредсказуемость. Эта сущность не управлется из клиентского кода никак. G>>Управляется: есть классы GC и GCSettings. только практика показывает что чем больше лезешь в ручное управление GC, тем хуже все работает. A>GCSettings нашел, GC — не нашел. Из того что нашел складывается ощущение, что толку от него, как от поводка для носорога. Да и не должно быть средств для управления нормальным GC, он незаметно для программы должен работать, а не выскакивать как бандит из подворотни
В предыдущем посте вы обвиняли что нету средств контроля GC, вам показали средства, а теперь говорите что он должен незаметно работать. Вы определитесь уже.
A>>>Она может проснуться когда посчитает нужным. G>>Он работает по строгому алгоритму, если вы не будете писать код, который завтавляет срабатывать GC очень часто, то все будет хорошо. A>Затачивать код под алгоритм GC? Полагаю, что это одного уровня сложности задача, как и настройка управления памтью в C++ проекте.
Как раз "затачивать" ничего не надо. Надо просто писать. Работа GC основана не на каких-то предположениях, а на вполне конкретных сатистических (выполняющихся для большенства программ) фактах. Поэтому когда вы пишите программу не сильно задумываясь о распределениипамяти получается лучше всего, а тонкие места можно отловить профайлером.
По моим наблюдениям самые неэффективные программы для .NET пишут именно те кто писал на оптимизированные программы на C++.
A>>>Если бы GC давал равномерную нагрузку на CPU, то никто бы от него не плевался. G>>Ага, его бы просто не использовали. A>А что есть выбор?
Вообще говоря да. Вот в этой теме как раз вопрос выбора.
G>>Странные у вас представления о CG. A>Расскажите как должно быть по вашему.
Меня устраивает так как сейчас есть. И я быб лы очень недоволен если бы работа GC давала постоянный тормозняк.
G>>Кстати описанный вами GC вполне можно сделать на C++, почему до сих пор не применяют? A>В С++ GC не нужен.
Я много раз видел как пишут аллокаторы, которые по свойствам похожы на GC, значит нужны всетаки.
A>>>К сожалению, имидж управляемых сред был сильно подпорчен первыми версиями Java. Так что вы тут хоть 1000 аргументов в пользу C# приведите, стереотипы забороть очень тяжело. G>>Меня стериотипы не итересуют уже давно. A>А зачем тогда, спрашивается, вы в этой ветке так активно участвуете?
Вот и пытаюсь разрушить стериотипы.
Ведь можно написать эффективную программу на Java/.NET, но некоторые почему-то свято верят что можно писать толко на С++.
Здравствуйте, AndrewVK, Вы писали:
AVK>Хороший топик для потенциальных работодателей. Участников холивара можно смело на должности выше сеньора не брать
зря написал. теперь последует ещё на 28 страниц холивар о правильных работодателях
Здравствуйте, gandjustas, Вы писали:
G>В предыдущем посте вы обвиняли что нету средств контроля GC, вам показали средства, а теперь говорите что он должен незаметно работать. Вы определитесь уже.
В этом не противоречия. Либо GC должен быть так хорош, чтобы в не надо было ничего "подкручивать", либо, если, им все-таки можно и нужно управлять должны быть для этого адекватные средства.
... G>>>Странные у вас представления о CG. A>>Расскажите как должно быть по вашему. G>Меня устраивает так как сейчас есть. И я быб лы очень недоволен если бы работа GC давала постоянный тормозняк.
Постоянный предсказуемый тормозняк это лучше чем неожиданный непредсказуемый тормозняк
G>>>Кстати описанный вами GC вполне можно сделать на C++, почему до сих пор не применяют? A>>В С++ GC не нужен. G>Я много раз видел как пишут аллокаторы, которые по свойствам похожы на GC, значит нужны всетаки.
... G>Вот и пытаюсь разрушить стериотипы. G>Ведь можно написать эффективную программу на Java/.NET, но некоторые почему-то свято верят что можно писать толко на С++.
Живая эффективная программа на Java/.NET быстро порушит стереотипы. Где такую можно посмотреть?
Здравствуйте, gandjustas, Вы писали:
ГВ>>Меняется не столько сам C++, сколько его реализация. Не одно и то же, однако. G>Ну и в чем различия?
Скажи пожалуйста, ты правда не понимаешь разницу между стандартом ANSI и реализацией стандарта тем или иным компилятором? Или просто хочешь развести меня на очередной виток объяснения очевидных вещей?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>Меня интересует чем отличается "сам язык" (не его стандарт) от реализации этого языка в конкретном компиляторе.
Неправильно ставишь вопрос: "сам язык" от стандарта не отличается. Стандарт (в виде документа) для того и нужен, вообще говоря, чтобы зафиксировать определение языка.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
H>>>>Это оверхед не аллокатора, а организации данных. Но тем не менее. G>>>указатель на таблицу виртуальных методов есть почти всегда и в неуправляемых языках, так что реальный оверхед создает SyncBlockIndex, который меньше оверхеда стандартного аллокатора C++.
H>>Аллокатору нужны списки блоков? Нужны. Нужны размеры блоков? Нужны. Эти вещи, используемые любым аллокатором, считать оверхедом нельзя. Считать оверхедом можно большее, нежели было запрошено, выделение памяти, что присутствует в приведенном в качестве примера дельфийском менеджере (но учитывая эффективность пулов, этот оверхед обсуждать смешно). G>Еще раз, в .NETовском аллокаторе не нужны ни списке блоков, ни размеры. (размеры есть в метаданных)
Списки по любому нужны (т.е. GC все равно строит граф всех объектов в поколении). Размеры, и правда можно из метаданных получать, заплатив перформансом
H>>Я и не говорю про оверхед аллокатора, я конкретно указал о каком оверхеде идет речь. G>Только этот оверхед не влияет на производительность. G>Вы же не боспокоетесь так исльно из-за лишнего дестяка мегабайт.
Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера:
Как видите, сбор мусора вызывает существенное снижение производительно-
сти — это основной недостаток управляемой кучи.
G>Я больше чем уверен что вы спокойное кешируете в памяти множество данных, получаемых извне.
По требованию алгоритма, но не аллокатора
H>>К слову сказать, в Delphi я могу, при желании, создать объект и на стеке, только чаще всего необходимости в этом нет. G>Каким образом?
TObject.InitInstance. Только нужно понимать, что объект для подобного использования должен быть специально подготовлен, ибо нет смысла размещать на стеке объект имеющий поля требующие динамического выделения памяти. Но сделать это можно. А с 2005 так вообще можно использовать advanced-records (структуры с методами/свойствами, class-like в общем).
G>Кстати при отсутствии необходимости создавать объекты на стеке многие С++ники часто ргугают другие языки из-за отсуствия такой возможности.
Ну на стеке быстрее, просто...
G>>>В C++ большая часть короткоживущих объектов создается на стеке. G>>>Кроме того для работы аллокаторы .NET необходимы непрерывные куски памяти, а это требует резервирования и выделегния большего объема оперативной памяти, чем реально испольхуется программой (это к тому что не надо верить цифирке в Task Manager). G>>>Причем все эти особенности выделения паяти в .NET только ускоряют работу.
H>>Во-первых, я не мониторю TaskManager'ом, а использую ProcessExplorer (там цифирки более другие ) G>Другие это какие? G>Вообще "объем памяти, занимаемый программой" очень эфимерная величина. Есть workset, есть commited memory, есть reserved memory, причем не один из этих параметров не показывает реальной величины используемой памяти в течение какого-то промежутка времени.
Там есть Private bytes.
H>>Во-вторых, в Delphi менеджер памяти тоже предварительно создает пулы (в текущей версии в количестве 55(!) штук. Общая эффективность использования пулов для 12000 различных объектов составляет ~95% (это показания трекинга)), но при этом перерасхода памяти не наблюдается. В-третьих, под задачу можно аллокатор поменять (существуют и комммерческие и бесплатные решения). G>Ага, наши поезда самые поездатые поезда в мире.
Большое количество пулов это: 1) Быстрая аллокация т.к. по размеру блока моментально вычисляется "идеальный" пул. 2) В мульти-тредовом софте большое количество пулов снижает вероятность возникновения коллизий на локах. 3) В мульти-треде аллокатор не висит тупо на локе, а если не смог получить доступ к "идеальному пулу" делает три попытки получить блок из следующего (+1, +2, +3) пула, если снова не смог процесс повторяется.
Я описал то, что есть в наличии FastMM используется и в C++ Builder'е кстати
G>>>Черезмерное потребление памяти программами на .NET — исключительно вина разработчиков. H>>Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)? G>Нативная программа использует GDI+ для этих целей? G>Память там в основном жрет не .NET, а GDI+ (который тоже нативный).
Не смеши. Не жрет GDI+ столько памяти. Более того, модель использования GDI+ отличается от GDI, требуя ресурсы (кисти и прочее) не накапливать, а создавать по мере необходимости. Я тебе могу выслать бинарник который рисует с использованием GDI+, так у него расход выше 4.1Mb не поднимается.
G>Кроме того перечитайте еще раз мой пост о статическом оверхеде .NET, может тогда поймете почему не стоит сравнивать потребление памяти на программах типа HelloWorld
Это далеко не HelloWorld. Впрочем, сравнивать все равно, что. У .Net, расход на аналогичных вещах выше, такова объективная реальность.
Здравствуйте, gandjustas, Вы писали:
H>>Списки по любому нужны (т.е. GC все равно строит граф всех объектов в поколении). G>Вы бы разобрались что скрывается под словами "строит граф", обычный рекурсивный обход без построения динамических структур. G>Оверхеда там действительно нет, как бы вам не хотелось обратного.
Рихтер с тобой не согласен:
При компиляции IL-кода метода JIT-компилятор создает, помимо машинного
кода, внутреннюю таблицу. Логически каждая строка таблицы указывает диапа-
зон смещений байтов машинных кодов процессора, и адреса корней для каждого
диапазона (или регистра процессора)
Далее:
Начиная работу, сборщик предполагает, что все объекты в куче — мусор. Ина-
че говоря, он предполагает, что ни один из корней приложения не ссылается на
объекты в куче. Затем сборщик проходит по корням, строя граф всех достижи-
мых объектов. Например, он может найти глобальную переменную, указывающую
на объект в куче. На рис. 19-2 показана куча с несколькими объектами, где корни
приложения напрямую ссылаются на объекты А, С, D и F, Все эти объекты стано-
вятся частью графа. При добавлении объекта D сборщик замечает, что этот объект
ссылается на объект Н, добавляет объект Н к графу и продолжает рекурсивный
просмотр всех достижимых объектов.
Далее:
Завершив эту часть графа, сборщик мусора проверяет следующий корень и снова
проходит по объектам. Поскольку он проверяет объект за объектом, при попыт-
ке добавить к графу объект, уже добавленный ранее, он останавливается.
H>>Размеры, и правда можно из метаданных получать, заплатив перформансом G>С чего бы? Метаданные то в памяти лежат (это как раз лишние пара метров занимаемой памяти).
Ты же сам про процессорный кэш упоминал... Забыл?
H>>Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера: H>>
Как видите, сбор мусора вызывает существенное снижение производительно-
H>>сти — это основной недостаток управляемой кучи.
G>Только это все может работать быстрее, чем аллокатор на основе списков.
Рихтер не авторит, да?
G>>>Кстати при отсутствии необходимости создавать объекты на стеке многие С++ники часто ргугают другие языки из-за отсуствия такой возможности. H>>Ну на стеке быстрее, просто... G>Не всегда, размещение объектов на стеке часто приводит к копированию этих объектов когда не надо.
Я так понимаю, что мы говорим об адекватном использовании...
G>>>Вообще "объем памяти, занимаемый программой" очень эфимерная величина. Есть workset, есть commited memory, есть reserved memory, причем не один из этих параметров не показывает реальной величины используемой памяти в течение какого-то промежутка времени. H>>Там есть Private bytes. G>И че?
Это реальный показатель:
Private Bytes represents the amount of private virtual memory a process has allocated and is the value that will rise of a process exhibiting a memory leak bug.
G>>>Нативная программа использует GDI+ для этих целей? G>>>Память там в основном жрет не .NET, а GDI+ (который тоже нативный).
H>>Не смеши. Не жрет GDI+ столько памяти. Более того, модель использования GDI+ отличается от GDI, требуя ресурсы (кисти и прочее) не накапливать, а создавать по мере необходимости. Я тебе могу выслать бинарник который рисует с использованием GDI+, так у него расход выше 4.1Mb не поднимается. G>Меня измерения потребляемой памяти на HelloWorld не интересуют.
Здравствуйте, gandjustas, Вы писали:
G>>>Возьмите Paint.NET — на многих задачах работает быстрее фотошопа, но это разные весовые категории.
H>>Дельфовый PhotoFiltre разрывает Paint.NET на куски G>Скачал и поставил себе это. G>Срзу узнал дельфовую программу. Дофига непонятных непермещаемых тулбаров. Дофига пунктов в меню, даже больше чем у фотошопа. G>Сам такие интерфейсы ет пять назад плодил.
Так и в Paint.NET тулбары не перемещаемые, во всяком случае у меня в 3.31.
G>Нету возможности работы со слоями, нету визуально undo/redo stack.
У меня версия от 2004 года, тут действительно нет, но есть PhotoFilter Studio, там слои есть.
G>При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET
Это ты вероятно с Paint.Net спутал В нем действительно, при выделении (Magic Wand) изображения на картинке 400x647 начинаются тормоза: загрузка CPU в районе 100%, частота подскакивает до своего максимума в 1700MHz. PhotoFiltre при этом спокойно работает на минимуме в 600MHz не нагружая процессор выше 8%.
G>Дельфовый PhotoFiltre разрывает Paint.NET на куски только во сне. G>Хотя памяти от захавал меньше в 2 раз — 20 мб, против 40 для Paint.NET, но с моими двумя гигами мне как-то пофиг. G>Скорость работы — одинаковая.
Уж не надо про скорость заливать, PhotoFiltre летает заметно шустрее Paint.NET.
G>>>Можете посмотреть Windows Live Writer, но анлогов вообще нет H>>Дельфовый BlogJet... Ну ты понял G>Тока он платный, так что сразу в пролете.
Только он не единственный, этих блогопостилок вообще море, слабо сопоставляющееся со словами об отсутствии аналогов.
Здравствуйте, CreatorCray, Вы писали:
CC>Тут: http://creatorcray.googlepages.com/MemMon.rar
CC>Гуй в нем делался на скорую руку бо сильно нужны были результаты замеров. CC>вкратце основные кнопы: CC>+- — зум CC>курсорные стрелки + ins/del — перемещение. CC>В силу особенностей перехвата работает не до абсолютной смерти проги, отключается несколько раньше, но позже завершения main.
Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3.
Здравствуйте, hattab, Вы писали:
H>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3.
Небось Athlon?
Собиралась ICC 11 с опцией /QxSSE3. Я то могу вырубить, но там либа используется, которая уже с SSE3 собрана.
Попробую перевыложить.
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Кроме того, скорость (и cache locality) для HeapAlloc (и соответственно для стандартного аллокатора) сильно повышает следующее:
CC>
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>>Возьмите Paint.NET — на многих задачах работает быстрее фотошопа, но это разные весовые категории.
H>>>Дельфовый PhotoFiltre разрывает Paint.NET на куски G>>Скачал и поставил себе это. G>>Срзу узнал дельфовую программу. Дофига непонятных непермещаемых тулбаров. Дофига пунктов в меню, даже больше чем у фотошопа. G>>Сам такие интерфейсы ет пять назад плодил.
H>Так и в Paint.NET тулбары не перемещаемые, во всяком случае у меня в 3.31.
Там панели инструментов перемещаемые и полупрозрачные чтобы под ними было видно что нарисовано.
G>>Нету возможности работы со слоями, нету визуально undo/redo stack. H>У меня версия от 2004 года, тут действительно нет, но есть PhotoFilter Studio, там слои есть.
А я поледнюю скачал, там тоже нет
G>>При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET H>Это ты вероятно с Paint.Net спутал В нем действительно, при выделении (Magic Wand) изображения на картинке 400x647 начинаются тормоза: загрузка CPU в районе 100%, частота подскакивает до своего максимума в 1700MHz. PhotoFiltre при этом спокойно работает на минимуме в 600MHz не нагружая процессор выше 8%.
Я проверил на одинаковых картинках, жрет процессор одинаково, но у PhotoFiltre при этом торможит интерфейс
G>>Дельфовый PhotoFiltre разрывает Paint.NET на куски только во сне. G>>Хотя памяти от захавал меньше в 2 раз — 20 мб, против 40 для Paint.NET, но с моими двумя гигами мне как-то пофиг. G>>Скорость работы — одинаковая. H>Уж не надо про скорость заливать, PhotoFiltre летает заметно шустрее Paint.NET.
Мечты, мечты.
G>>>>Можете посмотреть Windows Live Writer, но анлогов вообще нет H>>>Дельфовый BlogJet... Ну ты понял G>>Тока он платный, так что сразу в пролете. H>Только он не единственный, этих блогопостилок вообще море, слабо сопоставляющееся со словами об отсутствии аналогов.
Здравствуйте, CreatorCray, Вы писали:
H>>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3. CC>Небось Athlon?
Здравствуйте, CreatorCray, Вы писали:
H>>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3. CC>Там просто если ICC считает что твой проц не поддерживает нужные фичи то он делает printf и exit CC>Прога не консольная, посему в консоль ничего не пишет, а printf этот происходит до winmain. CC>Выложил собранные без оптимизаций вообще. Вообще удивлён что сей сурс собрался с первой попытки и даже без ворнингов, как никак года три ему наверное, и кинут был на полпути. CC>У меня самый старый комп что могу найти это P4 820, на нем работало и в первом случае.
Здравствуйте, hattab, Вы писали:
H>>>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3. CC>>Небось Athlon? H>Pentium M 735 (1.7) (Dothan)
А, ясно.
Их интел относит к категории /QxSSE2
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, CreatorCray, Вы писали:
H>>>Чего-то не запустилась у меня Вообще по тихому, ни сообщений, ни записей в евентлоге. Windows XP SP3. CC>>Там просто если ICC считает что твой проц не поддерживает нужные фичи то он делает printf и exit CC>>Прога не консольная, посему в консоль ничего не пишет, а printf этот происходит до winmain. CC>>Выложил собранные без оптимизаций вообще. Вообще удивлён что сей сурс собрался с первой попытки и даже без ворнингов, как никак года три ему наверное, и кинут был на полпути. CC>>У меня самый старый комп что могу найти это P4 820, на нем работало и в первом случае.
H>Новая работает
Надо будет как нить ее доработать.
К примеру она не "видит" аллокации из динамически подгружаемых DLL, только из статики. Не будет работать с упакованными/защищенными EXE и т.п. Как нить сделать чтобы можно было отловить откуда была выделена/освобождена память (StackWalk), правда глядя на объем данных, получаемый с простой программки (~200Mb) становится понятно что stackwalk на каждый alloc/free — это будет черезчур.
Плюс почему то к моменту выгрузки DLL не на все аллокации приходит освобождение, причем часто строго на определенном блоке заканчивается работа.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным. http://www.rsdn.ru/article/dotnet/GC.xml
H>>>>>Размеры, и правда можно из метаданных получать, заплатив перформансом G>>>>С чего бы? Метаданные то в памяти лежат (это как раз лишние пара метров занимаемой памяти).
H>>>Ты же сам про процессорный кэш упоминал... Забыл? G>>Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается. H>Ты посмотри, как этот редкий процесс накручивает счетчик, когда ты мышкой водишь над кнопками на тулбаре.
Накручивает до определенной степени, потом переставет.
H>К тому же не забывай, я давал пример, когда на один вызод метода по XML-RPC происходит 3 сборки мусора. Не веришь мне, проверь сам.
Не надо в пример приводить какую-то левую либу.
G>>Стандартный аллокатор тоже неспособствует частому попаданию в кеш при выделении относительно неболишах блоков, причем эффект проявляется при каждом выделении-освобождении. H>Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету.
"мотаться" — громко сказано, это пара ассемблерных команд. Стандартному аллокатору чтобы поместить свободный блок в список приходится мотаться.
H>>>>>Ну, потребление само по себе может и не влиять в определенных ситуациях, зато на производительность не лучшим образом влияет сам GC. Строить граф нужно, кучу упаковывать иногда нужно (а это за собой влечет и модификацию указателей). В общем, чего я, вот тебе цитата из Рихтера: H>>>>>
Как видите, сбор мусора вызывает существенное снижение производительно-
H>>>>>сти — это основной недостаток управляемой кучи.
G>>>>Только это все может работать быстрее, чем аллокатор на основе списков. H>>> Рихтер не авторит, да? G>>А причем тут авторитет? Это результатами тестов подтверждается. H>Так Рихтер и говорит, что управляемая куча это есть потеря перформанса. Впрочем, я уже понял, что твою слепую веру ничто не способно поколебать.
Слепая вера и невежество у тебя. http://www.rsdn.ru/forum/Default.aspx?mid=3164491
H>>>>>Там есть Private bytes. G>>>>И че? H>>>Это реальный показатель: H>>>
Private Bytes represents the amount of private virtual memory a process has allocated and is the value that will rise of a process exhibiting a memory leak bug.
G>>Такой же эфимерный показательнь для GC. H> При чем тут GC? Это показатель реально используемого/выделенного (не зарезервированного) объема, хоть с GC, хоть без GC
Что значит "реально используемого", ты ведь понимаешь что это далеко не тоже самое что "выделенного", GC нет смысла релизить память первых двух поколений, даже если она не используется. Метаданные в памяти также используются далеко не всегда, несмотря на то что память под них выделлена.
Неиспользуемые страницы могут долго находится в памяти, пока память не понадобится другим приложениям.
Здравствуйте, hattab, Вы писали:
G>>>>При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET H>>>Это ты вероятно с Paint.Net спутал В нем действительно, при выделении (Magic Wand) изображения на картинке 400x647 начинаются тормоза: загрузка CPU в районе 100%, частота подскакивает до своего максимума в 1700MHz. PhotoFiltre при этом спокойно работает на минимуме в 600MHz не нагружая процессор выше 8%. G>>Я проверил на одинаковых картинках, жрет процессор одинаково, но у PhotoFiltre при этом торможит интерфейс
H>Я тоже проверил на одинаковых, и результат изложил выше, а посему позволь тебе не поверить.
У тебя видимо плохая карма что все .NET программы тормозят.
G>>>>>При выделении с помощью magic wand изображение мелькает и начинает тормозить интерфейс, в отличие от Paint.NET H>>>>Это ты вероятно с Paint.Net спутал В нем действительно, при выделении (Magic Wand) изображения на картинке 400x647 начинаются тормоза: загрузка CPU в районе 100%, частота подскакивает до своего максимума в 1700MHz. PhotoFiltre при этом спокойно работает на минимуме в 600MHz не нагружая процессор выше 8%. G>>>Я проверил на одинаковых картинках, жрет процессор одинаково, но у PhotoFiltre при этом торможит интерфейс
H>>Я тоже проверил на одинаковых, и результат изложил выше, а посему позволь тебе не поверить. G>У тебя видимо плохая карма что все .NET программы тормозят.
Здравствуйте, Игoрь, Вы писали:
G>>3)Выделение памяти таким алгоритмом создет фрагментацию памяти, то есть остаются блоки невыделенной памяти малых размеров. И>Угу, только проблема фрагментации кучи есть и в .net, кстати, как и мемори лики.
Тока мемлики там другие, не такие как в unmanaged. Ну и фрагментация скорее pin-анием вызывается. Обычную кучу GC утаптывать умеет.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, niellune, Вы писали:
N>Дело в том что мне нравится язык C++ и меня интересует есть ли сейчас возможность устроиться куда-нибудь на начальную позицию? N>В каких областях сейчас применяется C++?
Ой, ну господи, если ты таки реально решил работать разработчиком, то найти такое место -- лёгкий квест.
Берёшь палец и высасываешь из него крупные софтверные фирмы, которые работают в твоём городе и предположительно пишут на С++.
Идёшь на сайт такой компании, там ищешь "о компании", там "вакансии", либо сразу поиском. И читаешь список и требования...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>>>9)такое распределение памяти увелиичивает cache-locality И>>стандартные аллокаторы windows тоже оптимизированы на это дело G>Рад за аллокатор Windows, только зачем он нужен если можно выделять память смещением указателя. Быстрее просто нечего придумать.
Можно придумать — стек С++ — у него нет сборки мусора
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
G>>>>9)такое распределение памяти увелиичивает cache-locality И>>>стандартные аллокаторы windows тоже оптимизированы на это дело G>>Рад за аллокатор Windows, только зачем он нужен если можно выделять память смещением указателя. Быстрее просто нечего придумать.
NBN>Можно придумать — стек С++ — у него нет сборки мусора
Только многие высокоуровневые конструкции станут недоступны.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, gandjustas, Вы писали:
И>>>c) на мелких объектах свет клином не сошелся — можно и без них обойтись в критичной к скорости части; G>>Я тоже говорю что критичные по скорости вещи надо писать на C, а некритичные, на более высокоуровневых языках. C++ в таком раскладе места нет.
NBN>Такое предложение заставляет заподозрить недостаточное владение С++.
У меня кроме владения С++ есть еще и владение другими языками.
Здравствуйте, gandjustas, Вы писали:
NBN>>Я недавно прикинул, что забыл 7 языков (базик, паскаль (7&Delphi), асм, питон, луа, шарп и яву), на которых немного писал в практических целях. G>Если вы на этих языках "писали немного в практических целях", то можно сказать что и не знали их.
Гы
NBN>>Тем не менее, человек владеющий С++ врядли будет предлагать использовать С, когда можно использовать С++. G>Поправочка: знающий С++ и незнающий других, более выкосоуровневых языков. G>Я сам считал C++ венцом творения программистской мысли пока не знал ничего другого.
Я хорошо помню их возможности
G>Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие?
Я использую то что нужно там где оно нужно
А чем мешают шаблоны и классы там где нужна высокая производительность?
NBN>>А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит. G>Вообще сложность C++ такова что его использовать почти нигде не стоит.
Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа.
Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься
Кстати, люди ратующие за С и шарп неоднократно обвиняли меня, что я пишу на С++ в шарп стиле
Здравствуйте, NikeByNike, Вы писали:
G>>Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие? NBN>Я использую то что нужно там где оно нужно
Это не ответ на вопрос.
NBN>А чем мешают шаблоны и классы там где нужна высокая производительность?
Вряд ли они там мешают, но не помогают — это точно.
NBN>>>А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит. G>>Вообще сложность C++ такова что его использовать почти нигде не стоит. NBN>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа.
С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители. А все части игры, которе тяжелых вычислений не касаются вполне можно писать на высокоуровневых средствах. Кроме того .NET не такой медленный как тут некоторые пытаются показать.
Про ембед не знаю, сильно с ним не сталкивался.
А многим ли приложениям на десктопе нужная шустрая работа?
У меня таких только два — браузер и среда разработки. Причем опера (которая на C++) тормозит гораздо сильнее чем VS (которая на треть из managed модулей).
NBN>Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься
Почему?
NBN>Кстати, люди ратующие за С и шарп неоднократно обвиняли меня, что я пишу на С++ в шарп стиле
Да вы, батенька, извращенец.
Кстати Linq у вас уже появился?
Здравствуйте, NikeByNike, Вы писали:
NBN>>>А чем мешают шаблоны и классы там где нужна высокая производительность? G>>Вряд ли они там мешают, но не помогают — это точно. NBN>Помогают — облегчают рефакторинг и читаемость кода.
Шаблоны улучшают читаемость только в самых простых случаях.
NBN>>>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа. G>>С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители. А все части игры, которе тяжелых вычислений не касаются вполне можно писать на высокоуровневых средствах. Кроме того .NET не такой медленный как тут некоторые пытаются показать. NBN>Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд.
Ну если вашу портануть может и будет тормозить, а если нормально написать на .NET не факт что будут лишние тормоза.
G>>Про ембед не знаю, сильно с ним не сталкивался. NBN>Ага, а я сижу как на эмбеддеде, так и на десктопах с красивым гуём — во многом одним и тем же кодом
Наверное у нас разное понимание эмбеда.
NBN>>>Кстати, если ты считаешь, что можно писать приложения для WM, которые будут жить в конкурентной среде на шарпе — ты сильно ошибаешься G>>Почему? NBN>Потому что у неё будут плохие потребительские качества, хуже чем у конкурентов.
Потребительские качества очень мало зависят от языка разработки.
NBN>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов.
За исключением установки .NET CF (один раз) проблем нет.
NBN>В добавок, там нет, допустим, линка И встречаются свои глюки.
У вас неправильные сведения, там есть Linq.
Там нету expression trees, но Linq to Objects и Linq to XML это не мешает.
NBN>Плюс, опять же, старый код
Ну от него никуда не деться.
NBN>>>Кстати, люди ратующие за С и шарп неоднократно обвиняли меня, что я пишу на С++ в шарп стиле G>>Да вы, батенька, извращенец. NBN>Нет. Я пишу безопасно, просто и красиво, как оно и должно быть.
G>>Кстати Linq у вас уже появился? NBN>Он довольно тормозявый.
Я уже говорил что performance-critical код можно писать на C или юзать unsafe (почти тот же С).
NBN>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки
Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит.
NBN>Думаю, что на шарпе было бы невозможно обеспечить даже близкое качество)
"Думаю" — слабый аргумент.
NBN>P.S. NBN>Ты не думай, что я против шарпа, он мне очень нравится и сегодня я потратил десять минут на его пропаганду. Но, к сожалению, он плохо приспособлен для написания тех программ которые сражаются за массового покупателя.
За такой громкой фразой скрываются шаровары?
Здравствуйте, gandjustas, Вы писали:
G>Когда вы пишите vector<string> то читаемость улучшается. А когда идет vector<sometemple<anothertemplate<param> >, anotherparam> > то читаемости не остается вообще.
Это очень плохой стиль.
NBN>>>>Ну вот если нашу прогу для WM портануть на NET — то она как минимум будет запускатся не секунду, а 15-20 секунд. G>>>Ну если вашу портануть может и будет тормозить, а если нормально написать на .NET не факт что будут лишние тормоза. NBN>>Факт. G>Доказательства будут?
Нет необходимости, это 1. проверялось у нас. 2. отсутствуют решения на шарпе у конкурентов.
NBN>>02-25. Зависит. На тормозявых и неоптимальных языках нельзя писать оптимальные приложения. Практика это подтверждает самым что ни есть великолепным образом. G>Не надо обвинять язык в том что вы не можете написать на нем нетормозявое приложение. Это не его вина.
Написать нетормозявое приложение можно, просто оно будет сильно уступать по функционалу приложениям созданным более подходящими средствами.
NBN>>>>Её будет существенно сложнее ставить, она дольше загружаться и жрат существенно больше ресурсов. G>>>За исключением установки .NET CF (один раз) проблем нет. NBN>>1. Один раз для каждого нета. G>Если у вас одно приложение, то как оно вас волнует?
У нас несколько десятков приложений.
NBN>>2. Это минимум в _2_ раза усложняет процесс инсталляции, это просто недопустимо, даже для писюка. G>Какой ужас, как же люди живут...
Пользуются удобным и быстрым нативом.
G>>>Ну от него никуда не деться. NBN>>Ага, он делает разработку на С++ значительно проще, чем разработка на шарпе и лучший результат в конечном результате. G>Он ниче проще не делает, во многих случаях даже делает хуже. Переписывание всего — огромный риск, на который далеко не все идут.
Не беспокойся — с нуля на шарпе тоже не пишут Точнее пишут! Ещё как пишут, ведутся на рекламу. Потом либо переписывают на С++, либо пропадают
NBN>>Тут ведь как — чуть слажал и тебя конкуренты съели G>Только от языка это ну вообще никак не зависит.
Ну ты голову из песка вытащи и пойми, что не все языки вместе со своими енвайраментами неодинаково полезны.
G>не смешите, вы уже многократоно показали свое невладение ничем кроме С++, да еще и бравируете этим.
Я знаю возможности шарпа и хорошо представляю как он устроен внутри.
G>>>"Думаю" — слабый аргумент. NBN>>Достаточный. Это называется экспертная оценка G>Какой из вас эксперт, если вы ниче дальше С++ и шароварок толком не видели.
Переход на личности означает то что аргументы у тебя кончились, а следовательно ты слил.
У меня тут пару вопросов возникло и дополнений...
И>Еще раз. То, что ты написал в предыдущем посте о преимуществах хипах — ерунда полнейшая. Почему? Да потому что в С++ используется связка стэк + хип. И мелкие часто создаваемые/удаляемые объекты создаются на стэке, а не в хипе. Поэтому все те "преимущества" .net идут лесом. Когда я говорил, что "в C# таже херня", я имел ввиду ситуацию в целом, а не какие-то частные случаи. А именно — работу сборщика мусора и дефрагментатора, который осуществляет перенос объектов в памяти. А это совсем не дешевые операции. Кроме того, если я правильно помню, то при выделении памяти под объект, происходит еще и предварительное обнуление памяти. Далее, все, что ты тут расписал — это касается только мелких объектов. А крупные объекты размещаются в LOH, которая работая скорее по принципу сишной кучи.
В .Net ведь стек тоже вполне себе используется. И если объект выгоднее размещать в стеке, то можно его просто сделать структурой. Единственное, можно попенять на то, что уже готовые конструкции, такие как, например массив, фиг запихнешь в стек. Т.е. я к чему. Связку "стек + хип" вполне можно и в C# юзать, если почти все эти классы сам пишешь. И, чесс говоря, есть ощущение, что это преимущество C++ высосано из пальца.
И>В unamanaged коде лик легко обнаружить и избавиться от него, в managed его получить гораздо сложнее, но и найти и избавиться сложнее. мемлики в С++ — страшилки для детей. Я вот сейчас глянул в С++ проект — на 10МБ кода 16 явных вызовов new.
Если бы в unmanaged всё было так легко, про GC ничего бы не говорили. Теоретически в unmanaged утечку можно вообще не обнаружить. В managed такие вещи решаются на ура при помощи профайлеров.
G>>>>7)Оверхед по выделяемой памяти равен 8 байтам на 32-битной платформе (может ошибаюсь немного, лень смотреть) И>>>уже писал про мелкие объекты и про то, что общий оверхед памяти для .net программ хорошо больше цэпэпэ.
А вот это можно неплохо подтвердить на примере WPF. Центральным классом там является DependencyObject со свойствами зависимостей. Так вот этот самый DependencyObject хранит значения всех этих свойств, не являющихся конструкциями языка, в виде object. Поэтому получается, что если тип свойства — структура, имеем боксинг. А это в любом случае, да — лишний расход памяти.
Здравствуйте, gandjustas, Вы писали:
H>>Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным. G>http://www.rsdn.ru/article/dotnet/GC.xml
Ты этой ссылкой только подтверждаешь мой тезис о том, что инфраструктура управления памятью в .Net более требовательна к оной
Из заключения:
При наличии большого объема памяти .NET-приложения действительно не стесняются в запросах. Но на самом деле это связано с тем, что алгоритмы GC работают более эффективно при использовании больших объемов памяти. Если памяти в системе начинает не хватать, GC переходит в более экономный режим работы.
Ну и про отрицательное влияние на перформанс тоже сказано... не смотря на все оптимизации.
H>>>>Ты же сам про процессорный кэш упоминал... Забыл? G>>>Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается. H>>Ты посмотри, как этот редкий процесс накручивает счетчик, когда ты мышкой водишь над кнопками на тулбаре. G>Накручивает до определенной степени, потом переставет.
У меня не получилось дождаться, пока перестанет. Не перестанет он.
H>>К тому же не забывай, я давал пример, когда на один вызод метода по XML-RPC происходит 3 сборки мусора. Не веришь мне, проверь сам. G>Не надо в пример приводить какую-то левую либу.
Да какой бы я пример не привел, ты назовешь его левым или говнософтом. Ладно, еще пример из говнософта. Запускаем Paint.NET и открываем в нем картинку (я открыл 1600x1200). Выделяем всю картинку Ctrl+A. Смотрим на счетчики GC и видим, что в мирно крутящем пунктир выделения Paint.NET'е, счетчик GC тикает раз-два-три в секунду.
H>>Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету. G>"мотаться" — громко сказано, это пара ассемблерных команд. Стандартному аллокатору чтобы поместить свободный блок в список приходится мотаться.
Стандартный подчиняется ручному управлению, и на работу влияния не оказывает. В отличие от GC решившего вдруг марафет навести.
H>>Так Рихтер и говорит, что управляемая куча это есть потеря перформанса. Впрочем, я уже понял, что твою слепую веру ничто не способно поколебать. G>Слепая вера и невежество у тебя. G>http://www.rsdn.ru/forum/Default.aspx?mid=3164491
Во-первых это синтетика, не имеющая ничего общего с реальным миром. Во-вторых это не правильная синтетика.
H>>>>Это реальный показатель: H>>>>
Private Bytes represents the amount of private virtual memory a process has allocated and is the value that will rise of a process exhibiting a memory leak bug.
G>>>Такой же эфимерный показательнь для GC. H>> При чем тут GC? Это показатель реально используемого/выделенного (не зарезервированного) объема, хоть с GC, хоть без GC G>Что значит "реально используемого", ты ведь понимаешь что это далеко не тоже самое что "выделенного", GC нет смысла релизить память первых двух поколений, даже если она не используется. Метаданные в памяти также используются далеко не всегда, несмотря на то что память под них выделлена. G>Неиспользуемые страницы могут долго находится в памяти, пока память не понадобится другим приложениям.
Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление. Делаем простой эксперимент. Запускаем Paint.NET, который откушал сразу 35Mb (судя по твоим словам, большая часть этой цифры -- резерв, который будет возвращен в систему по первому требованию). Теперь начинаем запускать много тяжелого софта: две Delphi IDE, Open Office Writer, Abode Reader, Opera (она у меня жрет в районе 160Mb, из-за размера почтовой базы), VirtualBox. Все система ушла в своп. Смотрим на потребление Paint.NET... оно снизилось ровно на 300Кб. Выводы?
Здравствуйте, MxKazan, Вы писали:
MK>В .Net ведь стек тоже вполне себе используется. И если объект выгоднее размещать в стеке, то можно его просто сделать структурой. Единственное, можно попенять на то, что уже готовые конструкции, такие как, например массив, фиг запихнешь в стек. Т.е. я к чему. Связку "стек + хип" вполне можно и в C# юзать, если почти все эти классы сам пишешь. И, чесс говоря, есть ощущение, что это преимущество C++ высосано из пальца.
Я тоже сильной применимости не вижу, но вещь определенно не плохая.
И>>В unamanaged коде лик легко обнаружить и избавиться от него, в managed его получить гораздо сложнее, но и найти и избавиться сложнее. мемлики в С++ — страшилки для детей. Я вот сейчас глянул в С++ проект — на 10МБ кода 16 явных вызовов new. MK>Если бы в unmanaged всё было так легко, про GC ничего бы не говорили. Теоретически в unmanaged утечку можно вообще не обнаружить. В managed такие вещи решаются на ура при помощи профайлеров.
Нативный FastMM умеет рапортовать об утечках (с адресами, с типами). Плюс есть различные тулы для контроля.
Здравствуйте, CreatorCray, Вы писали:
H>>Новая работает CC>Надо будет как нить ее доработать. CC>К примеру она не "видит" аллокации из динамически подгружаемых DLL, только из статики. Не будет работать с упакованными/защищенными EXE и т.п. Как нить сделать чтобы можно было отловить откуда была выделена/освобождена память (StackWalk), правда глядя на объем данных, получаемый с простой программки (~200Mb) становится понятно что stackwalk на каждый alloc/free — это будет черезчур. CC>Плюс почему то к моменту выгрузки DLL не на все аллокации приходит освобождение, причем часто строго на определенном блоке заканчивается работа.
Ага, заметил некоторые траблы с использованием. Но вообще, интересная софтинка
Здравствуйте, hattab, Вы писали:
H>Во времена DOS'а, когда только начали появляться графические и псевдографические интерфейсы, а "мыши" были большой редкостью, в одном журнале прочитал интервью с каким-то разработчиком. Он отвечая на вопрос журналиста об использовании "мышки" в качестве единственного средства управления, ответил: "Если вы делаете "мышь" единственным средством управления, будьте готовы обеспечить им ваших пользователей". Вот, когда мне говорят о дешевых гигабайтах, я всегда эту фразу вспоминаю Не нужно забывать, что техника бывает очень разной, и часто бывает так, что купив ноутбук с распаянными на плате 512 метрами, заапгрейдить его можно только выкинув и купив новый.
Я, конечно, согласен, но только в определенной степени. Речь все-таки не о гигабайтах и 512 мегов сейчас уже редкость. Managed проги хоть и требуют памяти больше нативных, но все же не по 200 мегов на каждую фенечку. Тот же Creative Docs не отобрал у меня больше 120 Мб и при открытии всех сэмплов в поставке (я их покрутил/повертел/поперетаскивал).
Здравствуйте, gandjustas, Вы писали:
G>Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
Что за статистика такая? Я вот, например, не верю, что число ошибок на строчку BF и MODULA 2 будет одинаковым...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным. G>>http://www.rsdn.ru/article/dotnet/GC.xml
H>Ты этой ссылкой только подтверждаешь мой тезис о том, что инфраструктура управления памятью в .Net более требовательна к оной
Офигеть, дайте две, а причем тут перформанс?
H>Из заключения: H>
При наличии большого объема памяти .NET-приложения действительно не стесняются в запросах. Но на самом деле это связано с тем, что алгоритмы GC работают более эффективно при использовании больших объемов памяти. Если памяти в системе начинает не хватать, GC переходит в более экономный режим работы.
Ключевое выделил.
H>Ну и про отрицательное влияние на перформанс тоже сказано... не смотря на все оптимизации.
Ну а где же цитата про перформанс?
H>>>>>Ты же сам про процессорный кэш упоминал... Забыл? G>>>>Не забыл — сборка муроса достаточно редкий процесс и на время его работы программа останавливается. H>>>Ты посмотри, как этот редкий процесс накручивает счетчик, когда ты мышкой водишь над кнопками на тулбаре. G>>Накручивает до определенной степени, потом переставет. H>У меня не получилось дождаться, пока перестанет. Не перестанет он.
У тебя определенно плохая карма. Прмерно 10 мб от первоначального объема кушат при двигании мышкой туда-сюда.
Это обсасывали еще при появлении персого дотнета.
H>>>К тому же не забывай, я давал пример, когда на один вызод метода по XML-RPC происходит 3 сборки мусора. Не веришь мне, проверь сам. G>>Не надо в пример приводить какую-то левую либу.
H>Да какой бы я пример не привел, ты назовешь его левым или говнософтом. Ладно, еще пример из говнософта. Запускаем Paint.NET и открываем в нем картинку (я открыл 1600x1200). Выделяем всю картинку Ctrl+A. Смотрим на счетчики GC и видим, что в мирно крутящем пунктир выделения Paint.NET'е, счетчик GC тикает раз-два-три в секунду.
И че, вам жалко? Че за фобия сборки мусора?
При этом отъедается 20% CPU на "бегающих тараканчиков", которые кстати бегают честно по кругу и очень плавно, в отличие от многих других программ.
H>>>Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету. G>>"мотаться" — громко сказано, это пара ассемблерных команд. Стандартному аллокатору чтобы поместить свободный блок в список приходится мотаться. H>Стандартный подчиняется ручному управлению, и на работу влияния не оказывает. В отличие от GC решившего вдруг марафет навести.
Надо бы ло внимательнее статью читать, "вдруг" не бывает. тем более это тоже контролируется.
H>>>Так Рихтер и говорит, что управляемая куча это есть потеря перформанса. Впрочем, я уже понял, что твою слепую веру ничто не способно поколебать. G>>Слепая вера и невежество у тебя. G>>http://www.rsdn.ru/forum/Default.aspx?mid=3164491
H>Во-первых это синтетика, не имеющая ничего общего с реальным миром. Во-вторых это не правильная синтетика.
Да, синтетика, которая как раз наглядно показывает что аллокатор в делфях медленее GC.
H>Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление.
Тебе как пользователю разница от цифирки в таскманагере есть?
Ты даже не можешь сопоставить быстродействие с этой цифиркой никак.
H>Делаем простой эксперимент. Запускаем Paint.NET, который откушал сразу 35Mb (судя по твоим словам, большая часть этой цифры -- резерв, который будет возвращен в систему по первому требованию). Теперь начинаем запускать много тяжелого софта: две Delphi IDE, Open Office Writer, Abode Reader, Opera (она у меня жрет в районе 160Mb, из-за размера почтовой базы), VirtualBox. Все система ушла в своп. Смотрим на потребление Paint.NET... оно снизилось ровно на 300Кб. Выводы?
Вывод один — тебе срочно надо курить про workset. до этого больше тут ничего не пиши.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Статистика показывает что плотность ошибок на строку кода от языка не зависит. При этом для реализации како-то функционала на С++ требуется написть когда больше (иногда гораздо больше), поэтому багов на единицу функционала для С++ получается больше.
E>Что за статистика такая? Я вот, например, не верю, что число ошибок на строчку BF и MODULA 2 будет одинаковым...
Когда на BF хотябы один большой проект сделают тогда поговорим.
Эта статистика собирается для крупных проектов. Мелочи могут давать перекосы в разные стороны в зависимости от подходящих библиотек.
Здравствуйте, MxKazan, Вы писали:
MK>Вот тут я тебя полностью понимаю. И я тоже против огульного охаивания .Net и его приравнивания к VB.
А зря ты так про VB. На VB целая индустрия держалась. Софта который нужен "уже вчера", и "послезавтра точно устареет"...
Кстати, сейчас эту нужную и важную нишу занял .Net...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, hattab, Вы писали:
H>Полгода назад у Ровера вышла очень удачная машинка класса UMPC, там распаяно 768 и установлена Виста. В свое время Compaq выпустил очень удачный планшетник TC-1100 (HP'шники, суки, убили эту линейку) с Windows XP Tablet PC с которым сразу обнаружились проблемы с "заиканием" стандартной распознавалки вполть до отказа пользователей от ее использования (массово ставили Квартовскую или Парагоновскую). Причина проста -- стандартная распознавалка Tablet PC является/являлась .Net приложением (видимо GC и давал эффект заикания. На хоботе исследование вопроса проводили, но я детали не помню).
Я честно не знаю, как некоторым удается писать такие дерьмовые проги на .Net. За 3 года я ни разу не сталкивался с этими чудесами подвисаний GC. Допускаю, что они могут быть в высоконагруженных системах, но вот я не сталкивался и всё. Возможно потому, что у меня не развита GC-фобия.
MK>>Managed проги хоть и требуют памяти больше нативных, но все же не по 200 мегов на каждую фенечку. Тот же Creative Docs не отобрал у меня больше 120 Мб и при открытии всех сэмплов в поставке (я их покрутил/повертел/поперетаскивал). H>Тут ведь какое дело, если софтина работает одна, так и не жалко. Но когда их много, а ресурсы ограничены... Просто выберет человек продукт конкурента и всех делов
В общем это бесконечный спор...
Здравствуйте, gandjustas, Вы писали:
M>>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ? G> G>Да ну? G>Вым наверное стоит изучить как аллокаторы и GC работают.
А вам, что такое "автоматическая переменная" в C++
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>GC не собирает память пока это никому не мешает, как только заполнится первое поколение — сразу же уберет, а то что не успел удбрать — сложит в другое полколение.
Это всего лишь эффект масштаба. Для С++ схему владения надо продумывать уже для довольно небольших задач (для совсем простых можно ничего не освобождать, да и всё), а для GC для задач побольше. Зато управлять GC посложнее...
Есть некоторая ниша по сложности задачи, где GC работает хорошо, но и только...
Кстати, в C++ наработано много всяких подходов к этому месту, так что обычно можно быть по крайней мере не хуже в области массовых аллокаций, чем GC...
Например, можно на каждый запрос на каждой нити создавать отдельный стековый аллокатор, и на нём ничего не освобождать, а только выделять. По окончании запроса данные, которые нужно сохранить мигрируют на обычный аллокатор, а стековый грохается целиком в начальное состояние, и мы снова готовы обработать запрос. В целом для очень многих задач такая стратегия аллокации НАМНОГО ЭФФЕКТИВНЕЕ GC...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
M>>>Большая часть "выделения-освобождения памяти" на С++ не затрачивает никаких ресурсов, как может быть быстрее ? G>> G>>Да ну? G>>Вым наверное стоит изучить как аллокаторы и GC работают.
E>А вам, что такое "автоматическая переменная" в C++
Не поверите, такие же переменные есть в .NET
Здравствуйте, CreatorCray, Вы писали:
G>>Эта наивная реализация во многих местах осталась и по сей день. CC>Это проблемы тех мест а не С++ в целом.
+1
Кроме того, там конечно завались просто классных и быстрых GC...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>Ты этой ссылкой только подтверждаешь мой тезис о том, что инфраструктура управления памятью в .Net более требовательна к оной G>>Офигеть, дайте две, а причем тут перформанс?
H>>>Из заключения: H>>>
При наличии большого объема памяти .NET-приложения действительно не стесняются в запросах. Но на самом деле это связано с тем, что алгоритмы GC работают более эффективно при использовании больших объемов памяти. Если памяти в системе начинает не хватать, GC переходит в более экономный режим работы.
G>>Ключевое выделил. H>Угу, а при его отсутствии начнется деградация производительности (ведь алгоритмы перестанут работать эффективно, как следует из цитаты)
Я например замечаю что память кончается конда показатель выделенной физической памяти подбирается к 98 процентам.
В таких условиях тормозит все.
H>>>Ну и про отрицательное влияние на перформанс тоже сказано... не смотря на все оптимизации. G>>Ну а где же цитата про перформанс?
H>Во ведении там есть несколько слов, найдешь А вообще, слова теже самые, что и у Рихтера. Я вообще удивлен, чего ты этот очевидный и признаваемый факт отрицаешь...
Ага, видно что прочитал введение и заключение.
H>Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное.
3 раза в секунду это часто?
На гигагерцовом процессоре за секунду выполняется 1000000000 тактов. При этом если в приложении ничего не происходит, то все поколение становится мксором и не происходит фактически уплотнения кучи.
Сборщик мусора на многопроцесорной машине работает в фоновом режиме по большей части.
Так что влияние на производительность минимальная.
H>>>>>Вообще-то тут речь идет об освобождении ресурсов. У стандартного аллокатора есть информация о размере освобождаемого блока, и нет нужды мотаться за ней в мету. G>>>>"мотаться" — громко сказано, это пара ассемблерных команд. Стандартному аллокатору чтобы поместить свободный блок в список приходится мотаться. H>>>Стандартный подчиняется ручному управлению, и на работу влияния не оказывает. В отличие от GC решившего вдруг марафет навести. G>> G>>Надо бы ло внимательнее статью читать, "вдруг" не бывает. тем более это тоже контролируется.
H>Именно вдруг. Работу GC ты можешь "типа контролировать" подстраивая алгоритм под его текущую стратегию. Зря чтоль Рихтер советует вызывать GC.Collect маскируя его за "тяжелыми операциями"?
Мдя... не надо так явно показывать свою недалекость. Читайте про GCSettrings.LatencyMode.
H>Синтетика все что угодно показать может, главное приготовить как надо. Ты, как надо было тебе, приготовил.
Ну приготовь как тебе надо, покажи обратное.
H>>>Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление. G>>Тебе как пользователю разница от цифирки в таскманагере есть? G>>Ты даже не можешь сопоставить быстродействие с этой цифиркой никак.
H>Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения.
А че, нативное приложение в свом не выгружается? Что ты пытаешься показать этой фразой?
Здравствуйте, MxKazan, Вы писали:
MK>Так это получается, что все в форумах NET и NET GUI просто дебилы какие-то, выбирающие инструмент по рекламкам. MK>Считай это как призыв не юзать подобные аргументы. Все же в деле заняты, а не в бирюльках.
Ну просто на PC обычно можно забить на прожорливость GUI, например...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, kuj, Вы писали:
kuj>Разработчика, который пытается использовать ВСЮ память надо бить сильно по рукам.
Я знаю задачи, в которых это правильная стратегия...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Только этот оверхед не влияет на производительность.
Но только на платформах, где памяти очень много...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Можете посмотреть <...> Windows Media Center — аналогично.
А чему там тормозить в принципе?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>У тебя видимо плохая карма что все .NET программы тормозят.
Да нет, просто у него на ноуте 512 метров RAM...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Не поверите, такие же переменные есть в .NET
Почему не поверю? Я советовал ведь не "проверить, есть ли в С++ автоматические переменные", а изучить, что это такое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>На чем основано такое мнение? Уж точно не на длительном использовании .NET и профилировании программ.
Исключительно на переходе на личности основано
E>>Есть некоторая ниша по сложности задачи, где GC работает хорошо, но и только... G>Вам наверное стоит почитать на каких допущениях работает GC. И на основе каких программ эти допущения получены.
Да и на каких? Сколько в той статистике было баз данных? Сколько 3D движков? Сколько распознавалок? Сколько переводчиков?..
Есть уровень сложности задачи, например текстовый редактор, где GC работает очень хорошо, но с ростом сложности задачи ситуация портится. Скажем при написании базы данных тебе уже придётся очень крепко думать про то как же у тебя данные будут с GC взаимодействовать...
Просто в С++ проектирование такого рода надо начинать на намного более простых задачах. Но на реально сложных это надо делать и там и там...
E>>Кстати, в C++ наработано много всяких подходов к этому месту, так что обычно можно быть по крайней мере не хуже в области массовых аллокаций, чем GC... G>Да, в C++ надо думать о том когда и как выдеоять и освобожать память. G>В .NET об этом думать не надо. Если будет тормозить тогда смотреть профайлером.
Ну и поспотришь ты профайлером, и что дальше будет? Если у тебя проектирования не было, а задача сложная, то будет тормозное г., при этом факт того, что это тормозное г. будет задокументирован профайлером
E>>Например, можно на каждый запрос на каждой нити создавать отдельный стековый аллокатор, и на нём ничего не освобождать, а только выделять. По окончании запроса данные, которые нужно сохранить мигрируют на обычный аллокатор, а стековый грохается целиком в начальное состояние, и мы снова готовы обработать запрос. В целом для очень многих задач такая стратегия аллокации НАМНОГО ЭФФЕКТИВНЕЕ GC... G>Это теория, покажите такие программы на практике.
Какие "такие"? Быстрые и написанные на неуправляемом языке? Ядро линукса, например, устроит?
G>Обычно ручная возьня с ресурсами очень сильно увеличивает время разработки программ. Такую возьню могут позволить себе только очень крупные фирмы.
Обычно, ручная возня с ресурсами занимает очень маленькую часть затрат на разработку действительно сложного ПО (например переводчика, или операционной системы)...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Эта статистика собирается для крупных проектов. Мелочи могут давать перекосы в разные стороны в зависимости от подходящих библиотек.
А подробности будут?
Я всё равно не верю, что, Ada и С++ имеют одинаковый показатель.
Кроме того, на чём же тогда статистика для С# собрана, если только КРУПНЫЕ проекты идут в счёт? На сингулярити, что ли?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, shrecher, Вы писали:
S>>Для разработчика это очень рискованно связываться с C#, т.к. требуется тащить .net runtime и привяжешь себя к Виндам. MK>Вот-вот! Только представь, каждый день на работу и обратно таскать эти два тяжелых чемоданчика с .net runtime. Там по 20 кг в каждом! Порог вхождения очень высок
Осталость только домыслить "привяжешь себя к виндам" — привязал себя веревкой к оконной раме.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Эта статистика собирается для крупных проектов. Мелочи могут давать перекосы в разные стороны в зависимости от подходящих библиотек.
E>А подробности будут? E>Я всё равно не верю, что, Ada и С++ имеют одинаковый показатель.
Можете не верить.
E>Кроме того, на чём же тогда статистика для С# собрана, если только КРУПНЫЕ проекты идут в счёт? На сингулярити, что ли?
На C# очень много крупных проектов, с миллионами строк кода.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Только этот оверхед не влияет на производительность. E>Но только на платформах, где памяти очень много...
Это вы себя пытаетесь убедить?
Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много?
E>Есть уровень сложности задачи, например текстовый редактор, где GC работает очень хорошо, но с ростом сложности задачи ситуация портится. Скажем при написании базы данных тебе уже придётся очень крепко думать про то как же у тебя данные будут с GC взаимодействовать...
Ты так говоришь как-будто все каждый день пишут базы данных.
Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
E>>>Кстати, в C++ наработано много всяких подходов к этому месту, так что обычно можно быть по крайней мере не хуже в области массовых аллокаций, чем GC... G>>Да, в C++ надо думать о том когда и как выдеоять и освобожать память. G>>В .NET об этом думать не надо. Если будет тормозить тогда смотреть профайлером. E>Ну и поспотришь ты профайлером, и что дальше будет?
Исправлю код там где торомзит.
E>>>Например, можно на каждый запрос на каждой нити создавать отдельный стековый аллокатор, и на нём ничего не освобождать, а только выделять. По окончании запроса данные, которые нужно сохранить мигрируют на обычный аллокатор, а стековый грохается целиком в начальное состояние, и мы снова готовы обработать запрос. В целом для очень многих задач такая стратегия аллокации НАМНОГО ЭФФЕКТИВНЕЕ GC... G>>Это теория, покажите такие программы на практике. E>Какие "такие"? Быстрые и написанные на неуправляемом языке? Ядро линукса, например, устроит?
Утстроит, где там C++? Там голый С.
Ядро винды тоже на С вроде как написано.
Если почитаешь ветку я многократно говорил что performance-critical части можно и иногда нужно писать на С.
G>>Обычно ручная возьня с ресурсами очень сильно увеличивает время разработки программ. Такую возьню могут позволить себе только очень крупные фирмы. E>Обычно, ручная возня с ресурсами занимает очень маленькую часть затрат на разработку действительно сложного ПО (например переводчика, или операционной системы)...
Ну на управляемых языках это так, на неупрвляемых — зависит от разработчика.
Здравствуйте, _d_m_, Вы писали:
MK>>Вот-вот! Только представь, каждый день на работу и обратно таскать эти два тяжелых чемоданчика с .net runtime. Там по 20 кг в каждом! Порог вхождения очень высок ___>Осталость только домыслить "привяжешь себя к виндам" — привязал себя веревкой к оконной раме.
И придется ее тоже с собой таскать, на спине, в рюкзачке!
Здравствуйте, gandjustas, Вы писали:
g> E>Есть уровень сложности задачи, например текстовый редактор, где GC работает очень хорошо, но с ростом сложности задачи ситуация портится. Скажем при написании базы данных тебе уже придётся очень крепко думать про то как же у тебя данные будут с GC взаимодействовать...
g> Ты так говоришь как-будто все каждый день пишут базы данных.
g> Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
Слющай, зачэм couchdb? В поставку Эрланга входит тоже неплохая база — mnesia. Написана тоже на Эрланге
Не говоря уж о двух хороших, быстырых веб-серверах
g> E>Ну и поспотришь ты профайлером, и что дальше будет? g> Исправлю код там где торомзит.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
И>>>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>>>Ты не в тот таскманагер смотришь, тебе уже сообщали. G>>Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю. CC>И давно ты "кол-во используемой памяти" меряешь профайлером?
А я где-то говрил что меряю количество памяти?
Я же написал что эти цифирки не интересуют. Если нужно быстродействие, то меряю его профайлером.
G>>>>Доказательства? Опять отправляю вас читать как работает выделение памяти и сборка мусора в .NET. CC>>>Кстати, как там на данный момент обстоит дело с GC в условиях наличия за-pin-ованых объектов? G>>То что выделено до запиненного объекта — не уплотняется. G>>Перерасход памяти из-за большого количесва запиненных объекктов — признак неграмотности программиста CC>Т.е. использование одного компонента, написанного говнокодером херит всю стройную систему?
Оно всегда так, любой маленький кусок говнокода может испортить прогу.
А способов надолго запинить память не так много.
И>>>>>а) есть стэк; G>>>>Стек заставляет копировать объекты чаще, чем нужно. CC>>>С чего бы вдруг? G>>Передача объектов по значению вызывает копирование. CC>Обьясни поподробнее какая связь между аллокацией на стеке и передачей объектов по значению?
А возвращение объектов при выделении памяти на стеке как происходит?
И>>>>>b) есть placement new; G>>>>Теже яйца что и кастомный аллокатор, только сбоку CC>>>Только без затрат на выделение памяти. Т.е. совсем бесплатный считай. G>>А откуда возьмется память в которой будет делаться placement new ? CC>Откуда угодно. Любая свободная память. Сам по себе placement new не равняется аллокатору.
Ну не равняется, и что с того?
G>>Испоьзовать C++ как C_с_классами конечно можно, только это получается ну очень низкоуровневое программирование. CC>"С с классами" как и "функциональщина из буста" это крайности. Я не про них.
А в среднем случае C++ сильно уступает по выразительности современныхм языкам.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много? E>От программы зависит. Для тачки с 512 Мб на борту это больше половины доступного RAM... E>Так что, если прога -- это часы, например, то привет...
А я говорил что прога — это часы?
У меня прога занимается расчетами и их визуализацией.
E>Но если проге реально нужно МНОГО памяти, то всё ещё хуже. Особенно если её надо много, но небольшими блоками. Вот в моих С++ прогах часто заканчивается адресное пространство 32-й винды, например. И всякие прототипы на С# показывают радикально худшую производительность/эффективность по памяти
И что за программа которой столько памяти нужно?
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>уже придётся очень крепко думать про то как же у тебя данные будут с GC взаимодействовать... G>>Ты так говоришь как-будто все каждый день пишут базы данных. E>Во-первых, те, кто решают сложные задачи, они этим заняты обычно каждый день. Написать большой проект -- это не быстро.
Эти размышления к чему?
Сколько сейчас существует СУБД, которые реально используются? Десятка три наберется, а сколько приложений, посльзующихся этимы самыми БД?
Причем приложения по сложности могут быть сравнимыми с самой БД.
E>Во-вторых, я утверждаю следующее:
Есть некоторый уровень сложности задач, довольно средний, под который GC оптимизирован и на котором он работает неплохо, хотя и с некоторыми известными особенностями и косяками. Этот уровень задачи -- сложный GUI. Для задач на порядок-другой более сложных GC работает хреново. И тогда сказывается то, что GC -- это автоматическая хреновина, которую хрен настроишь по месту, так что требования к точности продумывания архитектуры сложного проекта намного жёстче, чем в случае неуправляемых языков.
Непонятно какая метрика используется для сложности.
Вот есть приложение на .NET — www.microsoft.com, там какая сложность?
G>>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится. E>Ну наверное они там долго продумывали как работа с данными будет происходить, кроме того, я сильно подозреваю, что GC Erlang'а специально под его базу и оптимизирован...
couchDB занимался один человек, у него времени на оптимизацию GC уж точно не было.
E>>>Ну и поспотришь ты профайлером, и что дальше будет? G>>Исправлю код там где тормозит. E>Если неправильная архитектура, то тормозит везде...
Вопросы архитектуры ортогональны вопросам быстройдействия.
G>>Утстроит, где там C++? Там голый С. G>>Если почитаешь ветку я многократно говорил что performance-critical части можно и иногда нужно писать на С. E>Как С и С++ отличаются с точки зрения управляемости и GC? В С++ типобезопасность есть и конструкторы с деструкторами. А ещё там есть виртуальные функции, исключения и шаблоны. И что? Как это всё вообще влияет на обсуждаемые проблемы? Это всего лишь на процесс разработки может повлиять...
И опять приходим к тому что для того случая где нужно быстродействие используем C, а для всего остального высокоуровневые средства.
E>>>Обычно, ручная возня с ресурсами занимает очень маленькую часть затрат на разработку действительно сложного ПО (например переводчика, или операционной системы)... G>>Ну на управляемых языках это так, на неупрвляемых — зависит от разработчика. E>Нет. Не зависит. Плохой разработчик потратит на реализацию сложного проекта бесконечное время Причём на ЛЮБОМ ЯЗЫКЕ...
А кто говорит о плохом разработчике?
Здравствуйте, gandjustas, Вы писали:
G>>>Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много? G>У меня прога занимается расчетами и их визуализацией.
А для расчётов много памяти надо? Так сказать вне связи с языком? И как эта память выделяется? Большими кусками (ну там пять матриц по 50 метров) или небольшими объектами?
G>И что за программа которой столько памяти нужно?
Ну вот последняя моя прога, которой не хватало адресного пространства, занималась тем, что среди миллионов картинок пыталась найти кучки похожих, таким образом, что каждая картинка была бы хоть как-то похожа на какую-нибудь кучку, и при этом кучек было не много. Например тысяча...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>>>Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много? G>>У меня прога занимается расчетами и их визуализацией. E>А для расчётов много памяти надо? Так сказать вне связи с языком? И как эта память выделяется? Большими кусками (ну там пять матриц по 50 метров) или небольшими объектами?
Для расчетов — большими, матрицы примерно 100х100.
Для визуализации — куча маленьких.
Я вообще говоря не следил за выделением памяти в этой программе.
G>>И что за программа которой столько памяти нужно? E>Ну вот последняя моя прога, которой не хватало адресного пространства, занималась тем, что среди миллионов картинок пыталась найти кучки похожих, таким образом, что каждая картинка была бы хоть как-то похожа на какую-нибудь кучку, и при этом кучек было не много. Например тысяча...
Ну если все держать в памяти, то неудивительно что она закончилась.
Здравствуйте, gandjustas, Вы писали:
NBN>>Тем не менее, человек владеющий С++ врядли будет предлагать использовать С, когда можно использовать С++. G>Поправочка: знающий С++ и незнающий других, более выкосоуровневых языков.
Тогда по твоей логике такой предлагать С вместо С++ уж точно не будет. Так что не отнекивайся.
G>Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие?
С классами, шаблонами — навалом. На производительности результата они не сказываются.
Полиморфизм через виртуальное наследование и исключения — в HPC используются только тогда, когда без них ну совсем ВАЩЕ никак.
Динамическая память используется, но выделение/освобождение из критического кода выносятся по максимуму — всё выделяется заранее.
NBN>>А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит. G>Вообще сложность C++ такова что его использовать почти нигде не стоит. Это всего лишь твоё мнение.
Хочешь реальных сложностей — на асме под мелкие контроллеры попиши.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
NBN>>А чем мешают шаблоны и классы там где нужна высокая производительность? G>Вряд ли они там мешают, но не помогают — это точно.
Код писать с ними удобнее чем в С стиле.
NBN>>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа. G>С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители.
Да ты еще и геймдевелопер я смотрю И спец по переносу расчетов на GPU.
Ну-ка расскажи что там и как в геймдеве, а я послушаю.
G>Кроме того .NET не такой медленный как тут некоторые пытаются показать.
Уже всё всем давно показали: Cellfactor
G>А многим ли приложениям на десктопе нужная шустрая работа?
По мне так всем.
G>У меня таких только два — браузер и среда разработки. Причем опера (которая на C++) тормозит гораздо сильнее чем VS (которая на треть из managed модулей).
Ужас какой. Бери FF — она у меня тормозит куда меньше чем VS2003/2005/2008, которые у меня тут установлены.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>>>Вряд ли они там мешают, но не помогают — это точно. NBN>>Помогают — облегчают рефакторинг и читаемость кода. G>Шаблоны улучшают читаемость только в самых простых случаях.
Шаблоны это не только александреску-стайл. С ними можно писать читабельный и удобный код.
NBN>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит.
до 64Gb позволит. Больше современный 32бит проц адресовать не может.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Вот есть приложение на .NET — www.microsoft.com, там какая сложность?
Средняя сложность. Это если без БД, а только приложение само.
G>couchDB занимался один человек, у него времени на оптимизацию GC уж точно не было.
Ну так там есть ещё одна база данных -- его родная... Нужно было просто повторить архитектуру в целом...
G>Вопросы архитектуры ортогональны вопросам быстройдействия.
Неправда. Предложи задачу, я предложу тебе архитектуру, которая не сможет обеспечить большого быстродействия
G>И опять приходим к тому что для того случая где нужно быстродействие используем C, а для всего остального высокоуровневые средства.
Если тебе из С и С++ больше нравится первый, то никто не мешает тебе использовать первый. Один из существенных его недостатков тот, что на нём реально писать только то, где очень нужно быстродействие, а на плюсах можно и остальное.
Но это совсем другая тема. Как делать выбор между С и С++ более или менее понятно. Если есть компиллер, и ты не Тольвальдс или его подчинённый, то С++
G>>>Ну на управляемых языках это так, на неупрвляемых — зависит от разработчика. E>>Нет. Не зависит. Плохой разработчик потратит на реализацию сложного проекта бесконечное время Причём на ЛЮБОМ ЯЗЫКЕ... G>А кто говорит о плохом разработчике?
Ну там повыше выделено три твоих слова...
Про индусов и ХиндиС, я так понимаю, возражений нет? Вот и славненько!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
И>>>>>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>>>>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>>>>>Ты не в тот таскманагер смотришь, тебе уже сообщали. G>>>>Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю. CC>>>И давно ты "кол-во используемой памяти" меряешь профайлером? G>>А я где-то говрил что меряю количество памяти? G>>Я же написал что эти цифирки не интересуют. Если нужно быстродействие, то меряю его профайлером. CC>Ты придуриваешься или всегда такой? Специально оставил поквоченную всю историю вопроса. Речь шла про (см. выше) память. Перечитай внимательно.
Читай выделенное.
CC>Беда то в том, что входной порог в managed сильно низкий, и обложенный памперсами нуб может спокойно говнокодить не получая при этом за свой говнокод по рукам — работает же, и не падает.
Это же замечательно. Больше людей счастливы.
И>>>>>>>а) есть стэк; G>>>>>>Стек заставляет копировать объекты чаще, чем нужно. CC>>>>>С чего бы вдруг? G>>>>Передача объектов по значению вызывает копирование. CC>>>Обьясни поподробнее какая связь между аллокацией на стеке и передачей объектов по значению? G>>А возвращение объектов при выделении памяти на стеке как происходит? CC>Если объект сколь либо серьезных размеров возвращают то никто его на стеке в здравом уме не станет размещать.
Это каких размеров?
CC>Кстати в случае если все таки размещают то ситуацию несколько спасает RVO.
И сыылку спасают при передаче параметров.
Только все это знания, не нужные для решения задачи.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
NBN>>>Тем не менее, человек владеющий С++ врядли будет предлагать использовать С, когда можно использовать С++. G>>Поправочка: знающий С++ и незнающий других, более выкосоуровневых языков. CC>Тогда по твоей логике такой предлагать С вместо С++ уж точно не будет. Так что не отнекивайся.
Так я и предлагаю C для performance-critical кода. В остальных случаях более выкокоуровневые языку рулят.
G>>Много ли у вас кода на C++ (с классами, шаблонами, полиморфизмом, эксепшенами и динамической памятью) в тех местах где нужно высокое быстродействие? CC>С классами, шаблонами — навалом. На производительности результата они не сказываются. CC>Полиморфизм через виртуальное наследование и исключения — в HPC используются только тогда, когда без них ну совсем ВАЩЕ никак. CC>Динамическая память используется, но выделение/освобождение из критического кода выносятся по максимуму — всё выделяется заранее.
Ну так у вас и получается C_с_клссами.
NBN>>>А если вы владеете С++ недостаточно — то исчезает последняя почва для спора С++ — язык сложный и филиграный и использовать его в качестве лома действительно не стоит. G>>Вообще сложность C++ такова что его использовать почти нигде не стоит. CC> Это всего лишь твоё мнение.
Да
CC>Хочешь реальных сложностей — на асме под мелкие контроллеры попиши.
Писал, там сложности другого порядка, в основном связанные с ограничениями железа и слабой выразительностью самого ассемблера.
Сложность C++ связана с кучей тонкостей, которые надо знать, помноженными на количество способов отстрелить себе ноги.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
NBN>>>А чем мешают шаблоны и классы там где нужна высокая производительность? G>>Вряд ли они там мешают, но не помогают — это точно. CC>Код писать с ними удобнее чем в С стиле.
А на более выкогоуровневых языках еще удобнее. Вы с этим спортить будете?
NBN>>>Ага, кроме как для игр, приложений затрагивающих эмбеддед сложнее простейших контроллеров, кроссплатформенных приложений которым требуется шустрая работа. G>>С играми отдельная песня — там сейчас во всю идет перенос тяжелых вычислений на аппартаные ускорители. CC>Да ты еще и геймдевелопер я смотрю И спец по переносу расчетов на GPU. CC>Ну-ка расскажи что там и как в геймдеве, а я послушаю.
Не, я с геймдевом сталкивался всего пару раз и обра раза впечатления неочень.
G>>Кроме того .NET не такой медленный как тут некоторые пытаются показать. CC>Уже всё всем давно показали: Cellfactor
Думаете нету тормозящего говна, написанного на любом языке?
G>>А многим ли приложениям на десктопе нужная шустрая работа? CC>По мне так всем.
Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
Проснись, далеко не всем нужна запредельная производительность. А на практике получается что скорость работы программы упирается в диск\сеть и прочее.
Только в игрушках может исключение.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>>>Вряд ли они там мешают, но не помогают — это точно. NBN>>>Помогают — облегчают рефакторинг и читаемость кода. G>>Шаблоны улучшают читаемость только в самых простых случаях. CC>Шаблоны это не только александреску-стайл. С ними можно писать читабельный и удобный код.
Ну я и говорю — с самых простых случаях, но в таких случаях C++ сильно уступает по выразительности C#.
NBN>>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит. CC>до 64Gb позволит. Больше современный 32бит проц адресовать не может.
Каким образом имея 32-битный указатель можно обратить за пределы четырех гигов?
Возможно сама ось может увидеть много памяти, а для 32-битного приложения 4 гига — предел.
Здравствуйте, Erop, Вы писали:
G>>Вопросы архитектуры ортогональны вопросам быстройдействия. E>Неправда. Предложи задачу, я предложу тебе архитектуру, которая не сможет обеспечить большого быстродействия
Я в этом даже не смоневаюсь.
G>>И опять приходим к тому что для того случая где нужно быстродействие используем C, а для всего остального высокоуровневые средства. E>Если тебе из С и С++ больше нравится первый, то никто не мешает тебе использовать первый. Один из существенных его недостатков тот, что на нём реально писать только то, где очень нужно быстродействие, а на плюсах можно и остальное.
Все остальное можно писать на более высокоуровневых языках.
Здравствуйте, gandjustas, Вы писали:
G>Для расчетов — большими, матрицы примерно 100х100. G>Для визуализации — куча маленьких.
Ну, а их много было-то?
Я так понимаю, что объекты по 80 кил уже в GC не играют, так что эти большие куски надо, по чеснаку, из 300 метров вычесть. Остальное -- оверхед на визуализаци.... G>Я вообще говоря не следил за выделением памяти в этой программе.
Ну сколько больших матриц-то было в курсе? Тысяча? Больше? Меньше? Если сильно меньше 1000, то максимум на матрицы 50 -- метров. Ещё пусть 50 -- это то, что нужно на визуализацию в нормальной проге. Это с бо-о-о-ольшим, я тебе скажу, запасом. Ну а 200 метров -- это то, что ты не следил/либо то, что GC съел от большой эффективности
G>Ну если все держать в памяти, то неудивительно что она закончилась.
Ну цель-то была не в памяти держать, или там не в памяти, а результат получить
Но там не совсем в памяти было, на самом деле, но это уже подробности. Результат, тем не менее получить удалось
Прототип на C# не смог ничего... ;(
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Mamut, Вы писали:
E>> Кстати, миллион строк кода -- это не очень крупный проект...
M>Смотря, на чем писать
Я так понимаю, что на ХиндиСе имелось в виду...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Дык данные-то есть? Методика, что и как измеряли? На каких примерах? Какая получилась статистика? G>>Не я мерял, во многих книгах и статьях читал упоминания этого факта.
E>Я думаю, что это просто PR. E>Уж больно факт малоправдоподобный
E>Неужели вот в этом коде:
inline void foo( int i ) { std::cout << i; }
вероятность ошибки в 5 раз меньше, чем в этом:
inline
E>void foo( int i )
E>{
E> std::cout << i;
E>}
E>А языки отличаются намного сильнее, чем разные стили кодирования в С++
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Для расчетов — большими, матрицы примерно 100х100. G>>Для визуализации — куча маленьких. E>Ну, а их много было-то? E>Я так понимаю, что объекты по 80 кил уже в GC не играют, так что эти большие куски надо, по чеснаку, из 300 метров вычесть. Остальное -- оверхед на визуализаци....
Это вообще к чему?
G>>Я вообще говоря не следил за выделением памяти в этой программе. E>Ну сколько больших матриц-то было в курсе? Тысяча? Больше? Меньше? Если сильно меньше 1000, то максимум на матрицы 50 -- метров. Ещё пусть 50 -- это то, что нужно на визуализацию в нормальной проге. Это с бо-о-о-ольшим, я тебе скажу, запасом. Ну а 200 метров -- это то, что ты не следил/либо то, что GC съел от большой эффективности
А мне то что?
На всех машинах, где програ запускалась она работала отлично, ни тормозняков, ни дерганя, ни своппинга.
G>>Ну если все держать в памяти, то неудивительно что она закончилась. E>Ну цель-то была не в памяти держать, или там не в памяти, а результат получить E>Но там не совсем в памяти было, на самом деле, но это уже подробности. Результат, тем не менее получить удалось E>Прототип на C# не смог ничего... ;(
Это говорит только о вашем неумении писать на C.
Здравствуйте, gandjustas, Вы писали:
G>Все остальное можно писать на более высокоуровневых языках.
Конечно можно. Но тлько если оно в вычислительном смысле ничего не делает. Максимум -- тупо считает по формулам.
Если есть сложная логика + много памяти + нужна скорость и компактность, то ХиндиС -- плохой выбор!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
E> А языки отличаются намного сильнее, чем разные стили кодирования в С++
Известно, что количество ошибок на 100 строчек кода в среднем одинаково, вне зависимости от языка программирования. Вывод — надо писать на языке программирования, который помогает мысли выражать более коротко и ясно
Здравствуйте, gandjustas, Вы писали:
G>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
1С — УГ.
Я знаю программу — Супермаг 2000, написанную на Оракле, отчет пару часов для небольшого магазина. И причем здесь Оракл? Хреновую программу можно написать на любом языке.
Здравствуйте, gandjustas, Вы писали:
G>Это вообще к чему?
Я хочу понять насколько 300 метров было скушано по делу.
Для сравнения последний FR, при распознавании всех азиатских языков одновременно жрёт столько же...
G>На всех машинах, где програ запускалась она работала отлично, ни тормозняков, ни дерганя, ни своппинга.
То, что ты память не считаешь, а докупаешь, если не хватает, я уже понял. К сожалению в коробочном софте такой подход не совсем канает...
E>>Прототип на C# не смог ничего... ;( G>Это говорит только о вашем неумении писать на C.
Правда? Если ты хочешь меня в чём-то убедить, то не надо делать утверждений, в которых ты заведомо менее компетентен, чем я (скажем оценивать моё умение писать на чём бы то ни было)
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Все остальное можно писать на более высокоуровневых языках. E>Конечно можно. Но тлько если оно в вычислительном смысле ничего не делает. Максимум -- тупо считает по формулам.
Какой-то левый полет мысли.
E>Если есть сложная логика + много памяти + нужна скорость и компактность, то ХиндиС -- плохой выбор!
Покажите мне программу где все это нужно одновременно.
Здравствуйте, gandjustas, Вы писали:
G>Вам наверное стоит почитать как считают строки.
1) Я хотел бы узнать методу, которая использовалась в ТОМ САМОМ ИССЛЕДОВАНИИИ
2) Вам, наверное, стоит попробовать понять, что же вам пытаются донести собеседники...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, MxKazan, Вы писали:
MK>Я, конечно, согласен, но только в определенной степени. Речь все-таки не о гигабайтах и 512 мегов сейчас уже редкость. Managed проги хоть и требуют памяти больше нативных, но все же не по 200 мегов на каждую фенечку. Тот же Creative Docs не отобрал у меня больше 120 Мб и при открытии всех сэмплов в поставке (я их покрутил/повертел/поперетаскивал).
Да блин у меня на 2 гигах открыты две VS2008 с решарпером и всё, 2 гига кончились. А проект запустить так вообще 2.7 гига коммит и веник в свопе надрывается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Mamut, Вы писали:
M>Известно, что количество ошибок на 100 строчек кода в среднем одинаково, вне зависимости от языка программирования. Вывод — надо писать на языке программирования, который помогает мысли выражать более коротко и ясно
Откуда это известно-то? Я в это не верю, например!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Это вообще к чему? E>Я хочу понять насколько 300 метров было скушано по делу.
А вам не все равно?
Мне например все равно.
Прога не тормозила нигде.
E>Для сравнения последний FR, при распознавании всех азиатских языков одновременно жрёт столько же...
Я очень рад за него.
G>>На всех машинах, где програ запускалась она работала отлично, ни тормозняков, ни дерганя, ни своппинга. E>То, что ты память не считаешь, а докупаешь, если не хватает, я уже понял. К сожалению в коробочном софте такой подход не совсем канает...
Не думаю что в коробочном софте мне придется решать матричные уравнения с размерносятми 100 на 100.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, _d_m_, Вы писали:
___>>Здравствуйте, gandjustas, Вы писали:
G>>>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
___>>1С — УГ. ___>>Я знаю программу — Супермаг 2000, написанную на Оракле, отчет пару часов для небольшого магазина. И причем здесь Оракл? Хреновую программу можно написать на любом языке. G>Я про это и говорю. G>Самое главное что пользователи могут и пару часов подождать.
Ну как знать. У нас если отчет больше 5 минут — все жалобы: программа зависла — они просто убивают браузер. Кстати, MS SQL 2005 + ASP.Net 2.0 + IE7. Есть инсталяции работающие на сервере 2xPIII 1GHz. И и ничего — отчеты до 5 минут.
Кстати: спецом тестировали на всех браузерах стресс тесты — нормально выводить таблицу из 20000 строк может за 5 мин только IE. Остальные очень умные браузеры выводят таблицу не целиком, а каждую добавленную строку пытаются отобразить в итоге — больше часа.
Здравствуйте, gandjustas, Вы писали:
E>>Для сравнения последний FR, при распознавании всех азиатских языков одновременно жрёт столько же... G>Я очень рад за него.
Фишка в том, что он с ещё кучкой прог может одновременно работать. А если всё писать на ХиндиС, то на каждую прогну придётся по компу покупать ;(
G>Не думаю что в коробочном софте мне придется решать матричные уравнения с размерносятми 100 на 100.
Что-то как-то конкретики мало. То ты приводишь как типичный пример эту решалку уравнений, то потом, оказывается, что это маргинальщина какая-то.
Кстати, так сколько матриц-то 100х100 было нужно ОДНОВРЕМЕННО? Или у тебя уже настолько C# головного мозга, что ты это и прикинуть даже не можешь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Для сравнения последний FR, при распознавании всех азиатских языков одновременно жрёт столько же... G>>Я очень рад за него.
E>Фишка в том, что он с ещё кучкой прог может одновременно работать. А если всё писать на ХиндиС, то на каждую прогну придётся по компу покупать ;(
Большенство прог, будучи неактивнми вообще не мешают други, при необходимости скидываясь в своп чуть ли не полностью.
Причем это не зависит от языка разработки.
G>>Не думаю что в коробочном софте мне придется решать матричные уравнения с размерносятми 100 на 100. E>Что-то как-то конкретики мало. То ты приводишь как типичный пример эту решалку уравнений, то потом, оказывается, что это маргинальщина какая-то. E>Кстати, так сколько матриц-то 100х100 было нужно ОДНОВРЕМЕННО?
30-40 висят в памяти для истории, сколько временных создавалось при расчетах лень считать.
E>Или у тебя уже настолько C# головного мозга, что ты это и прикинуть даже не можешь?
Ты глумишься и не понимаешь что мне абсолютно незачем считать сколько у меня там матриц для решения задачи с приемлимым качеством.
Вот как раз отбрасывание многих незначящих для решения деталей и дают преимущество высокоуровневым языкам.
Здравствуйте, hattab, Вы писали:
H>Да какой бы я пример не привел, ты назовешь его левым или говнософтом. Ладно, еще пример из говнософта. Запускаем Paint.NET и открываем в нем картинку (я открыл 1600x1200). Выделяем всю картинку Ctrl+A. Смотрим на счетчики GC и видим, что в мирно крутящем пунктир выделения Paint.NET'е, счетчик GC тикает раз-два-три в секунду.
H>Мне, как пользователю, не интересны резоны GC. Я вижу результат -- чрезмерное потребление. Делаем простой эксперимент. Запускаем Paint.NET, который откушал сразу 35Mb (судя по твоим словам, большая часть этой цифры -- резерв, который будет возвращен в систему по первому требованию). Теперь начинаем запускать много тяжелого софта: две Delphi IDE, Open Office Writer, Abode Reader, Opera (она у меня жрет в районе 160Mb, из-за размера почтовой базы), VirtualBox. Все система ушла в своп. Смотрим на потребление Paint.NET... оно снизилось ровно на 300Кб. Выводы?
Хорошо а как быть с программой печати акцизных марок фирмы Атлас написанной на дельфи жрущей 300Мб оперативы, и текущей как дырявое ведро? (Это было года 3 назад).
Здравствуйте, gandjustas, Вы писали:
E>>Фишка в том, что он с ещё кучкой прог может одновременно работать. А если всё писать на ХиндиС, то на каждую прогу придётся по компу покупать ;( G>Большенство прог, будучи неактивнми вообще не мешают други, при необходимости скидываясь в своп чуть ли не полностью. G>Причем это не зависит от языка разработки.
Ты читать умеешь? Выделенное перечти, пожалуйста...
E>>Кстати, так сколько матриц-то 100х100 было нужно ОДНОВРЕМЕННО? G>30-40 висят в памяти для истории, сколько временных создавалось при расчетах лень считать.
Это так сложно?
Считать не обязательно достаточно прикинуть с точностью до порядка.
50 — 100 -- нормальная оценка?
Если да, то это всего-навсего 8 метров... Так что твоя прока тупо профукала 250 из 300, то есть более 80% использованной памяти!!!
G>Вот как раз отбрасывание многих незначящих для решения деталей и дают преимущество высокоуровневым языкам.
Ну ты уже настолько абстрагировался, что и СЕЙЧАС прикинуть не можешь, что ли?
Тогда у тебя без шуток C#-головного-мозга, IMHO
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, CreatorCray, Вы писали:
CC>Да блин у меня на 2 гигах открыты две VS2008 с решарпером и всё, 2 гига кончились. А проект запустить так вообще 2.7 гига коммит и веник в свопе надрывается.
Да правда чтоль. На работе 2 Гига. Бывает и по три Студии открываю. И ничего не тормозит вообще. Про проект ничо не скажу, оно в зачаточном состоянии.
Здравствуйте, gandjustas, Вы писали:
G>>>>>Вряд ли они там мешают, но не помогают — это точно. NBN>>>>Помогают — облегчают рефакторинг и читаемость кода. G>>>Шаблоны улучшают читаемость только в самых простых случаях. CC>>Шаблоны это не только александреску-стайл. С ними можно писать читабельный и удобный код. G>Ну я и говорю — с самых простых случаях, но в таких случаях C++ сильно уступает по выразительности C#.
Откуда в сравнении С и С++ взялся С#? Мсье софист со стажем?
G>Каким образом имея 32-битный указатель можно обратить за пределы четырех гигов? G>Возможно сама ось может увидеть много памяти, а для 32-битного приложения 4 гига — предел.
ОС это точно такой же код, как и в приложении, только привилегий побольше.
А добраться можно например через сегментные регистры и LDT, но это уже нестандартное приложение получится.
Так что технически это осуществимо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
И>>>>>>>>Достаточно в таск менеджере взглянуть на кол-во используемой памяти .net прогой и С++ с эквивалентной функциональностью, чтобы понять, что ты гонишь. G>>>>>>>Кроме того цифра в таск менеждере ни о чем не говорит, просто сверните приложение, будете удивлены. CC>>>>>>Ты не в тот таскманагер смотришь, тебе уже сообщали. G>>>>>Пор цифирке в таскабаре — не ко мне, они меня мало интересуют. Я производидтельность профайлером меряю. CC>>>>И давно ты "кол-во используемой памяти" меряешь профайлером? G>>>А я где-то говрил что меряю количество памяти? G>>>Я же написал что эти цифирки не интересуют. Если нужно быстродействие, то меряю его профайлером. CC>>Ты придуриваешься или всегда такой? Специально оставил поквоченную всю историю вопроса. Речь шла про (см. выше) память. Перечитай внимательно. G>Читай выделенное.
Да да, тебе про потребляемую память, а ты "а мне до сиреневой звезды, у меня профайлер!".
G>Это же замечательно. Больше людей счастливы.
Особенно те, которым потом этот говнокод отдают на переделку.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
E>>Если есть сложная логика + много памяти + нужна скорость и компактность, то ХиндиС -- плохой выбор! G>Покажите мне программу где все это нужно одновременно.
Алгоритм факторизации MPQS например. Памяти надо тонны, расчетов на месяцы.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
E>>>Если есть сложная логика + много памяти + нужна скорость и компактность, то ХиндиС -- плохой выбор! G>>Покажите мне программу где все это нужно одновременно. CC>Алгоритм факторизации MPQS например. Памяти надо тонны, расчетов на месяцы.
Угу, и его чаще всего пишут на С, опять С++ остался неудел
Здравствуйте, CreatorCray, Вы писали:
CC> M>Который невозможно сопровождать и отлаживать?
CC> С неалександреску шаблонами — читабельный и отлаживабельный
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> aList;
aList.insert(10); // итератор намеренно пропущенreturn 0;
}
Сообщение об ошибке
pascal@zetwal:~/temp$ g++ stltest.cpp
stltest.cpp: In function ‘int main()’:
stltest.cpp:9: error: no matching function for call to ‘std::vector<int, std::allocator<int> >::insert(int)’
/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/vector.tcc:93:
Здравствуйте, MxKazan, Вы писали:
CC>>Да блин у меня на 2 гигах открыты две VS2008 с решарпером и всё, 2 гига кончились. А проект запустить так вообще 2.7 гига коммит и веник в свопе надрывается. MK>Да правда чтоль. На работе 2 Гига. Бывает и по три Студии открываю. И ничего не тормозит вообще. MK>Про проект ничо не скажу, оно в зачаточном состоянии.
Проект на шарпе, здоровый, писан когда то американскими индусами.
Стало легче когда решарпер снёс.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>>>Например при ипользовании ФВП с помощью буста затайпдефить все функции не получися. CC>>Функциональщину на С++ на данный момент я отношу к редкостным извращениям, полагая что если надо функциональщина — лучше взять другой язык. CC>>Появится поддержка functional из С++0х в компилерах — будем посмотреть. CC>>А пока это не для С++. G>То есть всетаки с++ недостаточно выразительный.
В сравнении с С, про который речь в этой ветке?
G>Что и требовалось доказать.
Сам себе придумал, сам себе доказал. Как тебе жить просто, а.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
E>>>>Если есть сложная логика + много памяти + нужна скорость и компактность, то ХиндиС -- плохой выбор! G>>>Покажите мне программу где все это нужно одновременно. CC>>Алгоритм факторизации MPQS например. Памяти надо тонны, расчетов на месяцы. G>Угу, и его чаще всего пишут на С, опять С++ остался неудел
А пацаны то и не знают
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Mamut, Вы писали:
M>Сообщение об ошибке
M>pascal@zetwal:~/temp$ g++ stltest.cpp M>stltest.cpp: In function ‘int main()’: M>stltest.cpp:9: error: no matching function for call to ‘std::vector<int, std::allocator<int> >::insert(int)’ M>/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/vector.tcc:93:
M>note: candidates are: typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp& ) [with _Tp = int, _Alloc = std::allocator<int>] M>/usr/lib/gcc/i486-linux-gnu/4.0.3/../../../../include/c++/4.0.3/bits/stl_vector.h:657: note: void std::vector<_Tp, _Alloc>::insert(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, size_t, const _Tp& ) [with _Tp = int, _Alloc = std::allocator<int>]
M>[/q]
Вай батыр, какой дурдом!
Меняй компилер, срочно!
Кошерный выводит так:
Compiling with Intel(R) C++ 11.0.061 [IA-32]... (Intel C++ Environment)
main.cpp
.\main.cpp(9): error: no instance of overloaded function "std::vector<_Ty, _Ax>::insert [with _Ty=int, _Ax=std::allocator<int>]" matches the argument list
argument types are: (int)
object type is: std::vector<int, std::allocator<int>>
aList.insert(10); // итератор намеренно пропущен
^
compilation aborted for .\main.cpp (code 2)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Mamut, Вы писали:
M>Ну, когда на банальном СТЛе может вывалиться простыня в 5-7 строк звернутых друг в друга шаблонах — все равно не очень отлаживабельный http://pascalg.wordpress.com/2008/02/24/stl-error-messages-are-so-great/
хы, и это разве сообщение об ошибке которым стоит гордится?
проанализировал как я анализировал:
взгяд ухватился за стрчку error:
далее прочитал текст no matching function for call
далее прочитал insert(int)
далее прочитал to ‘std::vector<int, std::allocator<int> >
далее взгляд перенёсся на aList.insert(10);
далее было задействовано около двух десятков лицевых мышц для выражения типа o_O
потрачено: ~6 секунд.
вывод: ето даже не попытка ввести в замешательство.
Здравствуйте, Mamut, Вы писали:
CC>> Меняй компилер, срочно! M>Это не решение проблемы
Ну так диагностика об ошибке то куда вменяемее. Проблема я так понял в неразборчивой простыне в случае ошибки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали: G>>Не зачастую, всегда, но GC работает в сотни раз реже, чем выделение-совобождение памяти стандартным аллокатором. CC>Это как напишешь. В unmanaged в реальном коде где надо performance выделение/освобождение памяти выносят "за скобки" и делают крайне редко.
Ты не поверишь — в managed делают точно так же. К примеру, для интенсивных сокетных операций на старте приложения распределяют буфера, которые впоследствии будут пиниться, чтобы защититься от фрагментации хипа.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, CreatorCray, Вы писали: CC>Беда то в том, что входной порог в managed сильно низкий, и обложенный памперсами нуб может спокойно говнокодить не получая при этом за свой говнокод по рукам — работает же, и не падает.
Ничего страшного. На плюсах нуб точно так же может говнокодить. То, что приложение сумело запуститься у нуба на машине, никак не гарантирует того, что оно будет устойчиво работать во всех сценариях.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, hattab, Вы писали: G>>Включай мозг: все что требуется от такого "графа" только возможность проверить присуствует ли объект в нем. Это значит что достаточно битовго флага.
H>Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным.
Увы, всё так и есть. Упорство в заблуждениях никого не красит. Никакого "отдельного" графа GC не строит. Он раскрашивает существующий.
Объем памяти, нужный для Register Map, крайне мал.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>Сколько у тебя на компютере программ "одноврменно работают" без твоего участия?
По пять — десять на каждом...
E>>Если да, то это всего-навсего 8 метров... Так что твоя прока тупо профукала 250 из 300, то есть более 80% использованной памяти!!! G>О ужас, горе мне. G>А вообще меня это нисколько не волнует.
Я понимаю, что тебя это не волнует. Но те, кого парит эффективность их программ, несколько недовольны таким положением вещей...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Sansend, Вы писали:
S>Могу привести пример ediEnterprise ЕРП система для логистики(подробностей не знаю). Штат разработчиков — около 90 человек, полностью написано на C#, тянет на 300-400 человеколет =)
Да, согласен, это уже крупный проект. Интересно, кстати, какое там соотношение между SQL и C#?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код.
Здравствуйте, Erop, Вы писали:
G>>Посмотрел то что я писал, для программы показатель COMMITED памяти редко переваливает за 300 метров, это очень много? E>От программы зависит. Для тачки с 512 Мб на борту это больше половины доступного RAM... E>Так что, если прога -- это часы, например, то привет...
Более того, из 512, после загрузки системы, занято ~200 Не то чтобы мне было жалко денег (~$170 за 2Gb), просто пока меня реально не припрет покупать не буду, а .Net софт меня не припирает
Здравствуйте, gandjustas, Вы писали:
G>Я сталкивался с пользователями, которые вполне нормально мирились с генерацияей отчета на 1с (которая на С++) которая длилась двадцать минут.
У меня был контракт с конторой, в которой зарплата расчитывалась 2.5 суток (!) (большая контора). Они тоже считали это нормальным, пока мы не сократили время до 40 минут (переписали с нуля)
G>Проснись, далеко не всем нужна запредельная производительность. А на практике получается что скорость работы программы упирается в диск\сеть и прочее. G>Только в игрушках может исключение.
Скажи, а во что упирается меню в WLW, отзывчивость которого меня жутко печалит (при установке он прогоняется ngen'ом, так что это не JIT)?
Здравствуйте, _d_m_, Вы писали:
___>Хорошо а как быть с программой печати акцизных марок фирмы Атлас написанной на дельфи жрущей 300Мб оперативы, и текущей как дырявое ведро? (Это было года 3 назад).
Странный вопрос... Я разве где-то утверждал, что Delphi или любой другой натив есть решение всех проблем?
Здравствуйте, Sinclair, Вы писали:
H>>Давай ты последуешь своему совету и подумаешь, что такое граф и, как с помощью битового флага (а точнее речь идет битовом массиве, как я понимаю) можно определить находжение объекта в куче для последующих манипуляций с оным. S>Увы, всё так и есть. Упорство в заблуждениях никого не красит. Никакого "отдельного" графа GC не строит. Он раскрашивает существующий. S>Объем памяти, нужный для Register Map, крайне мал.
Русский перевод Рихтера ввел в заблуждение (я его цитировал) Прозрение пришло в виде другого перевода Рихтера
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
H>У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код.
Там кроме диска еще оооочень много факторов, влияющих на производительность.
Здравствуйте, gandjustas, Вы писали:
G>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение.
Это никому не требуется, кроме древних-предревних кучь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Незнаю во что у тебя меню упирается, только что проверил — все летает. E>Ну у тебя всегда всё летает. Это не ново. E>подумалось мне тут, что не на память-там-шмамять и на камни деньгу тратить надо, чтобы "все летало", а на траву позабористее, что-то типа лайт-версии чёрно-белого плана...
E>Ганджустас! (И как я раньше тайну ника-то не просёк!!!) Будь человеком, отсыпь кораблик?..
Я уже бросил
Здравствуйте, gandjustas, Вы писали:
g> Каким образом имея 32-битный указатель можно обратить за пределы четырех гигов? g> Возможно сама ось может увидеть много памяти, а для 32-битного приложения 4 гига — предел.
NBN>>>>А в шарпе уже появилась возможность с пользой использовать всю доступную память? (а то в текущем проекте пришлось поизвращаться и залазить в узкие рамки G>>>Я нормально выделял на шарпе под 2 гига. Вроде как 32-битная ось больше выделить не позволит. CC>>до 64Gb позволит. Больше современный 32бит проц адресовать не может. G>Каким образом имея 32-битный указатель можно обратить за пределы четырех гигов?
PSE и PAE — 36 bit addressing.
64GB можно адресовать только в некоторых серверных OS (Win2kX Server Enterprise на сколько я помню).
G>Возможно сама ось может увидеть много памяти, а для 32-битного приложения 4 гига — предел.
Обычно и того меньше — до 2GB, что можно переконфигурировать в boot.ini и получить до 3х.
Здравствуйте, Erop, Вы писали: E>Ну и поспотришь ты профайлером, и что дальше будет? Если у тебя проектирования не было, а задача сложная, то будет тормозное г., при этом факт того, что это тормозное г. будет задокументирован профайлером
Я понимаю, головой думать — это тяжелая работа. Ок, специально для тех, кто не представляет себе, что бывает "дальше" после просмотра профайлером, маленькая история вот здесь.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Sinclair wrote:
> Я понимаю, головой думать — это тяжелая работа. Ок, специально для тех, кто не представляет себе, что бывает "дальше" после просмотра профайлером, маленькая история вот здесь.
В англицком к примеру я не силен. В трех словах пожалуйста опиши что там происходит. Насколько я понял — чел добился существенного увеличения производительности, или нет?
Здравствуйте, gandjustas, Вы писали:
H>>Отсутствие большого объема свободной памяти и отстутствие свободной памяти вообще, сравнивать, как бы, нельзя G>Это к тому что тормозов дополнительных нету независимот от .NET или native.
Реальность с тобой не согласна. Увы.
H>>>>Не жалко. Просто ты говорил о редких сборках мусора, а я тебе примеры привожу, которые показывают обратное. G>>>3 раза в секунду это часто? G>>>На гигагерцовом процессоре за секунду выполняется 1000000000 тактов. При этом если в приложении ничего не происходит, то все поколение становится мксором и не происходит фактически уплотнения кучи. H>>Это демагогия. G>Демагогия это делать выводы о производительности основываясь на мифилогизированных представлениях о GC.
Я делаю выводы исключительно на основе личного опыта работы с .Net софтом.
G>>>Сборщик мусора на многопроцесорной машине работает в фоновом режиме по большей части. G>>>Так что влияние на производительность минимальная.
H>>Сборщик мусора, даже на многопроцессорной машине, даже "серверный", вынужден останавливать выполняющиеся потоки. Concurent GC требует синхронизации, что на производительности не может не сказаться. G>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение.
А я этого и не говорил Современным нативным аллокаторам тоже не требуется.
H>>Поколения конечно хорошо, но приводимый мною пример с XML-RPC.NET вызывает таки сборку во втором поколении (причем размер кучь у поколений постоянно меняется) G>Как это влияет на производительность?
Отрицательно.
G>Покажите код (.NET и нативный) и результаты замеров, тогда вам кто-нибудь поверит.
Код чего показать? Как делается вызов XML-RPC метода? OK (но что тебе это дасть?). (пишу по памяти)
C#:
[XmlRpcUrl("http://127.0.0.1/")]
public interface IScreenshot
{
[XmlRpcMethod("keyhole.getScreenshot64")]
byte[] getScreenshot64(int x, int y);
}
...
Picture.Image := Bitmap.FromStream(new MemoryStream(XmlRpcProxyGen.Create<IScreenshot>().getScreenshot64(320, 200)));
Код библиотеки XML-RPC.NET можешь скачать с ее домашней страницы. Для мониторинга использовал ProcessExplorer. В итоге, на 170 вызовов XML-RPC метода имеем: 101 сборка во втором поколении, 111 сборок в первом поколении, 295 сборок в нулевом поколении.
H>>>>Когда у меня кое как начинает шевелиться WLW вылезая из свопа, я очень хорошо сопоставления делаю. Не думаешь же ты, что для запуска этой мелочевки, я буду выгружать софт из своего рабочего окружения. G>>>А че, нативное приложение в свом не выгружается? Что ты пытаешься показать этой фразой? H>>Я говорю о том, что Paint.NET откушавший больше чем Turbo Delphi IDE, отправляется в утиль и остается там навсегда. G>Такое чувство что кода ты был маленький к тебе приходил дядька из Microsoft и отобрал у тебя конфетку. Теперь ты выплескиваешь свою обиду на форуме.
Ничего личного. Психоанализ явно не твой конек
G>Вообще за все время ты ни разу не привел аргументы почему .NET работает медленнее, все сводилось к каким-то левым наблюдениям (которые еще и не у всех воспроизводятся) и недалеким выводам.
А как надо наблюдать, чтоб наблюдения стали правыми? Использую, что имеется в наличии (софт т.е.), мониторю чем сам МС велел (perfmon-счетчики, они и в ProcessExplorer'е). Выводы исключительно по результатам
G>Кроме того ты очень активно в своих суждениях опираешься на библиотеку XML-RPC.NET, которая вообще непонятно как работает.
Библиотека XML-RPC.NET используется по нескольким причинам: 1) XML-RPC мне интересен. 2) При его реализации не обойтись без многократных выделений памяти, что в свою очередь позволяет увидеть, как на это реагирует GC. В общем, ссылку на сурсы я дал. Стоит ждать критики?
Здравствуйте, gandjustas, Вы писали:
G>>>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
H>>У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код. G> G>Там кроме диска еще оооочень много факторов, влияющих на производительность.
Здравствуйте, gandjustas, Вы писали:
G>Собиралось 2008 студией, релиз, запуск из проводника. G>C++ — 562 мсек, C# — 92 мсек.
G>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
Несмотря на всю бессмысленность синтетики, скажи, на какой машинке делал замер? Процессор (частота), память (тип, PC...)?
Здравствуйте, Sheridan, Вы писали:
S> Sinclair wrote:
S> > Я понимаю, головой думать — это тяжелая работа. Ок, специально для тех, кто не представляет себе, что бывает "дальше" после просмотра профайлером, маленькая история вот
S> здесь. S> В англицком к примеру я не силен. В трех словах пожалуйста опиши что там происходит. Насколько я понял — чел добился существенного увеличения производительности, или нет?
Преамбула: "если программа рсаботает со скоростью, указаной в ТЗ, нет смысла оптимизировать ее скорость дальше. Необходимо сосредоточить усилия на исправлении багов, безопасности, документации и т.п." Созвучно с Эриксоновским "сделай так, чтобы фещь работала, а потом, если необходимо, сделай так, чтобы она работала быстро"
Амбула:
Чел проганл профайлером свою программу и увидел, что 43% времени проводится в методе Contains. В .NET'е уже есть тип данных, который может быстро сообщить, есть в нем такой элемент, или нет, и сам хранит только уникальные (distinct) значения.
Таким образом замена этого кода:
var racks = (from rack in ReplaceQuestionMarks(originalRack)
select Canonicalize(rack)).Distinct().ToArray();
на
var racks = new HashSet<string>(
from rack in ReplaceQuestionMarks(originalRack)
select Canonicalize(rack));
Приводит к тому, что Contains теперь занимает всего 3% от времени программы.
Новый профайлинг показывает, что следующее узкое место — это комбинация метода ReadLine и каноникализации строки.
А там уже можно думать — кэшировать словарь (меньше запросо к диску, увеличение требований к памяти), заранее расчитывать индекс для словаря в канонической форме (увеличение места на диске, усложнение программы, уменьшение времени) и т.п.
ЗЫ. Локальный вывод типов рулит в плане читаемости
Sinclair wrote:
> S>В англицком к примеру я не силен. > Как же ты живешь-то?
Да неплохо в общем то живу.
> S>В трех словах пожалуйста опиши что там происходит. Насколько я понял — чел добился существенного увеличения производительности, или нет? >
...
Спасибо. Все правильно написано. Оптимизировать нужно в разумных пределах.
Здравствуйте, criosray, Вы писали:
C>Обычно и того меньше — до 2GB, что можно переконфигурировать в boot.ini и получить до 3х.
Уточню, процесс видит адресного пространства 4Gb/Segment, но использовать под свои нужды может тока младшие 2(3)Gb. Остальным распоряжается система.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
VS 2003 + ICC 11, C++ : 188
VS 2008, C# : 117
G>Собиралось 2008 студией, релиз, запуск из проводника. G>C++ — 562 мсек, C# — 92 мсек.
Дааа, хреновый С++ стал в 2008й студии. Наводит на интересные мысли.
G>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++.
У меня как видишь, рядышком.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>>Кстати о базах: есть couchDB, которая написана на Erlang, который является одним из самых медленных языков. И ниче, всем кто пользуется — нравится.
H>>>У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код. G>> G>>Там кроме диска еще оооочень много факторов, влияющих на производительность. H>Читаем вдумчиво.
Наверное надо было доабавить что работа с диском в меньшей степени влияет на производительность реальных СУБД, потому что там алгоритмической сложности нету, надо только подстроить под особенности работы ОС с диском.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Хвост, Вы писали: Х>>немного непонятно что ты в етой задаче нашёл такого "сложноописуемого" на с++ S>Не вижу сортировки по алфавиту.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
CC>CPUID: Intel(R) Pentium(R) D CPU 2.66GHz
CC>VS 2003 + ICC 11, C++ : 188 CC>VS 2008, C# : 117
Можно только порадоваться за компилятор интела.
А сколько ядер на машине?
G>>Стоит учесть что каждый проход GC в программе на C# очищает вс первое поколение в таком случа и двигание объектов не происходит, то немного исправляет результат в пользу C#, но даже если бы код на C# работал в 2 раза медленее, то он оказался бы в 3 раза быстрее стандартного аллокатора для C++. CC>У меня как видишь, рядышком.
Тем не менее в полтора раза.
При желании алгоритм в программе на C# можно построить так чтобы результат оказался близким к результату синтетического теста.
В целях оптимизации вполне можно так поступить.
Здравствуйте, gandjustas, Вы писали:
H>>>>Сборщик мусора, даже на многопроцессорной машине, даже "серверный", вынужден останавливать выполняющиеся потоки. Concurent GC требует синхронизации, что на производительности не может не сказаться. G>>>Но ты не забывай что GC не требуется проходи по списку на каждое выделение-освобождение. H>>А я этого и не говорил Современным нативным аллокаторам тоже не требуется. G>Я привел пример кодаЮ доказывающий обратное. G>Можешь конечно повторять свой тезис, но правдивее он не станет.
Смотри мой следующий пост Сурпрайз будет
G>>>Покажите код (.NET и нативный) и результаты замеров, тогда вам кто-нибудь поверит. H>>Код библиотеки XML-RPC.NET можешь скачать с ее домашней страницы. Для мониторинга использовал ProcessExplorer. В итоге, на 170 вызовов XML-RPC метода имеем: 101 сборка во втором поколении, 111 сборок в первом поколении, 295 сборок в нулевом поколении. G>А замеры производительности? Без них от этого толку нет. Лучше профайлером, чтобы сразу было видно где и от чего тормозит.
Банально логика: такое количество сборок мусора не может не сказаться на производительности.
G>>>Вообще за все время ты ни разу не привел аргументы почему .NET работает медленнее, все сводилось к каким-то левым наблюдениям (которые еще и не у всех воспроизводятся) и недалеким выводам. H>>А как надо наблюдать, чтоб наблюдения стали правыми? Использую, что имеется в наличии (софт т.е.), мониторю чем сам МС велел (perfmon-счетчики, они и в ProcessExplorer'е). Выводы исключительно по результатам G>По каким? Ты делаешь вывод о производительености, при этом не приводя ни одного факта, касающегося непостредственно этой самой производительности.
Количество сборок мусора я привел
G>>>Кроме того ты очень активно в своих суждениях опираешься на библиотеку XML-RPC.NET, которая вообще непонятно как работает. H>>Библиотека XML-RPC.NET используется по нескольким причинам: 1) XML-RPC мне интересен. 2) При его реализации не обойтись без многократных выделений памяти, что в свою очередь позволяет увидеть, как на это реагирует GC. В общем, ссылку на сурсы я дал. Стоит ждать критики? G>Где XML-RPC.NET найти я знаю, дай сырцы натвного исполнеия для сравнения.
Я не могу тебе дать сурсы закрытой библиотеки. Но ты не понял главной мысли. Я не пытаюсь сравнить XML-RPC.NET с моей нативной реализацией, т.к. это бессмысленно по причине разных алгоритмов парсинга пакетов. Она тут в пример приводится только для демонстрации поведения GC. Пойми это наконец.
Здравствуйте, gandjustas, Вы писали:
H>>Несмотря на всю бессмысленность синтетики, G>Работа с динамической памятью является основной операцией в большенстве программ.
Да, только эта синтетика с реальностью ничего общего не имеет
H>>скажи, на какой машинке делал замер? Процессор (частота), память (тип, PC...)? G>Ноут, Intel Core2Duo 1800 или около того, памяти 2 гб DDR2, ОС — виста.
G>Для сравнения запустил на домашнем компе, у него одноядерный Athlon 64 (GC точно не concurrent), 3 гига памяти, ОС — Windows Server 2008 x64. G>Замеры C++ — 562 мсек, C# — 135 мсек. G>Опять даже если учесть что в реальном случае .NET может работать в два раза медленее, то все равно не в пользу C++. G>Приложение на C# запустилось как 64-битное, что многло дать задержки на операции присваивания.
Теперь обещаный сурпрайз
Turbo Delphi 2006:
Type
TIntArray = Array [0 .. 63] Of Integer;
PIntArray = ^TIntArray;
Var
Index : Integer;
arr : PIntArray;
sw : THighResStopwatch; // на основе QueryPerformanceCounterbegin
sw.Start;
For Index := 1 To 1000000 Do
Begin
New(Arr);
Dispose(Arr);
End;
sw.Stop;
ShowMessageFmt('Time: %d', [sw.ElapsedTime]);
end;
> S>То что последнее слово за профайлером я и так знаю. > Неверно. > За профайлером должно быть первое слово.
Слушаю и повинуюсь, о грозный Ганджустас!!!
Здравствуйте, gandjustas, Вы писали:
H>>>>У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код. G>>> G>>>Там кроме диска еще оооочень много факторов, влияющих на производительность. H>>Читаем вдумчиво. G>Наверное надо было доабавить что работа с диском в меньшей степени влияет на производительность реальных СУБД, потому что там алгоритмической сложности нету, надо только подстроить под особенности работы ОС с диском.
Ты же вроде отметился в ветке, где приводили пример работы MSSQL с базой на диске и в памяти... Основные задержки, это, как раз таки, выборка данных с диска.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
H>>>>>У Borland/CodeGear тоже есть SQL сервер -- BlackFish, на Java и .Net. Я не в курсе, как там с перформансом, но и ежу понятно, что основная нагрузка при работе с БД ложится на дисковую систему, а вовсе не на управляемый код. G>>>> G>>>>Там кроме диска еще оооочень много факторов, влияющих на производительность. H>>>Читаем вдумчиво. G>>Наверное надо было доабавить что работа с диском в меньшей степени влияет на производительность реальных СУБД, потому что там алгоритмической сложности нету, надо только подстроить под особенности работы ОС с диском.
H>Ты же вроде отметился в ветке, где приводили пример работы MSSQL с базой на диске и в памяти... Основные задержки, это, как раз таки, выборка данных с диска.
Но оптимизировать эти издержки не сильно получится, только компромисс время-память.
Зато есть куча других мест в СУБД, в которых придется сильно понапрягаться чтобы вытянуть производительность.
Здравствуйте, gandjustas, Вы писали:
G>А сколько ядер на машине?
2 честных (не НТ)
G>В целях оптимизации вполне можно так поступить.
Могу ли я в таком случае оптимизировать С++ код?
Простое убирание блокировки (CriticalSection) через применение Per-Thread Allocator дает уже 47
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
G>>А сколько ядер на машине? CC>2 честных (не НТ)
G>>В целях оптимизации вполне можно так поступить. CC>Могу ли я в таком случае оптимизировать С++ код? CC>Простое убирание блокировки (CriticalSection) через применение Per-Thread Allocator дает уже 47
Здравствуйте, Sinclair, Вы писали: S>Я надеюсь, уточнение сортировки в Case-insensitive/accent-sensitive для турецкой локали не усложнит эту безусловно прекрасную программу?
безусловно усложнит, как минимум придётся написать волшебный предикат, как максимум заменить std::string на что-нибудь из комплекта ICU.
Здравствуйте, hattab, Вы писали: H>Base64 -- единственный способ передать бинарные данные в XML-RPC.
Несомненно, именно это было ключевым фактором при принятии решения о способе маршаллинга картинок в неуправляемый фильтр. Извини, не могу больше писать — встаю для аплодисментов.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
H>>Base64 -- единственный способ передать бинарные данные в XML-RPC. S>Несомненно, именно это было ключевым фактором при принятии решения о способе маршаллинга картинок в неуправляемый фильтр. Извини, не могу больше писать — встаю для аплодисментов.
Здравствуйте, hattab, Вы писали:
H> в Delphi без блокировок 24
У нас с тобой процы разные, так что наши попугаи сравнивать без знания скока попугаев у тебя в C# проге сложновато.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали: H>>Ты же вроде отметился в ветке, где приводили пример работы MSSQL с базой на диске и в памяти... Основные задержки, это, как раз таки, выборка данных с диска. G>Но оптимизировать эти издержки не сильно получится, только компромисс время-память.
То-то и оно.
Компромисса CPU/диск там и в помине нету — можно потратить пару миллиардов тактов только на то, чтобы понять, что некую страничку не нужно поднимать с диска.
А вот с памятью всё достаточно безрадостно — почитай того же Гарсиа-Молина на предмет того, как зависят асимптотики реляционных алгоритмов от того, какую часть промежуточных результатов можно себе позволить держать в RAMe. Поэтому удвоение memory footprint при прочих равных — это вовсе не $40 за еще одну планку памяти, а тупо просад на порядок времени выполнения некоторого запроса.
Дисклаймер: это вовсе не означает, что управляемых РСУБД не может быть. Есть масса способов свести расходы от недетерминистической финализации к минимуму; а кроме всего прочего, управляемые среды предлагают возможность не просто "компилировать планы запросов", а "по-настоящему компилировать планы запросов в натив". Что в некоторых случаях может дать чудовищный performance boost.
Ну и, естественно, проникновение на рынок аццких отжигов типа IODrive способно сильно изменить расклад сил в RDBMS-алгоритмах, благодаря сокращению разрывов между производительностью памяти и диска.
В прошлый раз этот прорыв предсказывали поклонники 64хбит архитектуры; но парни никак не могли понять, что возможность отмапить терабайтную базу в виртуальную —
это совсем-совсем не то же самое, что и поднять терабайтную базу в память физическую.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, CreatorCray, Вы писали:
H>> в Delphi без блокировок 24 CC>У нас с тобой процы разные, так что наши попугаи сравнивать без знания скока попугаев у тебя в C# проге сложновато.
Здравствуйте, gandjustas, Вы писали: Х>>ого! тебе осталось сделать совсем небольшой шаг до С++, решайся! G>Зачем? Для запредельного перфоманса есть С, для надежного и красивого кода есть C#, F#. G>А С++ в этом уравнении места нет.
ну как же, C++ == запредельный перфоманс + надёжный и красивый код
Х>>P.S. ну и что ты со своими байтами будешь делать? а как насчёт того чтобы классы на стеке инстанцировать? G>Если уж очень надо стеке, то воспользуюсь структурами.
надеюсь ты понимаешь разницу между структурой и классом в дотнете, повторяюсь — инстанцировать классы
и на посошок, или я проглядел, или ты не ответил на вопрос — сколько у тебя установлено приложений уровня "десктоп", писаных на дотнете?
Вообще все эти сравнения и пиписькомеренья весьма забавно выглядят. В управляемом коде в целях безопасности, афаик, при выделении памяти производится так же ее очистка (обнуление), а это по два такта процессора на каждый байт.
Критично ли это для конечного пользователя — только в очень редких случаях (мне с такими не доводилось сталкиваться).
Обоснован ли такой оверхед — в большинстве случаев определенно да.
В целом управление памятью в дотнет реализовано очень-очень эффективно — так, что в исключительном большинстве случаев память не является "бутылышным горлышком".
Здравствуйте, Sinclair, Вы писали:
H>>Сказать-то чего хотел? S>Что люди, которые для решения задачи "Получить от сервера картинку" выбирают формат BMP-over-XML/RPC, мягко говоря, не имеют права критиковать дотнет за производительность.
Давай посмотрим на это дело детальнее. Отфонарный скриншот моего десктопа ужатый до 320x200x24, в формате BMP занимает 192,054 байт. Респонзовый пакет XML-RPC с этой картинкой занимает 256,207 байт. Картинка после gzip'а весит 54,710 байт. Пакет XML-RPC после gzip'а весит 56,093. Время обработки gzip'ом раличается в пределах погрешности замеров. Теперь прикинем, из-за разницы аж в килобайт(!) я должен заставлять разработчика клиентского приложения опускаться с уровня прикладного API (в виде XML-RPC, работая с которым, он о транспорте вообще не думает) на уровень HTTP транспорта (с погружением в RFC, заголовки и пр.), дабы дать ему альтернативный способ доступа к ресурсу
S>
Есть .Net софтинка: одна форма с кнопкой и картинкой (PictureBox). При нажатии на кнопку происходит вызов XML-RPC сервера и получение от него картинки 320x200x24 в формате BMP. После запуска клиент занимает 11.1Mb памяти. С каждым нажатием на кнопку потребление памяти растет. Постепенно вырастает до 21.2Mb, и на этой цифре останавливается (ну с мелкими мотыляниями туда-сюда). В аналогичном нативном клиенте потребление не превышает 5Mb. В цем тут вина .Net разработчика (там кода -- одна строка)?
S>Вина, естественно, в том, что для адекватных задач нужно применять адекватные средства.
Давай ты не будешь вытаскивать фразы из контекста и манипулировать ими по своему усмотрению
S>Ну, а в целом по больнице, нужно не смотреть всякую фигню в таскменеджере, а ставить перед собой задачи и смотреть, как они решаются. В частности, к примеру, профилировать, сколько времени занимает "забрать картинку с сервера" в нативном и управляемом клиенте и укладывается ли это в заданные параметры. S>В частности, брать тестовую среду, близкую к реальной, и смотреть, по прежнему ли всё укладывается. S>Не имеет смысла сравнивать распределенную память у двух программ, когда еще полтора гига свободно. Нужно запускать, к примеру, обе программы на 512 метрах памяти, с открытым в параллель офисом или чем еще там требуется по задаче, и мерить, мерить, мерить, мерить.
Синклер, я уже писал, что у меня не стояло задачи сравнить XML-RPC.NET со своей нативной реализацией.
S>Без этого прогибания пальцев типа "да у меня нативный клиент отъедает всего пять метров" примерно то же самое, что и "а вот у меня прога вообще регистр EBX не использует". В том смысле, что никому не интересно, что там твоя прога "использует" внутри. Если она работает так, как нужно заказчику, то всё в порядке. Никаких других критериев в природе нет.
Неверные выводы на основе неверно исталкованых слов...
Здравствуйте, criosray, Вы писали:
H>> New(Arr); H>> Dispose(Arr);
H>>Pentium M 1.7GHz. Память PC2700. Время: 67ms.
C>Если компилятор не дурак, то он вообще не станет выделять память по пусту, раз Вы ее не используете и пустой цикл тоже не станет крутить по чем зря.
C>Впрочем, это ж Делфи.
Вай-вай, говнодельфи укопал мегашарпа... Смотри не лопни, от злости
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, criosray, Вы писали:
C>Вообще все эти сравнения и пиписькомеренья весьма забавно выглядят. В управляемом коде в целях безопасности, афаик, при выделении памяти производится так же ее очистка (обнуление), а это по два такта процессора на каждый байт.
Кроме того я в тесте кроме выделения памяти померил еще и время двух миллионов проверок на попадание в границы массива и присваивания.
примерно 5% времени занимает.
Здравствуйте, gandjustas, Вы писали:
G>Кроме того я в тесте кроме выделения памяти померил еще и время двух миллионов проверок на попадание в границы массива и присваивания.
А оно для константных индексов разве будет проверять если размер массива тоже константа, известная еще на этапе компиляции? А как же умный JIT?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
H>>Base64 -- единственный способ передать бинарные данные в XML-RPC.
C>Так Вы сами себе злобные буратины, раз выбрали такой стандарт. Что мешает бинарные передавать обычным http stream`ом?
Почитай, что я Синклеру написал по этому поводу.
C>>>Java-like нотация записи методов (getScreenshot64) — моветон.
H>>Это негласный стандарт в XML-RPC.
C>Ой да ну? А можно ссылку на этот "негласный стандарт". Очень хочу посмотреть.
Иди на http://www.xmlrpc.com/ и смотри примеры.
C>>>В С# нет оператора :=
H>>Писал по памяти. Pascal мой основной язык.
C>Ну мы уже поняли, что с дотнет Вы знакомы весьма поверхностно. Лишь хаете его так, будто бы программируете на нем с релиза.
Я лишь факты констатирую. Просто у пропогандистов реальность из страны ОЗ
C>>>Неиспользование using для MemoryStream — утечка ресурсов.
H>>Чего-то я не понял, а каким ресурсом, кроме собственно памяти, владеет MemoryStream? C>1) для любого класса, реализующего IDisposable следует вызывать Close/Dispose C>2) любой Stream по окончании работы с ним следует закрывать (помечая его тем самым closed)
Так камим все таки ресурсом, а? using он для освобождения т.н. неуправляемых ресурсов предназначен же.
C>>>Читабельность Picture.Bitmap.LoadFromStream(TXmlRpcBase64(XmlRpcServerProxy('http://127.0.0.1/').keyhole.getScreenshot64(320, 200)).AsStream); -- отвратительная.
H>>Еще раз: это тестовый пример. C>Что-то мне подсказывает, что Ваш код выглядит не лучше этих "тестовых примеров".
Попытка перейти на личности приравнивается к сливу. Желаю удачи.
Здравствуйте, gandjustas, Вы писали:
C>>Вообще все эти сравнения и пиписькомеренья весьма забавно выглядят. В управляемом коде в целях безопасности, афаик, при выделении памяти производится так же ее очистка (обнуление), а это по два такта процессора на каждый байт. G>Кроме того я в тесте кроме выделения памяти померил еще и время двух миллионов проверок на попадание в границы массива и присваивания. G>примерно 5% времени занимает.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Кроме того я в тесте кроме выделения памяти померил еще и время двух миллионов проверок на попадание в границы массива и присваивания. CC>А оно для константных индексов разве будет проверять если размер массива тоже константа, известная еще на этапе компиляции? А как же умный JIT?
Может он так и делает. Тогда просто время миллиона присваиваний.
Здравствуйте, gandjustas, Вы писали:
G>Кстати, как на делфи с задачкой про все строки файла...
Если вдруг ты сможешь понятно описать чего тебе надобно, старче, то она очевидно решается на ЛЮБОМ АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ, даже на FORTRAN И basic!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Зачем? Для запредельного перфоманса есть С, для надежного и красивого кода есть C#, F#. G>А С++ в этом уравнении места нет.
Нет, ну если ты настаиваешь, что быстрый код ОБЯЗАН БЫТЬ ненадёжным и некрасивым, то да, нет...
А если вдруг тебе охота чтобы и быстрый код был и надёжным и красивым и поддерживаемым, то места мало остаётся как раз для С -- только платформы, где есть дот нет, но нет хороших С++ компиляторов...
Кстати, что это за платформы?
Кстати, если так взглянуть на это дело, то окажется, что и для С# место сожмётся, так как если в твоей проге самая нагруженная часть на С++, то не ясно, зачем оболочку-то на ХиндиС делать? У ХиндиС есть неомненный плюс -- дешёвая и быстрая разработка бригадой гастарбайтеров, в смысле индусов. Если в твоём проекте есть такие компоненты, то супер, С# твой выбор...
Да, то, что между черт -- это стёб... Но в каждой шутке есть таки доля шутки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Кстати, как на делфи с задачкой про все строки файла... E>Если вдруг ты сможешь понятно описать чего тебе надобно, старче, то она очевидно решается на ЛЮБОМ АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ, даже на FORTRAN И basic!
Никто не говорил что она не решается.
Выразительность языка заключается не в возможности решить задачу, в читаемости, поддерживаемости и расширяемости этого решения. (это упрощенно)
Здравствуйте, criosray, Вы писали:
C>Неиспользование using для MemoryStream — утечка ресурсов.
А как же GC?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали: G>Ну если вы так думаете тогда объясните принципиальную разницу между классом на стеке и структурой на стеке.
объясняю, struct в сишарпе ето семантически то что называется POD в С++, т.е. плоская структура данных, ни конструкторов, ни методов, ничего. Так вот, в С++ в стек можно положить как объект-инстанс класса, так и объект-инстанс POD-структуры, в сишарпе же только второе.
G>Кстати, сколько сайтов, по которым ты ходишь написаны на asp.net?
честно говоря не знаю, может пять, может десять, на вскидку только три вспомнил, включая рсдн. По ощущениям зарубежные сайты где-то 50/50 asp.net/jsp, наши ~80 — php
Кстати вот ниша веба имхо вполне подходит для .NET (и название платформы удачно подходит ), но мне кажется с развитием песочниц VPS/VDS в веб в лоу-енд сектор может пролезть и C++ (ага, да, именно ето я и сказал, C++ в вебе, какой-нибудь CMS++ ), т.к. VPS/VDS площадки дают довольно ограниченные ресурсы, и хороший производительный веб-фреймворк на С++ очень имел бы право жить.
Здравствуйте, Sinclair, Вы писали:
S>Совершенно верно. И это — единственный способ писать хорошие программы.
Это тебе Бог сообщил, или сам БГ?
S>Известно. Он бы бездарно потратил больше времени на разработку программы.
Чего? Ты думаешь допереть, что для словаря надо использовать структуру, которая ищет эффективно ему понадобилось бы очень много времени?
Не, я конечно понимаю, что это ХиндиС, но не Папус-Новая-Нвинея-С, всё-таки
E>>Мне так кажется, что 2 секунды для этой программки -- ЭТО ОЧЕНЬ ОЧЕНЬ ОЧЕНЬ ДОЛГО. S>Напомню, что цели должны быть ориентированы на потребителя, а не высосаны из пальца. Сколько, по-твоему, должна работать эта программа? Почему?
Если бы оно ориентировалось на меня как на потребителя, то 0,01 — 0,03 секунды.
Я хотел бы менять ситуацию и сразу видеть варианты в GUI интерфейсе, например...
E>>А вот, если в дело вмешиваются клиенты и конкуренты, ситуация несколько меняется... S>Читать последнюю строчку в его статье.
Это которая "But I'm not"? Ну да, он действительно не может, потому что действует в рамках индусской парадигмы...
А теперь иди читать моё замечание про то, что если сам себе орбитр, то выиггрывать легко.
И, кстати, тема связи этой "оптимизации" со случаем, когда мы упираемся в "особенности GC" как-то всё-равно не раскрыта... Это если конечно "But I'm not", не учитывать
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Sinclair, Вы писали:
S>А он неявно сортирует??? Офигеть. Я как отвык от того, что для множества нужно задавать отношение частичного порядка. S>Я надеюсь, уточнение сортировки в Case-insensitive/accent-sensitive для турецкой локали не усложнит эту безусловно прекрасную программу?
Может уважаемый MVP снизойдёт к нам, сирым и убогим и вспомнит таки азы, а уже потом будет позориться?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Хвост, Вы писали:
G>>Ну если вы так думаете тогда объясните принципиальную разницу между классом на стеке и структурой на стеке. Х>объясняю, struct в сишарпе ето семантически то что называется POD в С++, т.е. плоская структура данных, ни конструкторов, ни методов, ничего. Так вот, в С++ в стек можно положить как объект-инстанс класса, так и объект-инстанс POD-структуры, в сишарпе же только второе.
Pavel Dvorkin, а вот Вам подтверждение моих слов: человек явно не знает, но хаит.
"A struct is a simple user-defined type, a lightweight alternative to a class. They support access modifiers, constructors, indexers, methods, fields, nested types, operators, and properties."
Здравствуйте, gandjustas, Вы писали:
G>В структуре нет методов? Это точно на C#?
ммм...статические есть, но ето немного не то, правда?
G>Вопрос возник видимо из-за непонимания этого факта.
у меня отличное понимание факта.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, criosray, Вы писали:
C>>Обычно и того меньше — до 2GB, что можно переконфигурировать в boot.ini и получить до 3х. CC>Уточню, процесс видит адресного пространства 4Gb/Segment, но использовать под свои нужды может тока младшие 2(3)Gb. Остальным распоряжается система.
может кто подскажет какой туда ключик надо написать для windows xp sp3? Заранее спс.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, minorlogic, Вы писали:
M>>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>потому, что malloc/free на каждый глобальный объект может быть медленней, чем последовательное выделение памяти и затем gc, который за один раз собирает весь мусор
M>>Даю подсказку M>>int a = 0; M>>int b = 3 + a;
M>>Очень память дефрагментирует ? затратит линейное время на на выделение памяти и т.п. ?
G>напишите этот же код на Java, .NET, причем буква в букву. работать везде одинаково будет.
G>У вас как в древней присказке "слышу звон, да не знаю где он".
Да это как раз у Вас полнейший неадекват какой-то, постоянное съезжание с темы, ответы на посты в отрыве от обсуждаемого контекста.
Там же написано, что подсказка. Додуматься, что очевидно имелось в виду то, что можно заменить int на произвольный класс, и никакого malloca/free не понадобится, не судьба?
P. S. Даже попкорн полохо лезет под такой некачественный флейм.
Здравствуйте, Хвост, Вы писали:
G>>В структуре нет методов? Это точно на C#? Х>ммм...статические есть, но ето немного не то, правда?
Странно, что Вы, как утверждаете, писали на дотнет и не знаете, что у структур есть и инстанс методы.
В дотнет structure это value-тип — передается копированием и хранится в стеке.
class — reference-тип — передается по указателю и хранится в куче.
Преобразование value-типа к ref-типу называется боксингом, обратное — unboxing`ом.
int i = 10;
object o = i;
int k = (int) o;
G>>Вопрос возник видимо из-за непонимания этого факта. Х>у меня отличное понимание факта.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, Хвост, Вы писали: C>Да нет, стоило. Иначе Вы бы продолжали в пустую гонять воздух, не зная почти ничего о теме разговора.
покажи массив на стеке в дотнете, или действительно не стоит гонять воздух впустую
Здравствуйте, Хвост, Вы писали:
C>>Да нет, стоило. Иначе Вы бы продолжали в пустую гонять воздух, не зная почти ничего о теме разговора. Х>покажи массив на стеке в дотнете, или действительно не стоит гонять воздух впустую
Здравствуйте, criosray, Вы писали:
C>Прочитайте еще раз то, что я Вам писал.
хм, написано что такое боксинг и анбоксинг, про value и ref типы, про массив структур на стеке не увидел
Здравствуйте, Хвост, Вы писали:
Х>изначально разговор был о массиве структур на стеке, ликбез про боксинг/анбоксинг читать не стоило, читал давно, в зелёной книжке.
Непонятно к чему тогда было следующее:
1.
объясняю, struct в сишарпе ето семантически то что называется POD в С++, т.е. плоская структура данных, ни конструкторов, ни методов, ничего
2.
G>В структуре нет методов? Это точно на C#?
ммм...статические есть, но ето немного не то, правда?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>Здравствуйте, gandjustas, Вы писали:
G>>>>В структуре нет методов? Это точно на C#? Х>>>ммм...статические есть, но ето немного не то, правда? G>>http://msdn.microsoft.com/en-us/library/ah19swz4.aspx Х>угу, размести на стеке
var s = new SomeStructType(ctor_args);
Будет на стеке, можете дизассемблером посмотреть.
Вообще старнно как-то. У меня на собеседованиях по .NET одним из первых спрашивали про ралличия классов и структур (value и reference типов). Я сам этот вопрос первым задавал когда собеседования проводил.
Знание и понимание системы типов это то что необходимо для написаня хоть сколько-нибудь сложных программ на любом языке.
А в КСВ каждый день вижу как люди утверждают что они писали на C# но при этом не знают каких-то элементарных вещей.
G>>ЗЫ. Вообзе говоря не верится что вы писали enterprise систему на C# и ни разу не пользовались структурой DateTime. Х>мне вообще иногда хочется забыть что я писал на C#, кажется карма испорчена навсегда (хотя есть надежда что функциональщина очистит мою душу)
Функциональщина? Так там же GC!
Х>Да, вопрос на засыпку, дотнет коммьюнити не смущает что вещи а-ля Windows Vista Bridge Sample Library выходят с опозданием в 2-3 года после появления новых апи? вы только начали готовить? а мы уже продаём
Их и раньше можно было использовать через pinvoke, кто хотел — тот делал.
Здравствуйте, gandjustas, Вы писали:
G>Думаете нельзя в C# на стеке данные размещать?
Думаю конкретно esil имеет ввиду, что нельзя разместить в стеке произвольные данные.
Массивы, например, туда не засунуть, ибо class
А вот что имел ввиду minorlogic я, чесс говоря, тоже не понял.
Но эт не страшно
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, gandjustas, Вы писали:
Х>>>>Здравствуйте, gandjustas, Вы писали:
G>>>>>В структуре нет методов? Это точно на C#? Х>>>>ммм...статические есть, но ето немного не то, правда? G>>>http://msdn.microsoft.com/en-us/library/ah19swz4.aspx Х>>угу, размести на стеке
G>
G>var s = new SomeStructType(ctor_args);
G>
G>Будет на стеке, можете дизассемблером посмотреть.
массив на стеке
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, criosray, Вы писали:
C>>Здравствуйте, Хвост, Вы писали: C>>Да нет, стоило. Иначе Вы бы продолжали в пустую гонять воздух, не зная почти ничего о теме разговора. Х>покажи массив на стеке в дотнете, или действительно не стоит гонять воздух впустую
var stackArrayOfStruct = stackalloc SomeStruct[10];
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, criosray, Вы писали:
C>>Отличное от реальности? Х>изначально разговор был о массиве структур на стеке
Ложь. Изначально разговор о ращемещении экземпляра класса на стеке.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, gandjustas, Вы писали:
G>>Думаете нельзя в C# на стеке данные размещать? MK>Думаю конкретно esil имеет ввиду, что нельзя разместить в стеке произвольные данные. MK>Массивы, например, туда не засунуть, ибо class
MK>А вот что имел ввиду minorlogic я, чесс говоря, тоже не понял. MK>Но эт не страшно
Ну он как раз и имеет в виду, что мы можем произвольные типы размещать на стэке, что очень полезно, т. к. позволяет оставаться в рамках ООП-подхода и избегать множества выделений памяти в куче.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, esil, Вы писали:
E>>Здравствуйте, gandjustas, Вы писали:
E>>>>Да это как раз у Вас полнейший неадекват какой-то, постоянное съезжание с темы, ответы на посты в отрыве от обсуждаемого контекста.
E>>>>Там же написано, что подсказка. Додуматься, что очевидно имелось в виду то, что можно заменить int на произвольный класс, и никакого malloca/free не понадобится, не судьба?
E>>>>P. S. Даже попкорн полохо лезет под такой некачественный флейм.
G>>>Думаете нельзя в C# на стеке данные размещать? G>>>Вот в Java нельзя, только элементарные типы, в C# есть стурктуры.
G>>>Не надо показывать свое незнание.
E>>А вот обязательно было в моём утверждении подменять "произвольный класс" на "данные"? Именно это я и имел в виду, говоря про неадекват. G>А вы можете объяснить разницу?
Ну вот такой довольно типичный для С++ пример разве разницу не объясняет:
Здравствуйте, Хвост, Вы писали:
Х>потому что я был уверен что struct в C# ето только данные и все операции с ним аля положить в массив и вызвать метод происходят только в его боксовом представлении
Угу. Еще ты был уверен про уровень
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, NikeByNike, Вы писали:
NBN>>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>читай внимательно. в языках с gc гарантия — на 3x, можно и меньше. в C++ — гарантий никаких, расход может быть каким угодно прсто потому что память усеяна мелкими дырками
NBN>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался. G>Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его. G>На C++ такое получится?
И что же из себя представляет описание? И что из этого описания генерируется? И зачем это нужно в рантайм, почему нельзя в compile-time?
Здравствуйте, esil, Вы писали:
NBN>>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался. G>>Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его. G>>На C++ такое получится?
E>И что же из себя представляет описание? И что из этого описания генерируется? И зачем это нужно в рантайм, почему нельзя в compile-time?
В compile-time Вы ограничены статичным автоматом, либо вынуждены использовать интерпретируемый автомат (например, с описанием на DSL-языке).
Здравствуйте, Хвост, Вы писали:
C>>У нас пользователи в госструктурах на компах, которым уже по 2-4 года работают с нашим клиентом на .NET уже больше года в production режиме. Клиент довольно тяжелый: диалоги, графики, отчеты, таблицы, формы — полный комплект. Нареканий на производительность до сих пор не было. "ЧЯДНТ?"
Х>да всё ты делаешь так, я же говорю, VB 21-го века, как бы понимаешь, на примере моего проекта, относительно небольшое приложение, формы, диалоги, отчёты, никто не жалуется,
Ну если приложение на 3 млн. строк кода "небольшое"...
Х>только я вот смотрю на как формочка появляется и меня грусть берёт, вот реально по ощущениям пластилин какой-то,
Может дело вовсе не в .NET?
Х>оно то пользователю кажется и ничего, ну полсекунды на форму, или две — а мне то понятно что та же самая форма с теми же самыми контролами будь она писана на MFC например — появилась бы мнгновенно,
2 секунды на форму? Дело точно не в .NET.
Х>потому что нет хмля, нет джита, нет гц будь он неладен. Но пипл хавает , ему лишь бы работало, а будет отчёт генерится 5 минут или 5 секунд — неважно, лишь бы не пять часов.
Генерация отчета точно не ограничена дотнетом. Там 95% скорости генерации зависит от доступа к базе.
Х>Потому что ентерпрайз, другой такой программки у них нет и не будет, сравнивать не с чем. На десктопах ситуация кардинально другая — тут каждый сам за себя, пользователь выбирает, а не как в ентерпрайзах — "мы сейчас к вам прийдём и всё автоматизируем процесс", у пользователя процесс простой — почту почитать, фильму посмотреть, порисовать, поболтать, документ набрать, и тут ты к каждому в дом не прийдёшь с уговором, не создашь индивидуальный софт для каждого десктопа, тебе нужно сделать нацеленый на широкую аудиторию качественный софт, только вот незадача, а качественный нейтив то в этой области уже есть, а лучше качественного нейтива может быть только другой качественный нейтив с большим функционалом,
Вы глубоко заблуждаетесь. Лучший тому пример — Microsoft Blend, и AutoCAD, последних версий.
Х>а функционал реально ограничен только одним ресурсом — ресурсом компьютера. Если бы дотнет хотя бы в полтора раза ускорял разработку качественного десктопного софта,
Ускоряет не в полтора раза, а как-минимум в три раза (в некоторых случаях может спокойно достичь десятикратного ускорения).
Сужу на собственном опыте — я много лет тому назад перешел с С/С++ на .NET и уже тогда он был более оправдан для большого класса приложений, а на сегодня так и подавно.
Благодаря .NET софт получается еще и много более качественный. Мы — адепты TDD. У нас 95% покрытие тестами.
Х>за 8 лет на нём бы уже написали немеряно десктоп приложений (посмотрите на C++, когда появился первый промышленный компилятор, и сколько софта писалось на C++ через 8 лет). Однако есть момент. Качественного десктопного софта на C# нет.
Продолжайте верить в это.
Здравствуйте, gandjustas, Вы писали:
G>Выразительность языка заключается не в возможности решить задачу, в читаемости, поддерживаемости и расширяемости этого решения. (это упрощенно)
Если я верно понял, тебе хочется уметь проверять есть ли в строке не менее трёх слов подряд, упорядоченных по алфавиту?
Так? IMHO, это просто, понятно и поддерживаемо записывается на ЛЮБОМ АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ...
Ну, во всяком случае теми, кто умеет программировать...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Дейсвительно, не 6, а 7 десктопных программ которыми я пользуюсь: браузер, почтовик, paint.net, live writer, qip, skype, vs2008. G>Media Player был в комплекте, офис тоже. G>Остальное запускаю редко.
А "офис" -- это надо читать, как "ворд", или, как "ещё пять-семь программ"?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, criosray, Вы писали:
C>У нас пользователи в госструктурах на компах, которым уже по 2-4 года работают с нашим клиентом на .NET уже больше года в production режиме. Клиент довольно тяжелый: диалоги, графики, отчеты, таблицы, формы — полный комплект. Нареканий на производительность до сих пор не было. "ЧЯДНТ?"
Считаешь, что выделенное -- это "тяжёлый клиент".
Кстати, а данные вы из DB берёте, я надеюсь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
G>>И только там где не хватает производительности может быть использован C. E>Ну вот есть такая т. з., что в случае массового потребителя, производительности не хватает практически ВЕЗДЕ. Ну ценят люди скорость...
Можно поинтересоваться на основании чего был сделан этот вывод?
Здравствуйте, Erop, Вы писали:
E>>>Нет, ну если ты настаиваешь, что быстрый код ОБЯЗАН БЫТЬ ненадёжным и некрасивым, то да, нет... G>>Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне. E>Это всего лишь твоё неумение писать быстрый и качественный код... E>Мне известны МНОГОЧИСЛЕННЫЕ контрпримеры, так что позволь не поверить твоему голословному утверждению...
Да, кстати, поделитесь. Будет интересно послушать.
h> M>С одной стороны виноват тот же С++. Потому что legacy и тот же ворд нет смысла переписывать с нуля h> M>С другой стороны — а что такое десктопный софт?
h> Гуглохром например, и легаси нету и работает на десктопе
О, кстати. [holywar offtop on] как это так — написан на кроссплатформенном С++, а кроссплатфоренной версии нет, и в ближайшем будущем не предвидится? 0_o [holywar offtop off]
Гуглохром хороший пример нового приложения. Толкьо вот там С++ изначально — куча. Это и вебкит, и V8.
VD> Купи себе учебники по C++ и C#. Прочти их. Изучи языки. Потом еще какие-нибудь другие языки изучи (что-нибудь из ФП, например). Когда ты все это сделаешь, то поймешь какую чушь ты тут нес. А на вопрос каким языком пользоваться ты и само тогда ответить можешь.
Просто так, по учебникам, изучить не получится. Надо на каждом из них селать пусть п менькому, пусть для себя, но проекту
*мечтательно* я, когда C# взял в руки, ршил каталог сидюков сделать. На основе XML С гуем. Даже что-то сделал. Потом все забросил, потому что лень в библиотеках было разбираться
Здравствуйте, criosray, Вы писали:
C>Да, кстати, поделитесь. Будет интересно послушать.
Чем? Тебе интересны примеры быстрого кода на С++?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, VladD2, Вы писали:
VD>И вообще, что это за позиция — устроиться куда-то "на начальную позицию"? VD>Это значит ты будешь изучать что-то, а тебе за это еще и платить кто-то должен?
Да, так бывает. И не только в ПО. И не только сейчас, но и раньше было.
То, что ты не умеешь искать такие позиции, всего лишь говорит что-то о тебе, а не об окружающем мире...
Можешь подумать над значением слова "подмастерье"...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Х>хы, ансейф, вперёд к С++?
Х>просто вот когда дело доходит до новых апи — здравствуй интероп с нейтивом
О да, это просто нереальная сложность, написать DllImport наверное непостижимая задача.
Х>хочешь массив на стеке — здравствуй ансейф,
Думаешь он часто нужен?
Х>тот же пэйнт.нет афаир просто насквозь пропитан ансейфом
От силы 5% ансейфа.
Х>зачем тогда сишарп?
Все что ты назвал никак не мешает использовать всю мощь сишарпа.
Х>хорошие вещи делаются только в нейтиве, вот тот же пример с выводом строк, для такой забавы как флейм на рсдн и стримы с регекспами не грех использовать, а вот если бы ето была программа промышленных маштабов — скажим анализатор логов, то здравствуй мем-маппед файлы да стейт-машины с отсутствием аллокаций, и писать етона си++ без ifstream и multiset, а не на сишарпе с gc и аллокацией на каждый чих.
А доказательсва будут? Ты еще не заметил что GC работает быстре стандартного аллокатора?
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, NikeByNike, Вы писали:
NBN>>>Здравствуйте, BulatZiganshin, Вы писали:
BZ>>>>читай внимательно. в языках с gc гарантия — на 3x, можно и меньше. в C++ — гарантий никаких, расход может быть каким угодно прсто потому что память усеяна мелкими дырками
NBN>>>C++ очень универсальный язык Он позволяет писать так как тебе нужно. В частности обеспечить все гарантии по чему хочешь, чем я, кстати, на днях воспользовался. G>>Я вот тут на днях написал на C# библиотеку для работы с конечными автоматами. Она генерирует в рантайме код автомата по описанию, а потом использует его. G>>На C++ такое получится?
E>И что же из себя представляет описание?
XML или код.
E>И что из этого описания генерируется?
Вложенные ифы.
E>И зачем это нужно в рантайм, почему нельзя в compile-time?
Пчто в рантайме задавать без перезапуска.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Выразительность языка заключается не в возможности решить задачу, в читаемости, поддерживаемости и расширяемости этого решения. (это упрощенно)
E>Если я верно понял, тебе хочется уметь проверять есть ли в строке не менее трёх слов подряд, упорядоченных по алфавиту? E>Так? IMHO, это просто, понятно и поддерживаемо записывается на ЛЮБОМ АЛГОРИТМИЧЕСКОМ ЯЗЫКЕ...
Ну тогда решение на BF и Delphi в студию.
E>Ну, во всяком случае теми, кто умеет программировать...
Разница познается в сравнении.
Здравствуйте, Хвост, Вы писали:
C>>2 секунды на форму? Дело точно не в .NET. Х>а может и в .NET, я не профайлил, знаете почему? потому что nobody care
Вот она — истина.
Во всем софте так — или есть проблемы и они исправляются (иначе конкуретны выдавят),
или эти проблемы никого не волнуют, значит это и не проблемы даже.
Быстродействие софта мало кого волнует, лишь бы visual feedback был адекватный.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Нет, ну если ты настаиваешь, что быстрый код ОБЯЗАН БЫТЬ ненадёжным и некрасивым, то да, нет... G>>Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне. E>Это всего лишь твоё неумение писать быстрый и качественный код...
С чего ты взял?
E>Мне известны МНОГОЧИСЛЕННЫЕ контрпримеры, так что позволь не поверить твоему голословному утверждению...
Уууу, а сколько мне известно примеров когда наступала попа из-за преждевременной оптимизации и раннего проектирования структур данных...
И когда последний раз меня пытались поставить на путь проектирования структур я долго капал на мозг начальству что это неправильно.
В итоге все работало быстрее, чем предполагалось.
G>>Я не предлагал C использовать для красивого кода. E>Я понимаю. То есть ты предлагал делать быстрый код некрасивой и ненадёжной помойкой?
Быстры и красивый быввает очень редко. Это он может казаться красивым пока не надро какую-то мелочь поменять.
E>А зачем? Потому, что С++ освоить не можешь (эта фраза обозначает тоже самое, что и фраза: "С++ слишком сложный") , или какие-то другие причины?
С чего ты взял что я не знаю С++?
G>>Ты как-то очеь интересно говоришь о том что C# позоляет писать хороший код с малыми затратами. E>Не хороший, а приемлемый для индусов... Тормозной и прожорливый по памяти А для "нагруженных частей" С -- так у тебя ведь выходит?
Приемлимый для индуксов и хорошый для нормальных программистов.
Ну ты достал, вот покажи где .NET тормозной?
Я модуль на C использовал там где нужна была математика, решил не писат на C# и взять готовый код и слкга допилить под свои нужды.
А "нагруженные части" — те которые обрабатывают большой объем информации в единицу времени — для них C# подходит гораздо лучше.
G>>Когда вместо индусов пишут нормальные программисты код у них получается гораздо лучше и быстрее, чем на С++. E>Про "лучше" -- не ясны критерии, про быстрее — не верю.
Меньше ошибок, меньше кода, проще модифицировать.
Насчет быстрее можешь не верить, но современные языки спокойно сокращают в несколько раз время разработи по сравнению с C++.
G>>И только там где не хватает производительности может быть использован C. E>Ну вот есть такая т. з., что в случае массового потребителя, производительности не хватает практически ВЕЗДЕ. Ну ценят люди скорость...
Да ну, а ты не слышал что процессор настолького компа в среднем загружен на 5%, а сервера — на 20%
На C имеет смысл писать только математику, обработка больших объемов данных гораздо лучше пишется на .NET.
Здравствуйте, gandjustas, Вы писали:
G>Ну тогда решение на BF и Delphi в студию.
1) Я не считаю BF, asm, а так же и язык машины Тбюринга алгоритмическими...
2) Delphi я не помню совсем, но немного помню ещё PASCAL, наверное. Во всяком случае недавно что-то на нём правил. Но я пока не понял задачу. Уточни таки, а?
Хотя мне проще было бы на C/С++, конечно написать...
E>>Ну, во всяком случае теми, кто умеет программировать... G>Разница познается в сравнении.
IMHO, разницы принципиальной нет. Хотя, возможно, я не понял задачу.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, alsemm, Вы писали:
A>Справедливости ради надо сказать, что пост там про AutoCAD2008. Но вряд-ли AutoCAD2009 что-то изменилось кардинально. A>Так что AutoCAD из списка С# приложений вычеркивайте
Офигеть
Здравствуйте, gandjustas, Вы писали:
G>Действительно, ООП там толком нет, только пародия на него.
По существу замечание, однако...
Вообще-то на ООП свет клином не сошёлся. И "настоящее ООП" где-то или "пародия на него" обычно не важно...
E>>Но вообще-то возможно и изображу, правда тут надо бы уточнить, что ты понимаешь под "фабричный метод", так как может и изображу, а может и нет... G>http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования)
Спасибо, я раньше не знал какого рода документацией пользуются в своей работе ХиндиСишники...
Смотри, такой вот код:
struct IOder {
virtual bool IsInGoodOrder( T left, T right ) const = 0;
virtual bool IsEqu( T left, T right ) const = 0;
};
class SortBySimilarity : public IOder {
public:
bool IsInGoodOrder( T left, T right ) const { /*тут реализация*/ }
bool IsEqu( T left, T right ) const { /*тут реализация*/ }
// фабричные методыstatic SortBySimilarity CreateBySimilarityCasesensitive( const T& pattern ) { /*тут реализация*/ }
static SortBySimilarity CreateBySimilarityCaseinsensitive( const T& pattern ) { /*тут реализация*/ }
}
// использованиеvoid foo( T pattern )
{
const IOder& order = SortBySimilarity::CreateBySimilarityCasesensitive( pattern );
data.SortBy( &order );
}
это "фабричный метод" или нет?
G>И в C++ есть способ безопасной передачи указателя на стек — ссылки называется. Только на ссылках вообще ООП не сделаешь.
Выше глянь, повнимательнее..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
h> А если серьезно, то МакОС и Линукс версии сейчас готовятся.
Ну, про это я знаю
h> M>Гуглохром хороший пример нового приложения. Толкьо вот там С++ изначально — куча. Это и вебкит, и V8. h> Ну и что? Никого же не смущает использование в .Net софте нативно Трайдента
Здравствуйте, gandjustas, Вы писали:
M>>>С одной стороны виноват тот же С++. Потому что legacy и тот же ворд нет смысла переписывать с нуля M>>>С другой стороны — а что такое десктопный софт?
H>>Гуглохром например, и легаси нету и работает на десктопе
G>У гугла столько ресурсов, что они могуть ОС в машинных кодах написать. G>И если им будет надо — напишут.
У МС ресурсов не меньше, чего же легаси свое не перепишут на шарпе? Глядишь и сэкономят еще
Здравствуйте, gandjustas, Вы писали:
G>А что такое core ?
Это реализация функционала проги, отличного от GUI или какого-то ещё UI.
Скажем в твоих задачах core обычно на СУБД какой-то реализовано, а в одной из часть core была на C...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, alsemm, Вы писали:
A>>GUI — С#, core — С++ G>надо разработчикам blend это рассказать, а то они не знают.
G>А что такое core ?
В CAD системах — это modeling kernel.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Действительно, ООП там толком нет, только пародия на него. E>По существу замечание, однако... E>Вообще-то на ООП свет клином не сошёлся. И "настоящее ООП" где-то или "пародия на него" обычно не важно...
Так это не я начал про супер-мега ооп с объектами на стеке.
E>>>Но вообще-то возможно и изображу, правда тут надо бы уточнить, что ты понимаешь под "фабричный метод", так как может и изображу, а может и нет... G>>http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования) E>Спасибо, я раньше не знал какого рода документацией пользуются в своей работе ХиндиСишники...
А вы какой пользуетесь?
Это первая ссылка в гугле по словосочетанию "фабричный метод".
E>Смотри, такой вот код:
E>struct IOder {
E> virtual bool IsInGoodOrder( T left, T right ) const = 0;
E> virtual bool IsEqu( T left, T right ) const = 0;
E>};
E>class SortBySimilarity : public IOder {
E>public:
E> bool IsInGoodOrder( T left, T right ) const { /*тут реализация*/ }
E> bool IsEqu( T left, T right ) const { /*тут реализация*/ }
E> // фабричные методы
E> static SortBySimilarity CreateBySimilarityCasesensitive( const T& pattern ) { /*тут реализация*/ }
E> static SortBySimilarity CreateBySimilarityCaseinsensitive( const T& pattern ) { /*тут реализация*/ }
E>}
E>// использование
E>void foo( T pattern )
E>{
E> const IOder& order = SortBySimilarity::CreateBySimilarityCasesensitive( pattern );
E> data.SortBy( &order );
E>}
E>
Здравствуйте, NikeByNike, Вы писали:
VD>>>А если серьезно, то уровень дискуссии действительно просто супер. Плинтус горами покажется. WH>>Угу. Люди не знающие .НЕТ против людей не знающих С++. WH>>Смешно читать и тех и других.
NBN>Не только, люди ещё специализируются на разных направлениях...
... незнающие ни того, ни другого но спорящие об обоих.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Erop, Вы писали:
E>Да, так бывает. И не только в ПО. И не только сейчас, но и раньше было. E>То, что ты не умеешь искать такие позиции, всего лишь говорит что-то о тебе, а не об окружающем мире... E>Можешь подумать над значением слова "подмастерье"...
Ой, я же забыл. Мы же о сапожниках говорим. Вот только ученикам зарплату не платили. Им максимум еду давали.
Почему всем будет смешно, если им расскажут о подмастерьи физика, химика или врача. Так почему же подмастерья программистов обсуждаются серьезно?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Действительно, ООП там толком нет, только пародия на него. E>По существу замечание, однако... E>Вообще-то на ООП свет клином не сошёлся. И "настоящее ООП" где-то или "пародия на него" обычно не важно...
E>>>Но вообще-то возможно и изображу, правда тут надо бы уточнить, что ты понимаешь под "фабричный метод", так как может и изображу, а может и нет... G>>http://ru.wikipedia.org/wiki/Фабричный_метод_(шаблон_проектирования) E>Спасибо, я раньше не знал какого рода документацией пользуются в своей работе ХиндиСишники... E>Смотри, такой вот код:
E>struct IOder {
E> virtual bool IsInGoodOrder( T left, T right ) const = 0;
E> virtual bool IsEqu( T left, T right ) const = 0;
E>};
E>class SortBySimilarity : public IOder {
E>public:
E> bool IsInGoodOrder( T left, T right ) const { /*тут реализация*/ }
E> bool IsEqu( T left, T right ) const { /*тут реализация*/ }
E> // фабричные методы
E> static SortBySimilarity CreateBySimilarityCasesensitive( const T& pattern ) { /*тут реализация*/ }
E> static SortBySimilarity CreateBySimilarityCaseinsensitive( const T& pattern ) { /*тут реализация*/ }
E>}
E>// использование
E>void foo( T pattern )
E>{
E> const IOder& order = SortBySimilarity::CreateBySimilarityCasesensitive( pattern );
E> data.SortBy( &order );
E>}
E>
это "фабричный метод" или нет?
G>>И в C++ есть способ безопасной передачи указателя на стек — ссылки называется. Только на ссылках вообще ООП не сделаешь. E>Выше глянь, повнимательнее..
А тут случаем баг не закрался?
CreateBySimilarityCasesensitive возвращает временный объект, на который потом берётся ссылка.
Здравствуйте, gandjustas, Вы писали:
G>Так это не я начал про супер-мега ооп с объектами на стеке.
Зачем "супер" и "мега"? Может быть, например, фильтр к какому-нибудь запросу к словарю...
Может быть техника, похожая на ET (шаблонные выражения, не знаю, как по-русски)
это "фабричный метод" или нет? G>Не-а.
Ну тогда, наверное, именно "фабричный метод" не изображу...
Но при нужде С++ позволяет использовать довольно мощный статический полиморфизм...
И это обычно можно сделать довольно быстрым кодом...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[73]: Плохому танцору на С++ лучше не прогать...
Здравствуйте, gandjustas, Вы писали:
G>Исторические причины в крупных организациях играют немалую роль.
Странно у тебя выходит. Типа ХиндиС для десктопа подходит, но в каждом конкретном случае что-то ему мешает...
IMHO, есть огромный сегмент ПО -- это ПО, которое пишут по случаю и как можно быстрее.
Раньше это делали на VB, теперь делают на ХиндиС. В целом это огромный шаг вперёд!!!
И у C# есть своя ниша. А у С++ своя. Это разная работа обычно и разного рода цикл разработки даже. Так что я не вижу ничего странного в выборе человека между тем и этим, при построении дальнейшей карьеры.
Но в своей нише выбор уже часто предопределён. Если тебе надо пять COM-верверов заставить хитро взаимодействовать меду собой, то ясно что не на С++ это удобно. А если ты хочешь написать распознавалку голоса, чтобы оно могло писать под твою диктовку, то ясно, что не C#, твой выбор...
Ну и у десктопов своя специфика -- обычно программ много, а памяти и проца -- нет. При этом редко проги выпускаются по запросу и срочно. Так что экономичность программ -- это большой плюс для десктопа, а скорость разработки, на уровне "надо ещё вчера" -- нет...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>>>Если вы изначально занимаетесь быстротой кода, то вряд ли он будет нажедным и красивым. Наоборот — вполне. E>>>Это всего лишь твоё неумение писать быстрый и качественный код... G>>С чего ты взял? E>С того, что знаю примеры быстрого кода, который сразу так и разрабатывался, как быстрый...
И я знаю, но обратных примеров больше.
E>>>Мне известны МНОГОЧИСЛЕННЫЕ контрпримеры, так что позволь не поверить твоему голословному утверждению... G>>Уууу, а сколько мне известно примеров когда наступала попа из-за преждевременной оптимизации и раннего проектирования структур данных... E>Не понимаю. Возможно проектирование выполнялось некачественно?
Ну это смотря что понимать под качеством проектирования.
Гуглите "premature optimization".
G>>Быстры и красивый быввает очень редко. Это он может казаться красивым пока не надо какую-то мелочь поменять. E>Почему это? Почему быстрый код нельзя писать НОРМАЛЬНО? Читабельно, поддерживаемо, без ребусов?..
Это я неверно выразился. Вместо быстрый надо читать "оптимизированный".
G>>С чего ты взял что я не знаю С++? E>Я не думаю, что ты совсем не знаешь. Но ты тут оговорился, что якобы объект на стеке не может иметь виртуальных функций, но может быть ты именно оговорился, или это вообще не ты был?
Я не говорил что не может иметь. Я вообще-то что их использовать там не получится.
Хотя надо было добавить что использовать безопасным образом. Я с тех пор как изучил C++ в полной мере старался не писать кода, который передает указатели на стек куда-то.
E>В любом случае это не важно. Я не утверждал, что ты не знаешь, я спрашивал, что тебя заставляет выбирать С вместо С++, кроме его сложности (IMHO, если ты говоришь, что С++ сложен, то это значит, что ты его знаешь недостаточно, чтобы писать на нём хороший код)
Я говорю что С++ сложен потому что знаю более простые и при этом более эффективные языки.
Например мне удалось жа полчаса объяснить человек программу на F# на два экрана, при том что он F# не знал.
Аналогичная программа на C++ занимала бы больше и была бы гораздо более сложна в понимании.
А вибирать С, когда нужен низкоуровневый код, заставляет его интероперабельность.
DLL экспортируют функции на С, линуксовые динамические модули (so) также работают на С.
Делать процедурную обвязку вокруг ОО-кода не хочется, тем более обычно задача низкоуровневого кода заключается в математике.
G>>А "нагруженные части" — те которые обрабатывают большой объем информации в единицу времени — для них C# подходит гораздо лучше. E>Пока не нужна память и скорость -- да. Например для GUI ХиндиС -- это просто находка!
Ну а доказательства тезиса будут?
Или опять по принципу — чем больше повторить, там больше правда.
E>А там AI, например, нифига не органичен...
Ну и как AI делать?
Мой знакомый AI занимается, вообще на лиспе пишет.
G>>>>И только там где не хватает производительности может быть использован C. E>>>Ну вот есть такая т. з., что в случае массового потребителя, производительности не хватает практически ВЕЗДЕ. Ну ценят люди скорость...
G>>Да ну, а ты не слышал что процессор настолького компа в среднем загружен на 5%, а сервера — на 20% G>>На C имеет смысл писать только математику, обработка больших объемов данных гораздо лучше пишется на .NET. E>Я думаю, что в твоих задачах обработка больших объёмов совсем лучше всего выполнятся СУБД... В на C# хорошо пишется интерфейс к этой самой СУБД...
Если данные лежат в субд и имеют реляционную природу, то конечно субд. И интерфейс отлично будет.
А если нет — то придется код писать и уж точно не на С++.
E>Ты видимо не встречал пока других сложных задач, где нужна таки выч. мощь, кроме того, что ты называешь словом "математика"
А где еще нужна таки вычмощь кроме математических алгоритмов (физика, графика, видео) ?
Все задачи которые требуют не только процессора, но и активно работы с другими ресурсами компьютера (память, диск, сеть), а также требующие высокую степень параллельности обработки лучше уже писать на .NET.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, esil, Вы писали:
E>>А тут случаем баг не закрался? E>>CreateBySimilarityCasesensitive возвращает временный объект, на который потом берётся ссылка. NBN>Нет, временный объект просуществует до конца видимости ссылки. С указателем такая фишка не сработает.
Сенкс. Не думал, что в этом флейме удастся узнать что-то новое про С++ =)
С подобным кодом раньше не сталкивался, обычно в таких случаях вместо ссылки просто создают локальный объект )
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Круто, а фабричный метод так изобразите? G>>ЗЫ. Передача указателя на стек до добра не доводит, большенство уязвимостей в ПО так и получаются.
E>Я заню, что круто )) E>Нет, фабричный метод так не изображу. Только не надо говорить "ну тогда и нет никакого ООП на стэке". Естественно одним стэком не обойдёшься. Но стэк позволяет убрать очень много выделений памяти.
Для С++ толк в этом есть, но мало. Это уже оптимизация после которой код хуже читается, сложнее модифицируется и еще и потенциально подвержен уязывимостям.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
M>>>>С одной стороны виноват тот же С++. Потому что legacy и тот же ворд нет смысла переписывать с нуля M>>>>С другой стороны — а что такое десктопный софт?
H>>>Гуглохром например, и легаси нету и работает на десктопе
G>>У гугла столько ресурсов, что они могуть ОС в машинных кодах написать. G>>И если им будет надо — напишут.
H>У МС ресурсов не меньше, чего же легаси свое не перепишут на шарпе? Глядишь и сэкономят еще
Про это уже говорили, вроде даже в этой теме.
Здравствуйте, esil, Вы писали:
E>С подобным кодом раньше не сталкивался, обычно в таких случаях вместо ссылки просто создают локальный объект )
Чтобы создать локальный объект, надо знать его тип. А он может определяться, например, типом аргументов перегруженной порождающей функции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, esil, Вы писали:
E>Лично мне комфортно от того, что можно пробовать строить различные архитекутры, не думая изначально о том, сколько каких мелких объектов где выделяется, потому что в случае чего можно расчехлить тяжёлую артиллерию. Кому-то такой подход кажется нормальным, кому-то нет. Но по крайней мере есть выбор. Хотя наличие выбора может кому-то тоже показаться плохой идеей. ))
Тут есть ещё одна тонкость. спец. аллокатор таки эффективнее для своей задачи. В этом нет ничего удивительного, так как специализированные решения часто лучше обобщённых
А дальше возникает вопрос насколько тебе это надо. Если ты шахматные часы пишешь, то и фиг с ним. А если, скажем, делаешь ты С-300, и надо, чтобы система управления быстрее чесалась, так как чем быстрее и точнее она чешется, тем на дальше хватает изделию топлива. И тем больше есть времени, соответственно, "на выстрелить"...
И вот ты разрабатываешь, разрабатываешь, и упираешься. С С++ у тебя будет ещё один шаг, практически до субмакисмльного быстродействия, а в GC архитектуре ты остановишься на просто большом быстродействии и всё. И в результате ракета у амеров летает на 250, а у РФ на 350 км... И привет арифметике...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, VladD2, Вы писали:
VD>Почему всем будет смешно, если им расскажут о подмастерьи физика, химика или врача. Так почему же подмастерья программистов обсуждаются серьезно?
Ну посмейся. Слова "аспирант", "ординатура" и "научный руководитель диплома" и "производственная практика" для тебя новы?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
G>>Ну это смотря что понимать под качеством проектирования. G>>Гуглите "premature optimization". E>Это другое. Обычно этим словом обозначают желание экономить на спичках пока ещё не решено нужен ли костёр, так скажем. Но если ты, например, решил писать спел-чекер, то ответить на вопросы в какой структуре данных ты будешь хранить словарь и будет ли словарь словоформенным или полексемным, стоит ответить ещё на этапе проектирования
Я в спелл-чекерах не силен, но я так понимаю что имеет ввиду два принципиально разных алгоритма. Тогда да, выбор надо делать заранее.
Только не стоит в это месте говорить "структура данных". Именно структура может измениться до неузнаваемости при эволюционном дизайне.
G>>Это я неверно выразился. Вместо быстрый надо читать "оптимизированный". E>Я, видимо, плохо понимаю смысл "оптимизированный". Видимо это какой-то способ портить код?
Обычно неалгоритмическая оптимизация зкалючается в расстановке хаков с целью повысить быстродействие. Эти хаки очень отрицательно сказываются.
G>>Например мне удалось жа полчаса объяснить человек программу на F# на два экрана, при том что он F# не знал. G>>Аналогичная программа на C++ занимала бы больше и была бы гораздо более сложна в понимании. E>Возможно. Но F# -- это всё равно маргинальщина. Кроме того, я не понимаю, что значит "объяснить". Он бы после твоих объяснений смог бы эту прогу поддерживать? В любом случае это тут офтоп.
Нет, он смог объяснить её преподу так что тот понял и еще на вопросы ответил, короче получил зачет.
G>>Делать процедурную обвязку вокруг ОО-кода не хочется, тем более обычно задача низкоуровневого кода заключается в математике. E>Не знаю, что такое "низкоуровневый код" В моих программах мотор намного сложнее оболочки. Возможно ты с моторами, кроме СУБД просто не сталкивался.
А что за программы? С таким бешенным мотором.
E>>>Пока не нужна память и скорость -- да. Например для GUI ХиндиС -- это просто находка! G>>Ну а доказательства тезиса будут? G>>Или опять по принципу — чем больше повторить, там больше правда. E>А если речь идёт об обработке большого количества данных, то я не знаю успешных примеров моторов на ХиндиС...
А я не знаю примеров где они нужны были. Приведите парочку.
G>>Если данные лежат в субд и имеют реляционную природу, то конечно субд. И интерфейс отлично будет. G>>А если нет — то придется код писать и уж точно не на С++. E>При веди пример данных, о которых речь...
Трейдерские системы, накопление статистики по мере прихода информации.
G>>А где еще нужна таки вычмощь кроме математических алгоритмов (физика, графика, видео) ? E>Есть то, что я бы не назвал "математические алгоритмы", хотя, строго говоря, все алгоритмы "математические"... E>Скажем нейронная сеть -- это мат. алгоритм?
Нейронная сеть — да, там перемножение матриц и обратное распространение ошибкм. E>А поисковая машина?
Чего ищет?
E>Или, например, сжималка памяти на лету, позволяющая увеличить видимый RAM?
Что-то на грани фантастики.
G>>Все задачи которые требуют не только процессора, но и активно работы с другими ресурсами компьютера (память, диск, сеть), а также требующие высокую степень параллельности обработки лучше уже писать на .NET.
E>Про параллельность не уверен, есть более специальные средства, хотя я сторонник наоборот, крупной гранулярности, если возможно, и тогда язык не особо важен. Про сеть -- вообще всё пофиг, IMHO, если это не TCP/IP стек А если он -- то не ХиндиС, однозначно, IMHO. Работа с диском -- это известный тормоз и не ясно какая разница, какой язык, опять же...
Видимо вы не писали таких программ. Разница есть. E>Про активную работу с памятью (что бы это не значило) я тоже как-то сильно сомневаюсь. И С и С++ позволяют отрегулировать эту "активную работу" намного тоньше...
Вот этого как раз не надо. "Тонкое" управление обычно выливается в очень большие сроки разработки.
Нужны простые способы абстрагироваться от этого управления.
E>Вот, например, хочу я разработать search engine. Типа как у google. Чтобы скармливать ему документы, а оно их разбивало на слова, как-то там индексировало, а потом отвечало на вопросы вроде: "найди мне все документы, где слова "мама" отстоит от слова "моя" не дальше двух слов, стоят в одном предложении и согласованы по грамматическому значению". E>Ну и пополняем, например, на одной нити, а ищем параллельно. И что, думаешь на C# хорошо получится? E>AFAIK, все такие движки на плюсах чего-то пишут...
Ну если учесть все аспекты хранения и обработки индексов, распараллеливания вычислений и балансировки входящей нагрузки, то думаю что на .NET получится получше.
Здравствуйте, gandjustas, Вы писали:
G>Только не стоит в это месте говорить "структура данных". Именно структура может измениться до неузнаваемости при эволюционном дизайне.
Ну что-то изменится, а что-то останется.
Как бы список упорядоченный по алфавиту путём эволюции в префиксное дерево не превратится...
G>Обычно неалгоритмическая оптимизация зкалючается в расстановке хаков с целью повысить быстродействие. Эти хаки очень отрицательно сказываются.
Ну даже хаки можно расставлять культурно, скажем перекрывать new|delete у какого-нибудь класса, а не у всех. Кроме того, в нормальных программах можно не заниматься совсем уж хакками...
G>Нет, он смог объяснить её преподу так что тот понял и еще на вопросы ответил, короче получил зачет.
Ха! Тогда я как-то кванты человку за ночь "объяснил"...
IMHO, к разработке это всё отношения не имеет вообще
G>А что за программы? С таким бешенным мотором.
AI в разных раскладах.
G>А я не знаю примеров где они нужны были. Приведите парочку.
поисковая машина, распознавание речи, переводчик, ICR, OCR, анализ структуры чего-нибудь, скажем поиск рака молочной железы по рентгенограмме,.. Это то, про что я сразу подумал...
G>Трейдерские системы, накопление статистики по мере прихода информации.
А что мешает статистику в БД лить? Кроме того не совсем понятно что за трейдерская система с большим трафиком данных? Ну сколько там сделок с секунду? Ну не миллиард же?
G>Нейронная сеть — да, там перемножение матриц и обратное распространение ошибкм.
Это всего лишь одна из реализаций. Наивная довольно. E>>А поисковая машина? G>Чего ищет?
Ну Google знаешь?
G>Что-то на грани фантастики.
Есть несколько конкурирующих продуктов...
Во всяком случае было...
E>>Про параллельность не уверен, есть более специальные средства, хотя я сторонник наоборот, крупной гранулярности, если возможно, и тогда язык не особо важен. Про сеть -- вообще всё пофиг, IMHO, если это не TCP/IP стек А если он -- то не ХиндиС, однозначно, IMHO. Работа с диском -- это известный тормоз и не ясно какая разница, какой язык, опять же... G>Видимо вы не писали таких программ. Разница есть.
"Таких" -- это "каких"? С диском, пофиг как откуда работать, всё равно диск ждать...
Главное много лишней памяти не скушать. Либо асинхронный доступ реализовать, но тут опять же от ОС скорее зависит, а не от языка...
G>Вот этого как раз не надо. "Тонкое" управление обычно выливается в очень большие сроки разработки. G>Нужны простые способы абстрагироваться от этого управления.
Это от целей зависит. Если цель -- очень быстро разработать, то да, лучше абстрагироваться, а если цель высокое качество, то лучше иметь возможность рулить...
G>Ну если учесть все аспекты хранения и обработки индексов, распараллеливания вычислений и балансировки входящей нагрузки, то думаю что на .NET получится получше.
Тем не менее все известные успешные реализации на С++ Даже новые...
И, кстати, я не думаю, что на ХиндиС получится лучше. Просто потому, что нет причин для этого. Хотя, скорее всего, и сильно хуже не получится. Будет по памяти менее эффективно на какой-то процент и всё... Скажем на ~10%
Ну а дальше вопрос зачем это нужно. Если на сервере, чтобы работало, то пофиг наверное, а если на сотовом телефоне, для поиска по тексту карточек словаря, то ХиндиС будет в пролёте...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[76]: Плохому танцору на С++ лучше не прогать...
Здравствуйте, Erop, Вы писали:
E>Есть и другие ниши. Скажем ретейл. Обычно коробочный софт разрабатывают по какому-то графику, есть цикл выпуска версий там, то, сё, есть время на проектирование, на тестирование, на качество разработки, короче. Если ты будешь выпускать версии раз в месяц, ты только проиграешь! Так что выгодно выпускать версии пореже, но покруче...
Тоже самое, только без изменчивости требований.
При поставленном процессе выпуск релиза ниче не стоит.
E>А ещё есть разработка технологий и моторов всяких. Скажем сидят люди из 17-й версии СУБД делают 18-ю. Там своя специфика, и C# ещё меньше в тему. Ну и т. д.
Там таже самая фигня.
E>Или, наоборот, сидят люди и пишут то, что никто ещё не писал и как это писать не знает. Тоже интересная, и тоже особенная работа...
Тогда делается прототип(ы), с целью выяснить как писать, а потом пишется продукт.
А исследования планируются очень просто — поставлены цели, выделено бабло, как только цели достигнуты или бабло кончилось исследования заканчиваются и начинается разработка продукта.
E>При этом все эти активности -- программирование. Но они все разные. И кому-то нравится одно, а кому-то другое...
Это ты сам придумал. Промышленный подход к программированию заключается в том что ты пишешь примерно одинаково, только цели немного разные.
Здравствуйте, gandjustas, Вы писали:
G>Вообще если готовы бабло платить, то можно написать суперкомпилятор, который будет специализировать программу под входные данные, тогда она будет лететь 3 раза вокруг земли.
G>Но для этиъ целей С++ точноне подойдет.
1) Ты про CT что-нибудь слышал?
2) Как думаешь, а сам компиллер С++ на чём писан?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[77]: Плохому танцору на С++ лучше не прогать...
Здравствуйте, gandjustas, Вы писали:
G>При поставленном процессе выпуск релиза ниче не стоит.
Может и не стоит, но что ты будешь выпускать на этапе проектирования, например?
Или прототипирования...
Короче не догма. На каких-то этапах каких-то проектов полезно, а на каких-то не особо.
G>Тогда делается прототип(ы), с целью выяснить как писать, а потом пишется продукт.
Нет. Прототипы конечно делаются, но это ОЧЕНЬ УПРОЩЁННЫЙ взгляд на вещи.
Вот представь себе, что тебе надо написать игрока в го, который победит на ЧМ. Как построишь ты работу?
G>Это ты сам придумал. Промышленный подход к программированию заключается в том что ты пишешь примерно одинаково, только цели немного разные.
Не знаю что я там придумал, но с психологической точки зрения активность очень разная...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
G>>Только не стоит в это месте говорить "структура данных". Именно структура может измениться до неузнаваемости при эволюционном дизайне. E>Ну что-то изменится, а что-то останется. E>Как бы список упорядоченный по алфавиту путём эволюции в префиксное дерево не превратится...
У меня один раз именно такое превращение произошло.
G>>Обычно неалгоритмическая оптимизация зкалючается в расстановке хаков с целью повысить быстродействие. Эти хаки очень отрицательно сказываются. E>Ну даже хаки можно расставлять культурно, скажем перекрывать new|delete у какого-нибудь класса, а не у всех. Кроме того, в нормальных программах можно не заниматься совсем уж хакками...
Это и нижает читаемость и модифицируемость кода. Пользователю класса еще недо будет знать как работает аллокатор класса, чтобы его эффективно использовать.
G>>Нет, он смог объяснить её преподу так что тот понял и еще на вопросы ответил, короче получил зачет. E>Ха! Тогда я как-то кванты человку за ночь "объяснил"... E>IMHO, к разработке это всё отношения не имеет вообще
Кванты действительно не имеют.
G>>Трейдерские системы, накопление статистики по мере прихода информации. E>А что мешает статистику в БД лить? Кроме того не совсем понятно что за трейдерская система с большим трафиком данных? Ну сколько там сделок с секунду? Ну не миллиард же?
То что лить+считать статистику в бд — не хватает скорости бд. Она не рассчитана на сочетания быстрых записей и рассчет аналитики одновременно.
G>>Нейронная сеть — да, там перемножение матриц и обратное распространение ошибкм. E>Это всего лишь одна из реализаций. Наивная довольно. E>>>А поисковая машина? G>>Чего ищет? E>Ну Google знаешь?
Ну знаю. Еще Windows Live знаю, у них вроде на C# (если не все, то большая часть)
G>>Вот этого как раз не надо. "Тонкое" управление обычно выливается в очень большие сроки разработки. G>>Нужны простые способы абстрагироваться от этого управления. E>Это от целей зависит. Если цель -- очень быстро разработать, то да, лучше абстрагироваться, а если цель высокое качество, то лучше иметь возможность рулить...
Это на основании кагого опыта написано?
G>>Ну если учесть все аспекты хранения и обработки индексов, распараллеливания вычислений и балансировки входящей нагрузки, то думаю что на .NET получится получше. E>Тем не менее все известные успешные реализации на С++ Даже новые...
Скажи это разработчикам Windows Live.
E>И, кстати, я не думаю, что на ХиндиС получится лучше. Просто потому, что нет причин для этого. Хотя, скорее всего, и сильно хуже не получится. Будет по памяти менее эффективно на какой-то процент и всё... Скажем на ~10%
Я не вижу причин чтобы получилось хуже.
E>Ну а дальше вопрос зачем это нужно. Если на сервере, чтобы работало, то пофиг наверное, а если на сотовом телефоне, для поиска по тексту карточек словаря, то ХиндиС будет в пролёте...
А там сильно мощный поиск нужен?
Можно взять Lucene.net — работает очень быстро, можно собрать под CF.
Здравствуйте, VladD2, Вы писали:
VD>Я сутки работал, трое учился, а по вечерам еще с тем же С++ разбирался. Просить у кого-то за это деньги мне даже в голову не приходило.
Ну что тут поделаешь, а некоторым (я их знаю лично) платят только за то, что они соглашаются где-то учиться... Мир несправедлив...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[30]: Дык известное дело: поспешишь - людей наспешишь ;)
Здравствуйте, Erop, Вы писали:
E>Ну, ты, кажется, вызвался довольно менторским тоном всезнайки разговаривать о С++ коде, даже не врубаясь что там написано?
Нет, я задал вопрос. Менторский тон — это у тебя в голове. E>Я надеюсь, уточнение сортировки в Case-insensitive/accent-sensitive для турецкой локали не усложнит эту безусловно прекрасную программу?[/q]твои же слова?
Ну да, мои. Ну так ты ответь, раз ты так хорошо знаешь STL и плюсы — как будет выглядеть программа с учетом сортировки, которую я привел.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, CreatorCray, Вы писали: CC>>Беда то в том, что входной порог в managed сильно низкий, и обложенный памперсами нуб может спокойно говнокодить не получая при этом за свой говнокод по рукам — работает же, и не падает. S>Ничего страшного. На плюсах нуб точно так же может говнокодить. То, что приложение сумело запуститься у нуба на машине, никак не гарантирует того, что оно будет устойчиво работать во всех сценариях.
В плюсах нуб просто не взлетит шутка конечно но ...
Здравствуйте, hattab, Вы писали:
H>У меня был контракт с конторой, в которой зарплата расчитывалась 2.5 суток (!) (большая контора). Они тоже считали это нормальным, пока мы не сократили время до 40 минут (переписали с нуля)
Мама мия... решение матрицы 500*500 занимает доли секунды , ЧТО может занимать 40 минут даже если считать зарплату всего земного шара ??? За 40 минут можно отрендрить ролик с симуляцией жидкости и ткани .
P.S. вот это и называется различные прикладные области, в моей считаются такты и тригонометрические операции.
Здравствуйте, Хвост, Вы писали:
Х>правда, вот я прямо сейчас смотрю в реализацию гугловского V8, и вижу как ни странно запредельный перфоманс + надёжный и красивый код, а может тебе указать на библиотечку Blitz++ которая уделала фортран на вычислительных задачах (да, фортран, да, на вычислительных задачах) что не удавалось твоему перфоманс-фавориту Си? другое дело что мало кто так писать умеет, большинству проще на шарпах Linq'ом побаловаться или в WPF'е поформошлёпить )
Офтоп , Blitz++ в сад , boost::numeric::ublas на голову лучше (безопаснее и красивее и быстрее).
Здравствуйте, gandjustas, Вы писали:
G>Только делать так не нужно. В первую очередь стоит заняться алгоритмический оптимизацией или даже архитектурной, а не кидаться писать кастомный аллокатор. G>Причем этот подход работает для любых языков.
Ты сам недавно писал, что архитектура ортоганальна перформансу
Здравствуйте, minorlogic, Вы писали:
H>>У меня был контракт с конторой, в которой зарплата расчитывалась 2.5 суток (!) (большая контора). Они тоже считали это нормальным, пока мы не сократили время до 40 минут (переписали с нуля)
M>Мама мия... решение матрицы 500*500 занимает доли секунды , ЧТО может занимать 40 минут даже если считать зарплату всего земного шара ??? За 40 минут можно отрендрить ролик с симуляцией жидкости и ткани .
Ты наверное не думаешь, что расчет ЗП и решение матрицы это одно и тоже...
M>P.S. вот это и называется различные прикладные области, в моей считаются такты и тригонометрические операции.
Вот я и думаю, ты это серьезно, или прикалываешься
Здравствуйте, Erop, Вы писали:
E>Скажем в твоих задачах core обычно на СУБД какой-то реализовано, а в одной из часть core была на C...
Стереотипы... Не надо думать, что на .Net создаются только "коннекторы к БД", это далеко не так. Скажем во всех проектах, на которых я работал, конечно, использовались хранимки, но куча серверной бизнес-логики была на C#. Намного больше чем в SQL и core в этих системах как раз сервер приложений, сплошь себе управляемый.
G>Да как раз не все равно. Ты перечитай еще раз о чем я тебе толкую. .NET поребляет больше памяти на практически константную величину. Истории о том что кто-то запустил программу на .NET и она схавала сразу все свидетельствуют о криворукости автора программы, а не об особенностях работы с памятью в .NET.
Насколько я помню, 18 мегабайт это и есть тот самый минимум, который отжирает сам .Net, дальше памяти нужно много меньше.
G>>Да как раз не все равно. Ты перечитай еще раз о чем я тебе толкую. .NET поребляет больше памяти на практически константную величину. Истории о том что кто-то запустил программу на .NET и она схавала сразу все свидетельствуют о криворукости автора программы, а не об особенностях работы с памятью в .NET.
S>Насколько я помню, 18 мегабайт это и есть тот самый минимум, который отжирает сам .Net, дальше памяти нужно много меньше.
А C++ можешь изучать в свободное время для общего развития и радоваться, что выбрал C#.
Помни: поменять язык — это тебе не два байта переслать.
Инерцию ума работодателей преодолеть весьма сложно, объясняя им, что со своим опытом и глубоким пониманием программирования ты и на другом языке сможешь прекрасно программировать, хоть у тебя и нет на нем опыта работы вообще, но джуниор-девелопером ты как-то не хочешь быть.
Работодатели считают, что если человек начал когда-то писать на каком-то языке, то так он и должен до гробовой доски на нем писать.
Обычно поменять язык можно, если предоставится подходящая ситуация в фирме и соответствующий проект.
Не припоминаю сишарперов, который вдруг стали сишниками.
Я знаю некоторых программистов, у которых большой опыт в разработке бизнес-приложений на C#, но C++ они в упор не способны понять.
Для C++ часто требуется на порядок более высокая квалификация, а получать ты будешь примерно столько же, сколько C# программист, ну может быть, чуть-чуть больше — в некоторых фирмах. Это относится к России, как в других странах — не знаю.
Если ты раньше писал только на C# бизнес-приложения, то перейти в C++ будет, мягко говоря, трудновато, да и непонятно — зачем?
Я вот который год пишу на C++ и мне как-то немного тревожно за свое будущее…
Здравствуйте, gandjustas, Вы писали:
E>>Как можно не думать о выделении и освобождении объектов, если из-за этого может оказаться очень низкая производительность приложения? G>Спокойно, и произовдительность нормальная будет.
Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка?
E>>А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав? G>Неправ. Слабые выразительне способности C++ не позволяют мере проводить объектую декомпозицию так как хочется.
Здравствуйте, gandjustas, Вы писали:
E>>Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка? G>Для систем с GC — да. Это и позволяет концентрироваться на алгоритме.
Представьте, что надо сделать текстовый редактор типа WYSIWYG. Ваша вера настолько сильна, что Вы рискнёте для представления одного символа использовать отдельный объект некоторого класса?
Представьте, что надо реализовать какую-нибудь числодробилку. Ваша вера настолько сильна, что Вы рискнёте для представления числа использовать класс?
G>Для C++ — нет. Там надо думать о том как распределяется память под объекты.
В каком смысле надо думать? Думать о том, когда и как память освободить? Ну тогда это утверждение выглядит бредово, с учётом предыдущего. "Производительность будет отличаться на порядки, потому что надо думать". Память выделяется и освобождается в обоих вариантах, но во втором варианте надо думать, чтобы её освободить, поэтому производительность будет хуже.
E>>>>А если я пишу программу на С++, то выбор доступных декомпозиций расширяется. Разве я не прав? G>>>Неправ. Слабые выразительне способности C++ не позволяют мере проводить объектую декомпозицию так как хочется. E>>Примеры? G>1)Как минимум нельзя просто вернуть динамический объект из метода, потому что неизвестно освободят ли его. G>2)Осутствуют многие языковые конструкции как yield, ФВП, делегаты, события. G>3)Отсуствие метаинформации о типах не позволяет создавать решения вроде IoC контейнеров, OR-мапперов, связывания данных (binding) и других полезных фишек.
G>Я знаю что некоторые недостатки исправляются бустом, но обычно это порождает сложночитемый код.
Ок, в общем позиция понятна. Странно правда, что использование std::auto_ptr/boost::shared_ptr для возвращаемого объекта представляется сложночитаемым.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, esil, Вы писали:
E>>Здравствуйте, gandjustas, Вы писали:
E>>>>Т. е. Вы утверждаете, что при правильно выбранном алгоритме независимо от объектной декомпозиции производительность будет одного порядка? G>>>Для систем с GC — да. Это и позволяет концентрироваться на алгоритме.
E>>Представьте, что надо сделать текстовый редактор типа WYSIWYG. Ваша вера настолько сильна, что Вы рискнёте для представления одного символа использовать отдельный объект некоторого класса? G>А такое вообще может быть нужно? Я что-то не представляю сценарий, где для одного символа требуется объект класса. G>Если что есть паттерн flyweight, который как раз позволяет не создавать кучу однотипных объектов.
Вот WYSIWYG-редактор -- это как раз и есть сценарий, где для одного символа хотелось бы отдельный объект.
Наша беседа становится предсказуемой. Я знал, что сейчас Вы скажите про flyweight, а я скопирую описание сего паттерна из той известной книги.
Таки вот, копирую:
Например, в большинстве редакторов документов имеются средства форма-
тирования и редактирования текстов, в той или иной степени модульные. Объект-
но-ориентированные редакторы обычно применяют объекты для представления
таких встроенных элементов, как таблицы и рисунки. Но они не используют
объекты для представления каждого символа, несмотря на то что это увеличило
бы гибкость на самых нижних уровнях приложения. Ведь тогда к рисованию и фор-
матированию символов и встроенных элементов можно былб бы применить еди-
нообразный подход. И для поддержки новых наборов символов не пришлось бы
как-либо затрагивать остальные функции редактора. Да и общая структура прило-
жения отражала бы физическую структуру документа. На следующей диаграмме
показано, как редактор документов мог бы воспользоваться объектами для пред-
ставления символов.
У такого дизайна есть один недостаток — стоимость. Даже в документе скром-
ных размеров было бы несколько сотен тысяч объектов-символов, а это привело
бы к расходованию огромного объема памяти и неприемлемым затратам во время
выполнения. Паттерн приспособленец показывает, как разделять очень мелкие
объекты без недопустимо высоких издержек.
А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные?
Вот это Ваше утверждение "Я что-то не представляю сценарий, где для одного символа требуется объект класса" исходит не из того, что такого никогда не хотелось бы, а из того, что такое не применяется. Не Вам не требуется или не хочется, а это скорее всего будет просто недопустимо. Вы считаете, что этот самый flyweight выглядит не более сложным и не менее хуже читаемым и спопровождаемым, чем отдельный объект для каждого символа?
E>>Представьте, что надо реализовать какую-нибудь числодробилку. Ваша вера настолько сильна, что Вы рискнёте для представления числа использовать класс? G>А что значит класс? G>Например в C# сами числа являются наследниками Object, имеют методы и реализуют интерфейсы.
Класс — это значит уж точно не то, что представляют из себя примитивные типы с автоматическим боксингом в C#.
Кстати, это не с Вами мы разбирали тот пример с обходом plain-массива по индексам и обхода через интерфейс? Или я путаю?
G>Я надеюсь вы сами понимаете, что выдумываете что-то нереальное. не нужно создавать классы для символов и чисел, они уже есть и отлично работают. G>А если каких-то абстракций нету в стандартной библиотеке, то я буду создавать классы. G>Очень надеюсь что все программисты так поступют.
В каком смысле нереальное? Нереальное в плане затрат на реализацию? Так оно о том и речь. С тем, что скорее всего можно найти объектную декомпозицию, которая будет менее затратной по производительности, и более-менее "красивой", никто и не спорит. Но это никак не противоречит неверености вашего исходного утверждения о том, что все объектные декомпозиции имеют производительность одного порядка.
G>>>Для C++ — нет. Там надо думать о том как распределяется память под объекты. E>>В каком смысле надо думать? Думать о том, когда и как память освободить? Ну тогда это утверждение выглядит бредово, с учётом предыдущего. "Производительность будет отличаться на порядки, потому что надо думать". Память выделяется и освобождается в обоих вариантах, но во втором варианте надо думать, чтобы её освободить, поэтому производительность будет хуже. G> G>Ниче не не понял.
Имелось в виду, что здесь очередной плевок в сторону С++ и unmanaged-языков был абсолютно не уместен, потому что здесь либо для обоих вариантов ответ да, либо для обоих нет.
Здравствуйте, NikeByNike, Вы писали:
NBN>Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости.
Тут бы любителям GC и спросить, дескать, как это — "не занимаюсь её освобождением" (и памяти, и других ресурсов, и вообще не ресурсов) и без GC. И, получив ответ, обратиться в веру С++. Увы Вам.
Если не поможет, будем действовать током... 600 Вольт (C)
Здравствуйте, gandjustas, Вы писали:
E>>Вот WYSIWYG-редактор -- это как раз и есть сценарий, где для одного символа хотелось бы отдельный объект. G>Я к сожалению или к счастью визивиги не писал, но не очень понимаю зачем иметь объекты на каждый символ. G>Может вы объясните?
Документ состоит из абзацев. Абзац из "символов". Пока он состоит только из символов, всё просто. Когда в качестве "символа" может быть таблица, рисунок, формула, спецсимвол, объект OLE, что угодно, то сразу напрашивается сделать этот символ классом, а все вышеуказанные объекты сделать наследником этого класса, чтобы с ними можно было единообразно работать. Как уже было сказано тут возникают проблемы с накладными расходами, если представлять каждый символ в виде объекта. В качестве решения предлагается паттерн flyweight, в котором для одинаковых символов используется один и тот же объект. Но у разных одних и тех же символов могут быть разные атрибуты форматирования (шрифт, цвет). В предлагаемом паттерне эти атрибуты хранятся отдельно, и передаются при рисовании в качестве параметров методов. Но эти параметры нужны в основном только символам, таблицам и картинкам они уже не нужны! В результате получается, что такому объекту как картинка при рисовании требуется зачем-то передать шрифт и цвет, которые никак не используются. Разве Вам уже не кажется, что дизайн так себе? Лично мне уже кажется.
Вообще, у нас есть структура, в которой символ является минимальной единицей форматирования, т. е. форматирование может быть назначено каждому символу отдельно. Не логично ли при этом для каждого символа хранить форматирование, а так как оно используется только для символов, то перенести его в класс символа? Мне кажется это логичным. Да, это потребует больше памяти, потому что форматирование будет храниться посимвольно, а не интервалами. Лет 10 назад возможно это и не было бы приемлимо, но сейчас дополнительные 4 байта на символ мне не кажутся слишком большими расходами, если уж даже flyweight предполагает 4 байта на него. Т. е. с издержками на память можно как-то согласиться. Но ешё есть издержки на выделение/освобождение объекта для каждого символа, с которыми, по моему мнению (да и по Вашему как я понял) могут быть большие проблемы.
E>>Наша беседа становится предсказуемой. Я знал, что сейчас Вы скажите про flyweight, а я скопирую описание сего паттерна из той известной книги. E>>Таки вот, копирую: E>>
G>поскипано
E>>А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные? G>Какое отношение это имеет к теме разговора?
К какой из тем? Про независимость производительности от декомпозиции на объекты? Имеет такое, что есть декомпозиции, в которых издержки на выделение/освобождение объектов становятся недопустимыми. Какое отношение эта тема имеет к C#/C++? Ну давайте Вы уже скорее согласитесь с тем, что не все декомпозиции равноценны по производительности, и пойдём дальше?
E>>Вот это Ваше утверждение "Я что-то не представляю сценарий, где для одного символа требуется объект класса" исходит не из того, что такого никогда не хотелось бы, а из того, что такое не применяется. Не Вам не требуется или не хочется, а это скорее всего будет просто недопустимо. Вы считаете, что этот самый flyweight выглядит не более сложным и не менее хуже читаемым и спопровождаемым, чем отдельный объект для каждого символа? G>Не понял что вы этим хотели сказать. G>Давайте так: объясните зачем создавать какой-то класс, если уже существует подходящий тип в базовой библиотеке.
Чтобы сделать в нём виртуальный метод.
E>>Класс — это значит уж точно не то, что представляют из себя примитивные типы с автоматическим боксингом в C#. G>Так что представляют из себя классы? Причем тут боксинг вообще? E>>Кстати, это не с Вами мы разбирали тот пример с обходом plain-массива по индексам и обхода через интерфейс? Или я путаю? G>Не припоминаю, наверное не со мной.
Извините, попутал. Имелось в виду, что примитивные типы не являются reference-типами, пока не будет сделан боксинг.
E>>В каком смысле нереальное? Нереальное в плане затрат на реализацию? Так оно о том и речь. С тем, что скорее всего можно найти объектную декомпозицию, которая будет менее затратной по производительности, и более-менее "красивой", никто и не спорит. Но это никак не противоречит неверености вашего исходного утверждения о том, что все объектные декомпозиции имеют производительность одного порядка. G>Нет, вы придумываете ситуации, которые не встечаются в нормальных приложениях. G>На выдуманых примерах можно вообще показать что угодно.
Выше написал про редактор.
G>>>>>Для C++ — нет. Там надо думать о том как распределяется память под объекты. E>>>>В каком смысле надо думать? Думать о том, когда и как память освободить? Ну тогда это утверждение выглядит бредово, с учётом предыдущего. "Производительность будет отличаться на порядки, потому что надо думать". Память выделяется и освобождается в обоих вариантах, но во втором варианте надо думать, чтобы её освободить, поэтому производительность будет хуже. G>>> G>>>Ниче не не понял.
E>>Имелось в виду, что здесь очередной плевок в сторону С++ и unmanaged-языков был абсолютно не уместен, потому что здесь либо для обоих вариантов ответ да, либо для обоих нет. G>Это надо еще доказать. Ваш пример с визивигом доказательство не является, потому что он явно надуманный и нифига не обощается. Далеко не во всех программах есть очень много одинаковых объектов.
Причём здесь пример с WYSIWYG? Причём здесь то, что "Далеко не во всех программах есть очень много одинаковых объектов"?
Что доказать? Что выделение/освобождение памяти является и там и там операцией довольно тяжеловесной примерно одного порядка? Вы издеваетесь что ли? Вы правда думаете, что выделение объекта в .net настолько быстрое, что на него можно не обращать внимание, а в С++ оно настолько медленнее, что там уже надо обращать внимание? Вы правда считаете, что при одинаковой объектной декомпозиции в C# и C++ затраты на работу с памятью в C# будут на порядок меньше?
Знаете, складывается такое ощущение, что Вы читаете текст моих постов только для того, чтобы хоть как-то аргументированно возразить, независимо от того, что я напишу, потому-что Вам кажется, что если Вы хоть с чем-то согласитесь, то это будет сразу же автоматически и неминуемо означать, что C# дерьмо, а С++ рулит.
Здравствуйте, esil, Вы писали:
E>Здравствуйте, gandjustas, Вы писали:
E>>>Вот WYSIWYG-редактор -- это как раз и есть сценарий, где для одного символа хотелось бы отдельный объект. G>>Я к сожалению или к счастью визивиги не писал, но не очень понимаю зачем иметь объекты на каждый символ. G>>Может вы объясните?
E>Документ состоит из абзацев. Абзац из "символов". Пока он состоит только из символов, всё просто. Когда в качестве "символа" может быть таблица, рисунок, формула, спецсимвол, объект OLE, что угодно, то сразу напрашивается сделать этот символ классом, а все вышеуказанные объекты сделать наследником этого класса, чтобы с ними можно было единообразно работать. Как уже было сказано тут возникают проблемы с накладными расходами, если представлять каждый символ в виде объекта. В качестве решения предлагается паттерн flyweight, в котором для одинаковых символов используется один и тот же объект. Но у разных одних и тех же символов могут быть разные атрибуты форматирования (шрифт, цвет). В предлагаемом паттерне эти атрибуты хранятся отдельно, и передаются при рисовании в качестве параметров методов. Но эти параметры нужны в основном только символам, таблицам и картинкам они уже не нужны! В результате получается, что такому объекту как картинка при рисовании требуется зачем-то передать шрифт и цвет, которые никак не используются. Разве Вам уже не кажется, что дизайн так себе? Лично мне уже кажется.
И мне кажется.
Нафиг не нужны символы текста как отдельные объекты. Строк достаточно.
В таком случае сразу отпадает необходимость использовать flyweight.
E>Вообще, у нас есть структура, в которой символ является минимальной единицей форматирования, т. е. форматирование может быть назначено каждому символу отдельно. Не логично ли при этом для каждого символа хранить форматирование, а так как оно используется только для символов, то перенести его в класс символа? Мне кажется это логичным. Да, это потребует больше памяти, потому что форматирование будет храниться посимвольно, а не интервалами.
Если нужно форматирование посимвольно, то это правильно.
Но например в HTML такое не нужно, тем не менее работает.
E>Лет 10 назад возможно это и не было бы приемлимо, но сейчас дополнительные 4 байта на символ мне не кажутся слишком большими расходами, если уж даже flyweight предполагает 4 байта на него. Т. е. с издержками на память можно как-то согласиться. Но ешё есть издержки на выделение/освобождение объекта для каждого символа, с которыми, по моему мнению (да и по Вашему как я понял) могут быть большие проблемы.
Ну даже если вынести символы отдельно и использовать flyweight, то это никак не решит проблемы создания кучи мелких объектов для аттрибутов символа.
При создании объектов надо определиться с равенством объектов.
Паттерн flyweigth говорит нам что если создается много объектов, но при этом разных (в смысле равентсва) объектов не так много, то лучше не создавать объекты, а использовать идентичные (одни и теже) объекты, созданные заранее.
E>>>Имелось в виду, что здесь очередной плевок в сторону С++ и unmanaged-языков был абсолютно не уместен, потому что здесь либо для обоих вариантов ответ да, либо для обоих нет. G>>Это надо еще доказать. Ваш пример с визивигом доказательство не является, потому что он явно надуманный и нифига не обощается. Далеко не во всех программах есть очень много одинаковых объектов. E> E>Причём здесь пример с WYSIWYG? Причём здесь то, что "Далеко не во всех программах есть очень много одинаковых объектов"? E>Что доказать? Что выделение/освобождение памяти является и там и там операцией довольно тяжеловесной примерно одного порядка?
Это не так.
E>Вы издеваетесь что ли?
Нет
E>Вы правда думаете, что выделение объекта в .net настолько быстрое, что на него можно не обращать внимание,
Да, сдвиг указателя и все.
E>а в С++ оно настолько медленнее, что там уже надо обращать внимание?
С++ медленнее, но обращать внимание все равно не надо.
В C++ надо обращать внимание на сам факт освобождения или использовать что-то типа auto_ptr или shared_ptr, которые создают свой оверхед.
E>Вы правда считаете, что при одинаковой объектной декомпозиции в C# и C++ затраты на работу с памятью в C# будут на порядок меньше?
Она одинаковой не будет.
E>Знаете, складывается такое ощущение, что Вы читаете текст моих постов только для того, чтобы хоть как-то аргументированно возразить, независимо от того, что я напишу, потому-что Вам кажется, что если Вы хоть с чем-то согласитесь, то это будет сразу же автоматически и неминуемо означать, что C# дерьмо, а С++ рулит.
Мне кажется с точностью до наоборот.
Здравствуйте, esil, Вы писали:
E>А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные?
Меня всегда умиляла способность читать книгу и ничерта не понимать.
Ты не заметил, что паттерн позволяет заменить часть программы так, чтобы уменьшить накладные расходы до приемлемых?
При этом основным алгоритмам наплевать, один и тот же там объект или разные.
Это как раз пример того, что мы
а) сначала пишем систему так, как нам удобно — все алгоритмы (например, разбиения на строки и страницы) пишутся очевидным и красивым образом
б) при помощи профайлера выясняем источник проблемы
в) заменяем нехорошую часть алгоритма.
Например, для текстового редактора мы бы всего лишь изменили маленький фрагмент кода, тот, где фабрика Char-ов. Возможно, закомментировали бы метод Char.Equals (чтобы использовать дефолтный ReferenceEquals, который быстрее). И всё! Где тут "заранее проектировать с учетом быстродействия"?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>Для C++ — нет. Там надо думать о том как распределяется память под объекты.
Только если профайлер тычет пальцем в распределение памяти под объекты. А такое обычно бывает если выделяется много мелких объектиков.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, hattab, Вы писали:
H>И все! Приплыли. Выкинули весь парсинг, валидацию, маппинг и переписали. Лень было проектировать заранее.
Это оттого, что вы с самого начала писали маппинг плохим, неочевидным и неудобным способом.
Вы перемешали логику реализации с логикой задачи. Конечно вы в итоге огребли. Это стопроцентная гарантия.
А вот если бы у вас маппинг был описан декларативно (см. XmlRootAttribute, XmlElementAttribute, XmlAttributeAttribute и т.п.), то вы бы легко заменили DOM-based serializer на SAX-based serializer.
Аналогичные примеры приводят всякие умники про "изначальный выбор алгоритма сортировки" и прочую ботву. Их проблемы — ровно аналогичны. Зачем писать программы в настолько связанном стиле?
Все ведущие собаководы говорят: выражайте намерения, а не действия. Потому что действия изменчивы, а намерения стабильны.
Я приводил ссылку на блог Липперта. Один товарищ там Липперта обвинил в том, что тот дескать намеренно пессимизировал программу, чтобы легче было оптимизировать потом.
Нет, Липперт просто написал программу в максимально декларативном виде. Благодаря этому ему было легко подменить, к примеру, реализацию коллекции.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
H>>И все! Приплыли. Выкинули весь парсинг, валидацию, маппинг и переписали. Лень было проектировать заранее. S>Это оттого, что вы с самого начала писали маппинг плохим, неочевидным и неудобным способом. S>Вы перемешали логику реализации с логикой задачи. Конечно вы в итоге огребли. Это стопроцентная гарантия.
S>А вот если бы у вас маппинг был описан декларативно (см. XmlRootAttribute, XmlElementAttribute, XmlAttributeAttribute и т.п.), то вы бы легко заменили DOM-based serializer на SAX-based serializer.
Слушай, ты по фотографии не лечишь? А то появляются у меня смутные подозрения... Ты понимаешь как отличается алгоритм при работе с DOM и SAX? Кардинально. Общности там вообще ни какой нет. Если в случае с DOM я могу делать маппинг с готовой модели, то используя SAX я вынужден маппинг и валидацию делать по ходу пьессы (кстати, речь идет о парсинге).
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, Sinclair, Вы писали:
H>>>И все! Приплыли. Выкинули весь парсинг, валидацию, маппинг и переписали. Лень было проектировать заранее. S>>Это оттого, что вы с самого начала писали маппинг плохим, неочевидным и неудобным способом. S>>Вы перемешали логику реализации с логикой задачи. Конечно вы в итоге огребли. Это стопроцентная гарантия.
S>>А вот если бы у вас маппинг был описан декларативно (см. XmlRootAttribute, XmlElementAttribute, XmlAttributeAttribute и т.п.), то вы бы легко заменили DOM-based serializer на SAX-based serializer.
H>Слушай, ты по фотографии не лечишь? А то появляются у меня смутные подозрения... Ты понимаешь как отличается алгоритм при работе с DOM и SAX? Кардинально. Общности там вообще ни какой нет. Если в случае с DOM я могу делать маппинг с готовой модели, то используя SAX я вынужден маппинг и валидацию делать по ходу пьессы (кстати, речь идет о парсинге).
А с чего ты взял что DOM гораздо удобнее для этой задачи?
Традиционно входящими данными для парсера явяляется поток лексем. В вашем случае интерфейс, представляющий XML как поток лексем — StAX.
Здравствуйте, hattab, Вы писали: H>Слушай, ты по фотографии не лечишь? А то появляются у меня смутные подозрения... Ты понимаешь как отличается алгоритм при работе с DOM и SAX? Кардинально.
Алгоритм, пардон, чего?
Я призываю всего лишь отделить конкретный маппинг от алгоритма маппинга. Ничего военного в этом нету.
H>Общности там вообще ни какой нет. Если в случае с DOM я могу делать маппинг с готовой модели, то используя SAX я вынужден маппинг и валидацию делать по ходу пьессы (кстати, речь идет о парсинге).
Ничего не понимаю. Модель у тебя в любом случае готова до начала десериализации — она статически размечена атрибутами на сериализуемых типах.
Единственное "радикальное отличие" — в том, чтобы делать один проход по потоку, а не два (один для валидации, другой для маппинга).
Нормально написанный код переделать с DOM-парсера на SAX-парсер — пара пустяков. По сравнению, естественно, с переделкой всего клиентского кода, который выполняет реальные вызовы реального ендпоинта.
Покажи мне фрагмент того кода, который вам запредельно сложно переводить в SAX-based. Может, я чего-то кардинально не понимаю?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>А с чего ты взял что DOM гораздо удобнее для этой задачи?
С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае.
G>Традиционно входящими данными для парсера явяляется поток лексем. В вашем случае интерфейс, представляющий XML как поток лексем — StAX.
Это не просто парсинг XML, это еще и валидация модели XML-RPC + маппинг. К слову сказать, в XML-RPC.NET все сделано на основе DOM, так там алгоритм кристально чист и линеен. В случае с SAX, необходим конечный автомат со стеком (гемороя больше в разы, если не на порядок. но и профита море).
Здравствуйте, Sinclair, Вы писали:
H>>Ты понимаешь как отличается алгоритм при работе с DOM и SAX? Кардинально. S>Алгоритм, пардон, чего? S>Я призываю всего лишь отделить конкретный маппинг от алгоритма маппинга. Ничего военного в этом нету.
Алгоритм валидации модели пакета XML-RPC + ее маппинг на языковые типы.
H>>Общности там вообще ни какой нет. Если в случае с DOM я могу делать маппинг с готовой модели, то используя SAX я вынужден маппинг и валидацию делать по ходу пьессы (кстати, речь идет о парсинге). S>Ничего не понимаю. Модель у тебя в любом случае готова до начала десериализации — она статически размечена атрибутами на сериализуемых типах.
Не-не-не. Ты понятия не имеешь, что у тебя на входе, и во что это превратится на выходе. Ни какой статики тут нет.
S>Единственное "радикальное отличие" — в том, чтобы делать один проход по потоку, а не два (один для валидации, другой для маппинга).
Различие в том, что в имея DOM ты можешь свалидировать и смапить все за раз, а в случае SAX ты будешь по кусочкам выполнять эти действия.
S>Нормально написанный код переделать с DOM-парсера на SAX-парсер — пара пустяков. По сравнению, естественно, с переделкой всего клиентского кода, который выполняет реальные вызовы реального ендпоинта.
Клиентский код мы не трогаем, его переделывать в случае смены DOM<->SAX вообще не придется.
S>Покажи мне фрагмент того кода, который вам запредельно сложно переводить в SAX-based. Может, я чего-то кардинально не понимаю?
У меня нет кода работающего с DOM, т.к. у меня решение на SAX (просто я знаю, как бы мне было легче все сделать используя DOM). Но на http://www.xml-rpc.net.com/ есть код работающий с DOM.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>А с чего ты взял что DOM гораздо удобнее для этой задачи?
H>С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае.
Весь прикол в том что для этой задачи DOM и SAX одинаково хреново подходят.
G>>Традиционно входящими данными для парсера явяляется поток лексем. В вашем случае интерфейс, представляющий XML как поток лексем — StAX.
H>Это не просто парсинг XML, это еще и валидация модели XML-RPC + маппинг. К слову сказать, в XML-RPC.NET все сделано на основе DOM, так там алгоритм кристально чист и линеен.
Там используется DOM, хотя вполне хватило бы того самого StAX (XMLReader) ибо вся сериализация-десериализация выполняется потоково.
Здравствуйте, gandjustas, Вы писали:
G>>>А с чего ты взял что DOM гораздо удобнее для этой задачи?
H>>С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае. G>Весь прикол в том что для этой задачи DOM и SAX одинаково хреново подходят.
Реши ее по другому, и покажи тут свое решение. Тода и поговорим
G>>>Традиционно входящими данными для парсера явяляется поток лексем. В вашем случае интерфейс, представляющий XML как поток лексем — StAX.
H>>Это не просто парсинг XML, это еще и валидация модели XML-RPC + маппинг. К слову сказать, в XML-RPC.NET все сделано на основе DOM, так там алгоритм кристально чист и линеен. G> G>Там используется DOM, хотя вполне хватило бы того самого StAX (XMLReader) ибо вся сериализация-десериализация выполняется потоково.
Ты рассуждаешь о задаче, которую, видимо, даже не представляешь.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, gandjustas, Вы писали:
G>>>>А с чего ты взял что DOM гораздо удобнее для этой задачи?
H>>>С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае. G>>Весь прикол в том что для этой задачи DOM и SAX одинаково хреново подходят. H>Реши ее по другому, и покажи тут свое решение. Тода и поговорим
Я уже подумал об этом.
G>>>>Традиционно входящими данными для парсера явяляется поток лексем. В вашем случае интерфейс, представляющий XML как поток лексем — StAX. H>>>Это не просто парсинг XML, это еще и валидация модели XML-RPC + маппинг. К слову сказать, в XML-RPC.NET все сделано на основе DOM, так там алгоритм кристально чист и линеен. G>> G>>Там используется DOM, хотя вполне хватило бы того самого StAX (XMLReader) ибо вся сериализация-десериализация выполняется потоково. H>Ты рассуждаешь о задаче, которую, видимо, даже не представляешь.
О да, я ни разу не парсил XML и не строил по нему какие-то объекты...
Здравствуйте, hattab, Вы писали:
H>С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае.
Не зарекайся. А то когда решить эту задачу с помощью ФВП и рекурсии, то окажется, что это удобнее чем САКсы, шамксы и другие дурДОМы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
H>>С того, что я решил эту задачу используя SAX, и могу со знанием дела утверждать, что удобнее, а что нет в данном случае.
VD>Не зарекайся. А то когда решить эту задачу с помощью ФВП и рекурсии, то окажется, что это удобнее чем САКсы, шамксы и другие дурДОМы.
Здравствуйте, VladD2, Вы писали:
H>>Это не просто парсинг XML, это еще и валидация модели XML-RPC + маппинг.
VD>А зачем ты вообще это вручную делал? Создал бы по метаинформации подходящий XSD и выполнил бы проверк соответствия схеме твоих данных.
Во-первых перформанс. Во-вторых у XML-RPC пакетов есть нюансы, которые схемой не описываются. Ну и в третьих, у меня есть некоторые особенности при работе с большим контентом в base64.
Здравствуйте, hattab, Вы писали:
VD>>А зачем ты вообще это вручную делал? Создал бы по метаинформации подходящий XSD и выполнил бы проверк соответствия схеме твоих данных.
H>Во-первых перформанс.
А ты измерял разницу? Проверка схем вроде как была очень эффективно реализована. Или я ошибаюсь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>>>А зачем ты вообще это вручную делал? Создал бы по метаинформации подходящий XSD и выполнил бы проверк соответствия схеме твоих данных.
H>>Во-первых перформанс.
VD>А ты измерял разницу? Проверка схем вроде как была очень эффективно реализована. Или я ошибаюсь?
Честно говоря нет. Но тут какое дело, схема мне только проверит валидность модели XML-RPC (хотя по приводимой ссылке сказано, что она этого не может, ну допустим), причем весь пакет у меня должен быть в памяти или доступен для второго прохода (собственно моего маппинга). При ручной валидации + маппинге я имею стек правил и модификаторов допустимости некоторых ситуаций, что позволяет эти операции проводить очень быстро (фактически несколько простых проверок). В общем, такой подход позволил мне получить перформанс парсинга "динамики" (пакетов заранее не известных) на уровне gSOAP с его статическим парсингом.
Здравствуйте, hattab, Вы писали:
H>Алгоритм валидации модели пакета XML-RPC + ее маппинг на языковые типы.
Ок, я кажется понял. Я-то думал, у вас есть некая "система", и парсинг XML-RPC лишь некоторая ее часть.
А ты имеешь в виду именно разработку библиотеки парсинга XML-RPC. Про эту задачу я так сходу не могу сказать, какую часть кода можно сделать независимой от выбора SAX/DOM.
При написании "влоб", конечно же, придется выкинуть 100% кода. Ладно, будет время — выкачаю либу, на которую ты ссылался, и посмотрю, как там что устроено.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
E>>Документ состоит из абзацев. Абзац из "символов". Пока он состоит только из символов, всё просто. Когда в качестве "символа" может быть таблица, рисунок, формула, спецсимвол, объект OLE, что угодно, то сразу напрашивается сделать этот символ классом, а все вышеуказанные объекты сделать наследником этого класса, чтобы с ними можно было единообразно работать. Как уже было сказано тут возникают проблемы с накладными расходами, если представлять каждый символ в виде объекта. В качестве решения предлагается паттерн flyweight, в котором для одинаковых символов используется один и тот же объект. Но у разных одних и тех же символов могут быть разные атрибуты форматирования (шрифт, цвет). В предлагаемом паттерне эти атрибуты хранятся отдельно, и передаются при рисовании в качестве параметров методов. Но эти параметры нужны в основном только символам, таблицам и картинкам они уже не нужны! В результате получается, что такому объекту как картинка при рисовании требуется зачем-то передать шрифт и цвет, которые никак не используются. Разве Вам уже не кажется, что дизайн так себе? Лично мне уже кажется. G>И мне кажется. G>Нафиг не нужны символы текста как отдельные объекты. Строк достаточно. G>В таком случае сразу отпадает необходимость использовать flyweight.
Строк не достаточно. Как быть с таблицами и картинками? С ними хочется обращаться как с символами.
E>>Лет 10 назад возможно это и не было бы приемлимо, но сейчас дополнительные 4 байта на символ мне не кажутся слишком большими расходами, если уж даже flyweight предполагает 4 байта на него. Т. е. с издержками на память можно как-то согласиться. Но ешё есть издержки на выделение/освобождение объекта для каждого символа, с которыми, по моему мнению (да и по Вашему как я понял) могут быть большие проблемы. G>Ну даже если вынести символы отдельно и использовать flyweight, то это никак не решит проблемы создания кучи мелких объектов для аттрибутов символа.
Вот для форматирования разных символов можно как раз использовать один и тот же объект "аттрибут". И можно попробовать хранить этот атрибут не для каждого символа, а для интервалов. Но тогда придётся это форматирование передавать каждому символу при рисовании, и картинкам/таблицам тоже.
E>>>>Имелось в виду, что здесь очередной плевок в сторону С++ и unmanaged-языков был абсолютно не уместен, потому что здесь либо для обоих вариантов ответ да, либо для обоих нет. G>>>Это надо еще доказать. Ваш пример с визивигом доказательство не является, потому что он явно надуманный и нифига не обощается. Далеко не во всех программах есть очень много одинаковых объектов. E>> E>>Причём здесь пример с WYSIWYG? Причём здесь то, что "Далеко не во всех программах есть очень много одинаковых объектов"? E>>Что доказать? Что выделение/освобождение памяти является и там и там операцией довольно тяжеловесной примерно одного порядка? G>Это не так.
E>>Вы издеваетесь что ли? G>Нет
E>>Вы правда думаете, что выделение объекта в .net настолько быстрое, что на него можно не обращать внимание, G>Да, сдвиг указателя и все.
E>>а в С++ оно настолько медленнее, что там уже надо обращать внимание? G>С++ медленнее, но обращать внимание все равно не надо.
G>В C++ надо обращать внимание на сам факт освобождения или использовать что-то типа auto_ptr или shared_ptr, которые создают свой оверхед.
E>>Вы правда считаете, что при одинаковой объектной декомпозиции в C# и C++ затраты на работу с памятью в C# будут на порядок меньше? G>Она одинаковой не будет.
Ну т. е. я так понял, что мы прили к соглашению, что для обоих вариантов ответ одинаковый, и вы считаете, что этот ответ "нет — обращать внимание на издержки, связанные с аллокациец объектов, не стоит".
Ну а как же тогда пример с WYSIWYG? Вы считаете, что архитектура с паттерном flyweight ничуть не хуже, чем использование отдельных объектов для символов?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, esil, Вы писали:
E>>А Вы считали зачем придумали этот паттерн? Чтобы было круто и все поняли, что авторы паттерна очень умные? S>Меня всегда умиляла способность читать книгу и ничерта не понимать.
Меня всегда умиляла способность людей умиляться своим способностям.
S>Ты не заметил, что паттерн позволяет заменить часть программы так, чтобы уменьшить накладные расходы до приемлемых? S>При этом основным алгоритмам наплевать, один и тот же там объект или разные.
Если бы Вы хотя бы потрудились прочитать пример кода из указанной книги, то Вам бы стало понятно, что алгоритмам не наплевать. В случае с flyweight им необходимо знать текущее форматирование, которое применяется к рисуемому объекту. Последствия этого Вы понять можете, или тоже нет?
S>Это как раз пример того, что мы S>а) сначала пишем систему так, как нам удобно — все алгоритмы (например, разбиения на строки и страницы) пишутся очевидным и красивым образом S>б) при помощи профайлера выясняем источник проблемы S>в) заменяем нехорошую часть алгоритма. S>Например, для текстового редактора мы бы всего лишь изменили маленький фрагмент кода, тот, где фабрика Char-ов. Возможно, закомментировали бы метод Char.Equals (чтобы использовать дефолтный ReferenceEquals, который быстрее). И всё! Где тут "заранее проектировать с учетом быстродействия"?
Конечно, конечно, всё так просто. А про добавление дополнительного параметра в метод рисования символа вы не забыли? И в методы рисования картинок тоже не забыли? А теперь скажите мне, если у вас этот же класс картинки помимо непосредственно окна редактирования используется в каком-либо сложном элементе UI, то откуда вы там возьмёте "текущее форматирование", которое нужно предать при рисовании картинки? И с какого перепуга компонент UI, который отображает картинку, должен знать о каком-то форматировании?
Здравствуйте, Mamut, Вы писали:
e>> Документ состоит из абзацев. Абзац из "символов".
M>все дальше поскипано. в тх ж GoF, если мне не изеняет память, описано как надо делать для сложного форатирования и т.п.
Там написано не как надо делать, а как можно делать, чтобы избежать больших изжержек.
M>Никому не нужно иметь на каждый символ по классу/экземпляру класса.
Кому не нужно? Вам не нужно. Ну пожалуйста, я не против. А вот те же авторы GoF пишут, что хотелось бы работать с символами как с объектами, но просто так это сделать не позволяют накладные расходы, поэтому они предлагают использовать flyweight в качестве альтернативы. Цитата, которую я привёл, как раз оттуда.
e> e>> Документ состоит из абзацев. Абзац из "символов". e> M>все дальше поскипано. в тх ж GoF, если мне не изеняет память, описано как надо делать для сложного форатирования и т.п.
e> Там написано не как надо делать, а как можно делать, чтобы избежать больших изжержек.
Мнэээ. Зачем говорить то же, что сказал я, только другими словами?
e> M>Никому не нужно иметь на каждый символ по классу/экземпляру класса.
e> Кому не нужно? Вам не нужно. Ну пожалуйста, я не против. А вот те же авторы GoF пишут, что хотелось бы работать с символами как с объектами, но просто так это сделать не позволяют накладные расходы, поэтому они предлагают использовать flyweight в качестве альтернативы. Цитата, которую я привёл, как раз оттуда.
Здравствуйте, esil, Вы писали:
G>>Нафиг не нужны символы текста как отдельные объекты. Строк достаточно. G>>В таком случае сразу отпадает необходимость использовать flyweight. E>Строк не достаточно. Как быть с таблицами и картинками? С ними хочется обращаться как с символами.
Разны нету, когда мы перестаем пытаться создавать объкты для отдельных символов, то у нас даже необходимость в flyweight отпадает и мы не мучаемся, а спокойно выделяем память для объектов.
E>Вот для форматирования разных символов можно как раз использовать один и тот же объект "аттрибут". И можно попробовать хранить этот атрибут не для каждого символа, а для интервалов. Но тогда придётся это форматирование передавать каждому символу при рисовании, и картинкам/таблицам тоже.
Не думаю что из этого что-то хорошее получится. Во-первых параметры форматирования для разных типов объектов разные, во-вторых разных вариантов форматирования для одного типа может оказаться очень много и использование flyweight ничего не даст.
E>Ну т. е. я так понял, что мы прили к соглашению, что для обоих вариантов ответ одинаковый, и вы считаете, что этот ответ "нет — обращать внимание на издержки, связанные с аллокациец объектов, не стоит".
Ага, я об этом с самом начала писал, при этом мне говорили что GC настолько медленный, что именно с ним надо обращать внимание на выделяемую память.
E>Ну а как же тогда пример с WYSIWYG? Вы считаете, что архитектура с паттерном flyweight ничуть не хуже, чем использование отдельных объектов для символов?
Конкретно в примере с визивигом хуже, потому что там этот паттерн неуместен на самом деле.
Вообще flyweight не так часто применяется как может показаться.
А в чем проблема? Изучи оба, языки схожи, по-моему это не проблема. Другое дело, что шарп по умолчанию тянет за собой NET, на С++ под NET наверное специально не пишут и надо осваивать другие библиотеки.
Так что вопрос не в языках, а в том хвосте, что они тянут
Здравствуйте, snautSH, Вы писали:
M>>В плюсах нуб просто не взлетит шутка конечно но ... SH>тоесть программистом С++ можно только родиться?
нет, но стать хорошим с++-ником гораздо сложнее чем СиШарпникомКопипастником.
Сам пишу на Шарпе в основном (хотя уже сам не пойму на чем...последнее время сишарп и джава в перемешку с плюсами),
до этого писал на плюсах. шарп люблю, но по плюсам скучаю.. вот такой я сентиментальный
p> Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
Фигня, что дотнету уже 8 лет и он пока никуда не собирается исчезать?
Здравствуйте, gandjustas, Вы писали:
G>В это время C++ники все еще воюют с проблемами языка и утечек памяти и пользуются средствами десятилетней давности.
Ты изрядно отстал от жизни.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>В это время C++ники все еще воюют с проблемами языка и утечек памяти и пользуются средствами десятилетней давности. CC>Ты изрядно отстал от жизни.
Погоди. Я так понял, что жизнь в С++ остановилась
Здравствуйте, ppp222, Вы писали:
P>Здравствуйте, Mamut, Вы писали:
p>>> Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
M>>Фигня, что дотнету уже 8 лет и он пока никуда не собирается исчезать?
P>За эти 8 лет вышло три различных дотнета: 1, 2 и 3. Между вторым и третим нет ничего общего, поменялось буквально все.
Не поменялось, а добавилось. Хочешь в 3,5-м дотнете пользоваться WinForms — пользуйся, никто не запрещает.
P>Между первым и вторым различий не так много, но они тоже были. Предполагаю, что 4 дотнет будет доделкой третьего с половиной, после чего выйдет 5 дотнет, который будет кардинально отличаться от третьего, то есть будут преданы анафеме wpf, linq, wcf и так далее. 6 дотнет будет доделкой 5 с половиной, после чего выйдет 7 дотнет, которому сам бог велел кардинально отличаться от пятого дотнета. Предпологаю, что 7 дотнет чем — то будет напоминать первый...
Здравствуйте, ppp222, Вы писали:
P>Здравствуйте, Mamut, Вы писали:
p>>> Что еще плохо в C#, это то, что все дотнетчики зависимы от воли левой пятки MS. MS будет выдумывать новые технологии каждые 5 лет. Соответственно участь дотнетчика — постоянное бессмысленное переучивание, освоение новых, перманентно новых технологий для решения одних и тех же задач.
M>>Фигня, что дотнету уже 8 лет и он пока никуда не собирается исчезать?
P>За эти 8 лет вышло три различных дотнета: 1, 2 и 3. Между вторым и третим нет ничего общего, поменялось буквально все.
Между вторым и третьим не поменялось ничего, добавились библиотеки. Код которй работает под 2 работает и под 3, а иногда и наоборот.
P>Между первым и вторым различий не так много, но они тоже были.
Между первым и вторым различий в разы больше.
P>Предполагаю, что 4 дотнет будет доделкой третьего с половиной, после чего выйдет 5 дотнет, который будет кардинально отличаться от третьего, то есть будут преданы анафеме wpf, linq, wcf и так далее. 6 дотнет будет доделкой 5 с половиной, после чего выйдет 7 дотнет, которому сам бог велел кардинально отличаться от пятого дотнета. Предпологаю, что 7 дотнет чем — то будет напоминать первый...
Не надо бредовые предположения строить. Что будет в четвертом дотнете можете сейчас почитать, уже многократно публиковали роадмапы, изменения CLR, почти все библиотеки, которые войдут в состав FCL спейчас доступны для использования.
Здравствуйте, ppp222, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
P>Сборщик мусора противопоказан С++. Стихия С++ — это эффективный код, где строки — это массив символов, завершающийся нулём, а не вызов библиотечных функций. И не потому, что стандарт С++ какой — то недоразвитый, а потому, что работая таким образом мы получаем прирост производительности от десятков до сотен процентов.
Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. А потом изменением в трех строчках и подключением PFX сделал его распаралеленным.
Здравствуйте, gandjustas, Вы писали:
G>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз.
смешно G>А потом изменением в трех строчках и подключением PFX сделал его распаралеленным.
тут даже не смешно
покажи код товарищ, поправим твой с++
Здравствуйте, ppp222, Вы писали:
P>Здравствуйте, anton_t, Вы писали:
_>>Не поменялось, а добавилось. Хочешь в 3,5-м дотнете пользоваться WinForms — пользуйся, никто не запрещает.
P>Я тебя умоляю, мне — то эти сказочки не рассказывай. Если MS чего решит, то выпьет обязательно, только я к этим шуточкам отношусь крайне отрицательно
Да не надо меня умолять. С чем ты не согласен? С тем, что в 3,5 можно использовать WinForms? Или ещё с чем?
Здравствуйте, gandjustas, Вы писали:
G>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. А потом изменением в трех строчках и подключением PFX сделал его распаралеленным.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. Х>смешно
Ага, я тоже от души поржал когда резщультаты тестов смотрел.
G>>А потом изменением в трех строчках и подключением PFX сделал его распаралеленным. Х>тут даже не смешно Х>покажи код товарищ, поправим твой с++
Не, я теперь будут в КСВ поступать также как остальные. Постить результаты тестов без исходников.
Если есть желание, то можете сам написать код, который находит все аддитивные цепочки для заданного числа.
Подробное описание что это и зачем нужно здесь
Здравствуйте, gandjustas, Вы писали:
G>>>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. Х>>смешно G>Ага, я тоже от души поржал когда резщультаты тестов смотрел.
а потом мы все от души поржем когда кто-нибудь знающий покажет вам результаты F... Fortran'а
зы пишите еще — всегда приятно посмеяться на выходных.
Здравствуйте, SleepyDrago, Вы писали:
SD>Здравствуйте, gandjustas, Вы писали:
G>>>>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. Х>>>смешно G>>Ага, я тоже от души поржал когда резщультаты тестов смотрел.
SD>а потом мы все от души поржем когда кто-нибудь знающий покажет вам результаты F... Fortran'а
Невопрос. Пишите код, задау я привел выше.
Здравствуйте, SleepyDrago, Вы писали:
G>>>>Не далее как вчера написал на F# код, который эффективнее C++-ного варианта в 8 раз. Х>>>смешно G>>Ага, я тоже от души поржал когда резщультаты тестов смотрел.
SD>а потом мы все от души поржем когда кто-нибудь знающий покажет вам результаты F... Fortran'а
А что мы там увидим? Неужто еще больший прирост производительности?
Я думаю, что gandjustas подразумевает, что на F# получается более эффективный код по критерию (лаконичность+читабельность) / производительность.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Да хватит уже кросплатформенностью меряться. Самые кроспалформенные GUI-фреймворки уже давно придуманы это HTML+CSS+Javascript, чуть меньшей кроссплатформенностью обладают Flash и Silverlight. С++ c Qt даже рядом не валялся.
ГВ>Ну, если xML — это путь кроссплатформенных GUI, то чем дальше C++/Qt от них, тем оно лучше.
Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, ollv, Вы писали:
O> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
O>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++?
Ну вообще-то таких абстракций много — в зависимости от того с чем сравнивать.
Здравствуйте, ollv, Вы писали:
ГВ>>Ну, если xML — это путь кроссплатформенных GUI, то чем дальше C++/Qt от них, тем оно лучше. O>Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов.
Вот это ты зря сказал. Ща начнётся мерянье длиной абстракции и диаметром спецификации. (понижая голос) Но в общем и целом (шёпотом) я с этим... Тс-с-с!
O>Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
Честно говоря, XML ведёт по плохому до к слабому янь и сильному инь. Исключение только одно — разметка естественного текста. Для всего остального гораздо лучше подходят S-expressions.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, VladD2, Вы писали:
O>>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++?
C>Ну вообще-то таких абстракций много — в зависимости от того с чем сравнивать.
Можно конкретный пример? Очень интересно, что за абстракцию можно сделать на плюсах которая будет невозможна на Java например?
Здравствуйте, VladD2, Вы писали:
VD>Это абстракция? Это костыль помогающий ходить без одной ноги в условиях когда нет автоматического управления памятью.
Так... Попкорном я уже запасся.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, catBasilio, Вы писали:
B>Здравствуйте, gandjustas, Вы писали:
G>>Вышла новая версия стандарта? Появился сборщик мусора? Код на С++ стал верифицируемым? Появился вывод типов?
B> Однажды я участвовал в одном проекте на С++, в котором использовался самопальный сборщик мусора. Причем он был оченб мощный и умел разруливать циклы и всякие сложные зависимости. Так программа с использованием этого gc жрала память как свинья помои. И довольно много времени приходилось искать объект который держал ссылку. B>Если ты думаешь что в джаве или сишарпе память не может утекать, то ты ОЧЕНЬ заблуждаешься. Там точно также возможны ситуации когда кто-то будет держать объект, из-за этого не будет вызван его деструктор, а из-за этого не будет закрыт ремотный коннекшин ...
Но в Сишарпе так же можно использовать сборщик мусора ручками, если не доверяешь автоматической сборке.
Здравствуйте, VladD2, Вы писали:
VD>Не стоит даже заикаться на счет каких-то там преимуществ С++ в области языковых возможностей и тем более абстракций. Это чушь!
угу, ты ето говоришь года едак с 2002-го, когда C# был настолько убог что даже твой нелюбимый С++ обходил его с головой.
покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект, или ммм... такую "фичу" как множественное наследование, или скажем, статический полиморфизм, слышал о таком?
неиспользуемые объекты будут держаться до заврешения программы.
И попробуй убеди меня что это не утечка памяти. И я очень сомневаюсь gc при вызове "ручками" поймет что это некому не нажный код и удалит его.
P.S. это высосанный из пальца пример, но проблему он показывает вполне.
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Здравствуйте, VladD2, Вы писали: VD>Если уж речь пошла о фичах, то я с удовольствием погляжу на то чем ты заменишь лямбды с замыканиями
лично я заменяю их на императивный цикл for
сейчас уже есть возможность писать в функциональном стиле, да, скачай msvc10 (CTP) и возрадуйся лямбдам (да ещё и с замыканиями!)
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Хвост, Вы писали:
Х>>угу, ты ето говоришь года едак с 2002-го, когда C# был настолько убог что даже твой нелюбимый С++ обходил его с головой.
VD>Начиная со 2-й версии С++ нервно курит в сторонке. VD>А начиная с 2006-го я вообще перешел на Nemerle до которого C# расти еще лет 10, а С++ уже никогда не дорастет.
Если С# так хорош, то почему всякие Crysis, Quake, FarCry и прочее на нем не пишут?
UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Здравствуйте, VladD2, Вы писали: VD>О статическом не слышал. О параметрическом слышал. Можешь открыть новую страницу истории и поведать миру о статическом полиморфизме.
а погуглить? первая ссылка по запросу static polymorphism даёт представление что ето такое и как ето пользовать.
VD>В общем, не стоит так напрягаться. Этому гнилью даже новый стандарт не поможет. Кстати, где он? (с)
ето твоему немерлю ничего не поможет, мертворождённый проект.
Здравствуйте, VladD2, Вы писали:
ГВ>>Так... Попкорном я уже запасся. VD>Тогда давай делись!
Дык!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект
Всю константность в С++ можно с успехом обмануть, кроме того константность не является абстракцией
Х>или ммм... такую "фичу" как множественное наследование
Ага, еще скажи что виртуальный базовый класс — нереальная фича
Х>или скажем, статический полиморфизм, слышал о таком?
Перегрузка методов является одим из видов статического полиморфизма, она есть в C#
Здравствуйте, catBasilio, Вы писали:
VD>>Начиная со 2-й версии С++ нервно курит в сторонке. VD>>А начиная с 2006-го я вообще перешел на Nemerle до которого C# расти еще лет 10, а С++ уже никогда не дорастет.
B>Если С# так хорош, то почему всякие Crysis, Quake, FarCry и прочее на нем не пишут?
Вы еще спросили бы почему на С# драйверы не пишут.
Здравствуйте, gandjustas, Вы писали:
Х>>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект G>Всю константность в С++ можно с успехом обмануть,
не понял к чему было про "обмануть", ето тоже самое что грить C# небезопасен потому что есть ансейф G>кроме того константность не является абстракцией
называй как хочешь, но вот то что такой нужной вещи нет в C# ето просто поразительно.
Х>>или ммм... такую "фичу" как множественное наследование G>Ага, еще скажи что виртуальный базовый класс — нереальная фича
ты начинаешь говорить как заядлый холиварщик, "етого у нас нет потому что можно обойти окольными путями"
Х>>или скажем, статический полиморфизм, слышал о таком? G>Перегрузка методов является одим из видов статического полиморфизма, она есть в C#
перегрузка методов ето скорее ad-hoc полиморфизм, и до статического полиморфизма тут как раком до пекина, а вот статический полиморфизм в с++ ето скорее похоже на утиную типизацию, и заметь ноль оверхеда.
Здравствуйте, gandjustas, Вы писали:
G>Кстати тесты по быстродействию операций выделения-освобождения памяти в с++ и .NET я приводил — C++ сливает. G>И это без умных указателей и прочей лабуды, с ними банальная вещь — работа с памятью — будет еще медленнее.
ты вообще в курсе про стек? наша песня хороша, начинай сначала? подавляющее число аллокаций в с++ происходит на стеке, заруби себе ето на носу, и там твой гц сливает аж не балуй.
Здравствуйте, Хвост, Вы писали:
VD>>Не стоит даже заикаться на счет каких-то там преимуществ С++ в области языковых возможностей и тем более абстракций. Это чушь! Х>угу, ты ето говоришь года едак с 2002-го, когда C# был настолько убог что даже твой нелюбимый С++ обходил его с головой. Х>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект,
Это?
static void Main(string[] args)
{
const string a = "aaa";
Console.WriteLine(foo(a));
Console.ReadKey();
}
static string foo(string a)
{
return a + "bbb";
}
Х>или ммм... такую "фичу" как множественное наследование,
Множественное наследование — моветон, сродни goto. Это ХОРОШО, что его нету, иначе количество граблей, генерируемых индусами возразло бы экспоненциально.
Х>или скажем, статический полиморфизм, слышал о таком?
Он конечно же есть в .NET
Здравствуйте, Хвост, Вы писали:
G>>Кстати тесты по быстродействию операций выделения-освобождения памяти в с++ и .NET я приводил — C++ сливает. G>>И это без умных указателей и прочей лабуды, с ними банальная вещь — работа с памятью — будет еще медленнее. Х>ты вообще в курсе про стек? наша песня хороша, начинай сначала? подавляющее число аллокаций в с++ происходит на стеке, заруби себе ето на носу, и там твой гц сливает аж не балуй.
Да где сливает-то? Покажите бенчмарки, основанные на реальном (желательно production) коде.
Здравствуйте, Хвост, Вы писали:
G>>Если C++ так хорош, то почему на нем не пишут тысячи бизнес-систем? Х>потому что бизнес-логика может писатся хоть на скриптах, всем начхать на оверхед, упирается в базу обычно. То что интерфейс лагает слегка — не имеет ни для кого значения. Обсуждалось уже вроде.
Вам только кажется. Нигде ничего не лагает.
Здравствуйте, gandjustas, Вы писали: G>Почему самые высоконагруженные сайты написаны не на С++?
для сайтов легче купить несколько серверных стоек, чем заплатить программистам на С++ выше рынка, к сайтам скорее требование к масшабированию чем к производительности, хотя в гугле и в яндексе афаик ядро поиска написано на С++, наверное потому что им уже есть резон економить на серверах.
Здравствуйте, Хвост, Вы писали:
G>>Почему самые высоконагруженные сайты написаны не на С++? Х>для сайтов легче купить несколько серверных стоек, чем заплатить программистам на С++ выше рынка, к сайтам скорее требование к масшабированию чем к производительности, хотя в гугле и в яндексе афаик ядро поиска написано на С++, наверное потому что им уже есть резон економить на серверах.
Откуда информация? Дайте ссылку на авторитетный источник.
Здравствуйте, Геннадий Васильев, Вы писали:
Х>>>или ммм... такую "фичу" как множественное наследование, C>>Множественное наследование — моветон, сродни goto. Это ХОРОШО, что его нету, иначе количество граблей, генерируемых индусами возразло бы экспоненциально.
ГВ>Ты уверен, что апелляция к "индусам" в этом контексте выглядит позитивно?
Здравствуйте, criosray, Вы писали:
ГВ>>Ты уверен, что апелляция к "индусам" в этом контексте выглядит позитивно? C>Нет, но зато реалистично. Индусы — вездесущи. ;(
И это является проблемой множественнного наследования? ИМХО, это завихрения текущего контекста, ничего больше. В отличие от goto, который сам по себе ничуть не вреден (вредно запутывание программы хаосом из goto).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, Хвост, Вы писали:
Х>>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект, C>Это? C>
int main(int argc, char* argv[])
{
string fileName = getAppDir();
fileName += "some.file";
someFunc(fileName);
}
void someFunc(const string& fileName)
{
fileName = "wow!"; // тут компилятор ругается, в C# недоступен модификатор const для параметров ф-ции/метода
// поетому оригинальная строка затрётся за милую душу. В С++ всё гуд. В C# - боль и печаль.
}
Х>>или ммм... такую "фичу" как множественное наследование, C>Множественное наследование — моветон, сродни goto. Это ХОРОШО, что его нету, иначе количество граблей, генерируемых индусами возразло бы экспоненциально.
ты как бы взгляни на библиотеки boost/wtl/atl, и покажи мне в каком месте в них множественное наследование является моветоном.
Х>>или скажем, статический полиморфизм, слышал о таком? C>Он конечно же есть в .NET
где?
Здравствуйте, criosray, Вы писали: Х>>ты вообще в курсе про стек? наша песня хороша, начинай сначала? подавляющее число аллокаций в с++ происходит на стеке, заруби себе ето на носу, и там твой гц сливает аж не балуй. C>Да где сливает-то? Покажите бенчмарки, основанные на реальном (желательно production) коде.
ээээ, даже не знаю что сказать как ты представляешь себе бенчмарки продакшн кода в плане аллокация на стеке vs аллокация c gc?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Кстати тесты по быстродействию операций выделения-освобождения памяти в с++ и .NET я приводил — C++ сливает. G>>И это без умных указателей и прочей лабуды, с ними банальная вещь — работа с памятью — будет еще медленнее. Х>ты вообще в курсе про стек? наша песня хороша, начинай сначала? подавляющее число аллокаций в с++ происходит на стеке, заруби себе ето на носу, и там твой гц сливает аж не балуй.
Ну статистику в студию, что где происходит и кто кому сливает.
Я немало писал на С++ чтобы знать где и как выделяется память.
Или местые зубры не используют STL, динамический полиморфизм, паттерны? Все наверное на шаблонах и на стеке.
...В отличие от goto, с которым можно связать некоторую опасность, создающуюся при неумереннном использовании оного.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>P.S.: Но это всё не аргументы. По устоявшейся RSDN-овской традиции Настоящие Весомые Аргументы Против C++ должны содержать слова из такого ряда: фобия, замшелость, стереотип, мемори лик, проход по памяти, миллионы программистов, википедия, тузик, тряпка, рвать, мозг, затычка, косность. Можно даже шпаргалку составить.
Лучше мастер-класс на манер Владимира Кочеткова для начинающих холиварщиков.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, criosray, Вы писали:
C>>Здравствуйте, Хвост, Вы писали:
Х>>>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект, C>>Это? C>>
Х>int main(int argc, char* argv[])
Х>{
Х> string fileName = getAppDir();
Х> fileName += "some.file";
Х> someFunc(fileName);
Х>}
Х>void someFunc(const string& fileName)
Х>{
Х> fileName = "wow!"; // тут компилятор ругается, в C# недоступен модификатор const для параметров ф-ции/метода
Х> // поетому оригинальная строка затрётся за милую душу. В С++ всё гуд. В C# - боль и печаль.
Х>}
Х>
В этом месте все сторонники C# начинают громко смеяться
1)строки в C# иммутабельны, при всем желании ты не затрешь строку, которую использует кто-то другой.
2)присваивание строковой переменной литерального значения приводит только к копированию ссылки, в отличие от C++
Поэтому о правильном поведении кода без const модно даже не задумываться, и работать это будет быстрее C++ного варианта.
Здравствуйте, Хвост, Вы писали:
Х>>>ты вообще в курсе про стек? наша песня хороша, начинай сначала? подавляющее число аллокаций в с++ происходит на стеке, заруби себе ето на носу, и там твой гц сливает аж не балуй. C>>Да где сливает-то? Покажите бенчмарки, основанные на реальном (желательно production) коде. Х>ээээ, даже не знаю что сказать как ты представляешь себе бенчмарки продакшн кода в плане аллокация на стеке vs аллокация c gc?
Так это Вы утверждаете, что сливает... Я ничего не утверждаю, а лишь прошу обосновать Ваши слова реальным кодом, а не синтетическими попугайчиками или, того хуже, Вашими догадками... Всего-то.
Здравствуйте, Хвост, Вы писали:
Х>>>покажи как мне выразить такую простую абстракцию: параметр метода — как ссылка на константный объект, Х>нет, вот ето
Это не ссылка на константный объект, а константная ссылка. В С# их нет и не особо надо. Это не сравнимо со всем многообразием граблей, возникающих в С++ благодаря голой арифметики указателей и ручному управлению памятью.
Х>>>или ммм... такую "фичу" как множественное наследование, C>>Множественное наследование — моветон, сродни goto. Это ХОРОШО, что его нету, иначе количество граблей, генерируемых индусами возразло бы экспоненциально. Х>ты как бы взгляни на библиотеки boost/wtl/atl, и покажи мне в каком месте в них множественное наследование является моветоном.
Библиотеки это вообще очень особая категория. .NET FW гораздо лучше спроектирован, чем boost/atl/wtl, не смотря на отсутствие множественного наследования, т.к. при грамотном дизайне правильнее одиночное наследование и множественная реализация интерфейсов (множественное наследование абстрактных классов в С++).
Х>>>или скажем, статический полиморфизм, слышал о таком? C>>Он конечно же есть в .NET Х>где?
Гугл отменили? http://www.dotnetspark.com/kb/433-polymorphism.aspx
Здравствуйте, criosray, Вы писали: C>Это не ссылка на константный объект, а константная ссылка.
мммм... ддя ссылок имхо монопенисуально, но по аналогии с указателями я привык называть так. C>В С# их нет и не особо надо.
да, конечно, нет в C# значит особо не надо
C>Это не сравнимо со всем многообразием граблей, возникающих в С++ благодаря голой арифметики указателей и ручному управлению памятью.
на дворе 2009 год. Впервые о смартпоинтерах заговорили афаир в 1996, STL стандартизован в 1998. примерно в 2002-2003-м промышленные компиляторы стали хорошо воспринимать стандарт.
Вот примерно с етих времён "голой арифметики указателей и ручному управлению памятью" становится всё меньше и меньше.
C>Библиотеки это вообще очень особая категория. .NET FW гораздо лучше спроектирован, чем boost/atl/wtl, не смотря на отсутствие множественного наследования,
т.к. при грамотном дизайне правильнее одиночное наследование и множественная реализация интерфейсов (множественное наследование абстрактных классов в С++). >>.NET FW гораздо лучше спроектирован
голословно >>т.к. при грамотном дизайне правильнее одиночное наследование и множественная реализация интерфейсов
голословно, можно пример правильного дизайна без множественного наследования и неправильного с множественным? Посмотри так же на CRTP.
Х>>>>или скажем, статический полиморфизм, слышал о таком? C>>>Он конечно же есть в .NET Х>>где? C>Гугл отменили? http://www.dotnetspark.com/kb/433-polymorphism.aspx
спасибо, про перегрузку уже обсудили, если ето единственное что ты видишь в статическом полиморфизме то C# тебя испортил.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ollv, Вы писали:
O>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++?
на каком конкретно? Если языки аля джава или дотнет, или нечто другое из структурных языков, то любой шаблон не привязанный к реальным сущностям является для них недостижимым. дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам).
Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков, но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы. Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так)
констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Anton Batenev, Вы писали:
AB>Здравствуйте, Хвост, Вы писали: Х>> Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA. AB>Я просто не в теме, расскажи, а что значит AAA?
Здравствуйте, ollv, Вы писали:
O>Здравствуйте, VladD2, Вы писали:
VD>>Здравствуйте, ollv, Вы писали:
O>>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++? O> на каком конкретно? Если языки аля джава или дотнет, или нечто другое из структурных языков, то любой шаблон не привязанный к реальным сущностям является для них недостижимым. дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам).
Здравствуйте, Хвост, Вы писали:
Х> AB>Я просто не в теме, расскажи, а что значит AAA? Х> Short answer: Х> High-quality games with high budget.
Не, хотелось бы для саморазвития. Что есть ААА, что есть BBB. В смысле какую-нибудь табличку сравнительную с приблизительными числовыми характеристиками.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, ollv, Вы писали:
G>>>>Да хватит уже кросплатформенностью меряться. Самые кроспалформенные GUI-фреймворки уже давно придуманы это HTML+CSS+Javascript, чуть меньшей кроссплатформенностью обладают Flash и Silverlight. С++ c Qt даже рядом не валялся.
ГВ>>>Ну, если xML — это путь кроссплатформенных GUI, то чем дальше C++/Qt от них, тем оно лучше. O>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. C>Откуда у С++ "высокие абстракции"? Вы явно что-то путаете. Если Вы считаете уличную магию Александресску — высокими абстракциями, то вынужден Вас разочаровать...
Александреску С++ не заканчивается.
C>"Архитектурные решения" на С++ тоже довольно примитивны на фоне управляемых языков. Простейшие примеры: IoC/DI и AoP, из более сложных —
метапрограммирования типа того, что в Nemerle, ну и конечно всякие DSL...
Много всего перечислено, в то время как сравнивать надо нечто одно, с чем-то одним. Толку сравнивать управляемые языки с С++, на котором решаются в основном нативные задачи? Кроме того, на плюсах можно реализовать подобие, те-же кортежи, замыкания все это вполне реализуемо (правда в жесткой типизации)
А вот как вы реализуете алгоритмику с поздним связыванием на немерле? Когда последовательность выполняемых методов их овнеров и непосредственно выполнение разнесены во времени? Задайте на немерле список выполняемых задач с поздним биндингом как параметров, так и классов с возможностью отмаршалиться в процессе выполнения на заданный сред? Да еще и с использованием кома, да еще и без поддержки диспатч, а потом, все это напрямую дернуть из менеджед кода Или лямбда исчисление перевешивает ? — очень сильно сомневаюсь.
C>C++ выигрывает там, где требуется детерменированное освобождение памяти и низкоуровневые оптимизации, но за это приходится платить сложностью разработки и сопровождения, а соответственно и ценой.
) маловато , мне как-то даже влом перечислять. Почти все теже жава проекты тянут за собой толпу плюсовых прослоек к системе, для разных нужд, не говоря о ключевых ресурсоемких вычислениях.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Anton Batenev, Вы писали:
Х>> AB>Я просто не в теме, расскажи, а что значит AAA? Х>> Short answer: Х>> High-quality games with high budget.
AB>Не, хотелось бы для саморазвития. Что есть ААА, что есть BBB. В смысле какую-нибудь табличку сравнительную с приблизительными числовыми характеристиками.
такой не видел и скорее такого не существует, т.к. AAA ето скорее собирательное название для "высококлассных игр с большим бюджетом", если больщой бюджет ещё можно как-то формализовать, то "высококлассный" врятли. Про "BBB" игры не слышал, разве что в качестве метафоры.
Здравствуйте, gandjustas, Вы писали:
Х>>дык потому что мало C++ программистов, дорого они стоят, а бизнес-систем много. и поддерживать их будут программеры "на местах", а им лучше язык попроще дать, без острых углов. G>Судя по форуму — совсем немало.
тем и примечателен (для меня по крайней мере), но ето форум. G>А судя по вакансиям хорошему программисту на шарпе платят больше, чем хорошему программисту на С++.
судя по вакансиям слабо коррелирует с языком, гораздо значительней с опытом работы.
G>Я отлично знаю что такое движок, даже сам писал что-то подобное, и даже дописал. А потом понял что херней занимался долго время.
ну чтож так сразу херней, експириенс то получил, и то хорошо.
Х>>Halo 3 вообще никаким боком к XNA не касается, что и не удивительно для игры класса AAA. G>Да ну. И на чем ты напишешь игру для XBox 360?
я врятли напишу, но будь моя воля то движок ессно куцый C++/Direct3D
Здравствуйте, gandjustas, Вы писали:
G>В этом месте все сторонники C# начинают громко смеяться G>1)строки в C# иммутабельны, при всем желании ты не затрешь строку, которую использует кто-то другой. G>2)присваивание строковой переменной литерального значения приводит только к копированию ссылки, в отличие от C++
G>Поэтому о правильном поведении кода без const модно даже не задумываться, и работать это будет быстрее C++ного варианта.
пойнт был не в строках а в константности объектов, замени строку на экземпляр своего класса и разрыдайся вместе со сторонниками C#
Здравствуйте, ollv, Вы писали:
O>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, ollv, Вы писали:
O>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках
O>>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>>А вот наоборот — редко бывает. O> пустые слова, шарп расхолаживает
Чего расхолаживает?
O>>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает. O> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом,
А в чем? Зачем скобки переопределять надо?
O>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно.
Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь?
O>а при писанине на дотнете после плюсов всегда чувствуешь тормоза, и ограниченность,
Особенно тормоза
O>т.к. хочется сделать красиво, а не можется
Красиво это как? Нафигачить шаблоков?
И как на плюсах сделать красиво IoC-контейнер?
G>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O> возможность перегружать это от бедности?
Нет, примерение этой возможности — от бедности.
В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу.
O>>>Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так) G>>Какой гибкой архитектуры? C++ не умеет интеропать ни с какими другими языками, даже при интеропе с другой либой на С++ могут возникнуть проблемы. O> ему это и не надо, а для предоставления интерфейса наверх и предоставлен менеджед С++, и ком
Менеджед С++ вам не поможет, он интеропа между дувумя бинарями не добавляет.
COM это хорошо, но мееедлеееенно в случае outproc и небезопасно в случае inproc. Вот тебе и дилемма, выход из которой — managed код.
O>>>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее G>>За последние 5 лет какое развитие было? O> фреймворки ж)
Мы про язык\стандартную библиотеку.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>В этом месте все сторонники C# начинают громко смеяться G>>1)строки в C# иммутабельны, при всем желании ты не затрешь строку, которую использует кто-то другой. G>>2)присваивание строковой переменной литерального значения приводит только к копированию ссылки, в отличие от C++
G>>Поэтому о правильном поведении кода без const модно даже не задумываться, и работать это будет быстрее C++ного варианта. Х>пойнт был не в строках а в константности объектов, замени строку на экземпляр своего класса и разрыдайся вместе со сторонниками C#
Тоже ничего не произойдет, поменяется ссылка внутри метода.
Будет плохо если лезть в поля объекта, но так мало кто делает, потому что можно вернуть новый объект из метода и не заботиться о его времени жизни. В C++ так нельзя.
Здравствуйте, Sorantis, Вы писали:
S>Здравствуйте, ollv, Вы писали:
O>>Здравствуйте, VladD2, Вы писали:
VD>>>Здравствуйте, ollv, Вы писали:
O>>>> Ну так и есть и ксамл WPF это хорошо иллюстрирует, и плюсам тянуться за гуями, мне кажется, вообще не стоит, за плюсами мегапреимущество в архитектурных и скоростных решениях, за счет высоких абстракций и шаблонов. Гуя же так ил иначе перекочует в XML подобное оформление, кстати при современных фреймворках с парсингом XML тандем его с плюсами мне кажется вполне приемлемым, даже удобным.
VD>>>Можно пример высокоуровневой абстракции которую нельзя воспроизвести на языке отличном от С++? O>> на каком конкретно? Если языки аля джава или дотнет, или нечто другое из структурных языков, то любой шаблон не привязанный к реальным сущностям является для них недостижимым. дженерики дотнета и не дорастут, а в джаве на сколько я знаю, темплейты так же весьма ограничены (по известным причинам).
S>Generic Covariance and Contra-Variance in C# 4.0
т.е. ві хотите сказать, что єти дженерики дают возможность писануть
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали: G>>Читать больше надо. От константности отказались как раз в силу сложности обеспечения честной константности. Х>а теперь расскажи мне, в чём сложность обеспечения четной константности, если даже C++ ето отлавливает на етапе компиляции?
На этапе компиляции как раз проще всего это сделать. Гарантировать на этапе выполнения константность всего объекта сложно и затратно.
Х>если в с++ запретить касты, разрушающие константность то окромя прямой работы с памятью возможностей изменить константный объект нет, почему же весь такой сейфанутый C# не одолел модификатор const?
Видимо потому что .NET не до конца safe из-за того что работает в unsafe окружении решили не обманывать народ с нечестной константностью.
А вообще const — не самое важно что может быть в язке, иммутабельность гораздо круе в этом плане.
Здравствуйте, gandjustas, Вы писали:
Х>>пойнт был не в строках а в константности объектов, замени строку на экземпляр своего класса и разрыдайся вместе со сторонниками C# G>Тоже ничего не произойдет, поменяется ссылка внутри метода. G>Будет плохо если лезть в поля объекта, но так мало кто делает, потому что можно вернуть новый объект из метода и не заботиться о его времени жизни. В C++ так нельзя.
Можно, но так не любят делать, чтобы не связываться с дополнительным оверхедом по быстродействию.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>Никаких средств разрабтки без XNA не нашел.
Неудивительно. Просто так с куста никто тебе девелопить ничего серьезного не даст.
XBOX Devkit и SDK выдаются тока по договору с МС.
G>Видится мне что на XBox игры только на XNA, а соовественно .NET\C#
Неправильно видится.
G>Игр таких много — http://ru.wikipedia.org/wiki/Список_игр_на_Xbox_360
Неужто ты и вправду думаешь, что кто то будет переписывать на ХНЮ такие С++ игры как Bioshock, Assassin's Creed, COD, TES, FEAR и т.п.?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, romangr, Вы писали:
R>Здравствуйте, catBasilio, Вы писали: B>>неиспользуемые объекты будут держаться до заврешения программы. B>>И попробуй убеди меня что это не утечка памяти. И я очень сомневаюсь gc при вызове "ручками" поймет что это некому не нажный код и удалит его. B>>P.S. это высосанный из пальца пример, но проблему он показывает вполне.
R>Этот высосанный из пальца пример показывает, что ты не знаешь ни c#, ни то как работает gc.
Я, кстати, проверил только что. Есть приложение на WPF, вбил следующий Main:
public static void Main()
{
var d = new Test[1000000];
for (int i = 0; i < d.Length; i++)
{
d[i] = new Test();
}
d[23].F = 23;
d[230].F = 23;
MyApplication app = new MyApplication();
app.Run();
}
Test — простой класс с двумя-тремя свойствами, который в финализаторе показывает MessageBox.
Запустил в debug — массив жил на протяжении работы приложения.
Запустил в release, но из под Студии — массив жил на протяжении работы приложения.
Запустил в release просто из Проводника — объекты массива d начали собираться GC еще на этапе загрузки главного окна приложения.
Здравствуйте, MxKazan, Вы писали:
MK>Запустил в debug — массив жил на протяжении работы приложения. MK>Запустил в release, но из под Студии — массив жил на протяжении работы приложения. MK>Запустил в release просто из Проводника — объекты массива d начали собираться GC еще на этапе загрузки главного окна приложения.
При подключении дебагера время жизни локальных переменных продляется до конца блока.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
Х>>>пойнт был не в строках а в константности объектов, замени строку на экземпляр своего класса и разрыдайся вместе со сторонниками C# G>>Тоже ничего не произойдет, поменяется ссылка внутри метода. G>>Будет плохо если лезть в поля объекта, но так мало кто делает, потому что можно вернуть новый объект из метода и не заботиться о его времени жизни. В C++ так нельзя.
ГВ>Можно, но так не любят делать, чтобы не связываться с дополнительным оверхедом по быстродействию.
Здравствуйте, Геннадий Васильев, Вы писали:
O>>>т.к. хочется сделать красиво, а не можется G>>Красиво это как? Нафигачить шаблоков? G>>И как на плюсах сделать красиво IoC-контейнер? ГВ>Какой именно? В смысле — под какое использование?
Например как MSовский Unity.
G>>>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O>>> возможность перегружать это от бедности? G>>Нет, примерение этой возможности — от бедности. G>>В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу.
ГВ>Значит, если отсутствующую фичу реализовали средствами языка — это, типа, недостаток языка. Ясен пень — язык будет плох до тех пор, пока в него не будет прямо включено всё-всё известное на данный момент во всех доступных комбинациях. А то не ровён час — библиотеку писать придётся. Логика жжот напалмом! Сила слова, да.
C# развивающийся язык, за 5 лет в него включили столько фич, сколько С++ не снилось за всю историю существования. И при этом C# не превратился в помойку.
В С++ развивать языковые средства можно, но очень осторожно, новый стандарт это показывает. Кстати, когда очередной раз планируется его принятие?
G>>COM это хорошо, но мееедлеееенно в случае outproc и небезопасно в случае inproc. Вот тебе и дилемма, выход из которой — managed код. ГВ>Какая ещё дилемма? C++ плохо интеропится с C++-ными либами при несогласованном ABI. Проблема и понятна, и решена в большей или меньшей степени. Через старый добрый C-интерфейс он прекрасно связывается с чем угодно.
Угу, и вся "мощь абстракций" упрется в вызовы GetSomeHandle в итоге. Потрясающий язык.
ГВ>Кстати, а две виртуальных машины .Net (в смысле — два активных экземпляра .Net FW) разных версий свяжутся друг с другом "естественным" порядком? Или тоже с бубном и интеропом поплясать надо?
Сейчас два СДК разных версий не уживаются в одном процессе, то есть нельзя запустить сборку с FW1.1 в процессе FW2.0, но такое очень редко случается. Разные версии FW хорошо совместимы по исходному коду и пересобрать под второй фреймворк (и 3.0 и 3.5) не представляет проблем.
Следующая версия CLR будет нормально работать в одном процессе с предыдущими.
ГВ>А .Net с Java естественно стыкуются?
только интероп через C или средства межпроцессного взаимодействия.
Здравствуйте, gandjustas, Вы писали:
G>>>Будет плохо если лезть в поля объекта, но так мало кто делает, потому что можно вернуть новый объект из метода и не заботиться о его времени жизни. В C++ так нельзя.
ГВ>>Можно, но так не любят делать, чтобы не связываться с дополнительным оверхедом по быстродействию.
G>
G>Это в языке, который не имеет оверхедов (с)
Никто не утверждал, что на C++ бесконечный цикл исполняется за 0 секунд.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>Да вот в этот раз нет. Именно по замерам времени выполнения код на F# оказался быстрее C++_ного варианта в 8 раз.
G>Правда никто мегаоптимизацией на С++ не занимался. G>Вот и хочется увидеть вариант решения задачи на С++ от крутых перцев из КСВ.
видимо крутые перцы из КСВ заняты
я тут мимо прохожу раз в N дней, от того и лаги.
Судя по цифрам тот код на плюсах что у вас есть ничего не стоит — так что
обрежьте лишнее, и кидайте на публичный ресурс а ссылку в ответ.
Когда меня чужие баги задалбывают я для отдыха гоняю профайлер — так что если алгоритмы примерно похожи выгребание ошибок первого порядка позволит С++ "не ударить в грязь лицом".
зы. сделайте тестовый набор данных, эталон. Длина запуска не больше 5 минут на типовом железе. Мне вот может придется винду поставить ради этого — так что если будет совсем грустно то могу и забить.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
O>>>>>т.к. хочется сделать красиво, а не можется G>>>>Красиво это как? Нафигачить шаблоков? G>>>>И как на плюсах сделать красиво IoC-контейнер? ГВ>>>Какой именно? В смысле — под какое использование? G>>Например как MSовский Unity.
ГВ>OK, теперь давай выясним, что такое "красиво". Желательный интерфейс набросаешь кратенько?
Угу. Есть метод Register, который заносит в контейнер пару (тип интерфейса, тип реализации), и метод Resolve, который по заданному типу интерфейса выдает объект нужного типа реализации.
Когда получится можно сделать так чтобы если тип реализации имеет конструктор с параметрами, то при создании объекта в параметры конструктора подсчтавлялись бы объекты полученные через Resolve.
ГВ>>>Значит, если отсутствующую фичу реализовали средствами языка — это, типа, недостаток языка. Ясен пень — язык будет плох до тех пор, пока в него не будет прямо включено всё-всё известное на данный момент во всех доступных комбинациях. А то не ровён час — библиотеку писать придётся. Логика жжот напалмом! Сила слова, да. G>>C# развивающийся язык, за 5 лет в него включили столько фич, сколько С++ не снилось за всю историю существования. И при этом C# не превратился в помойку. ГВ>И как это опровергает сказанное мной? Что если фича реализована средствами языка — это не недостаток самого языка?
Если фича востребована, а реализация делается через непонятно что. причем за много лет в самом языке это не было исправлено, то это однозначно свидетельствует о недостатке языка.
ГВ>>>Кстати, а две виртуальных машины .Net (в смысле — два активных экземпляра .Net FW) разных версий свяжутся друг с другом "естественным" порядком? Или тоже с бубном и интеропом поплясать надо? G>>Сейчас два СДК разных версий не уживаются в одном процессе, то есть нельзя запустить сборку с FW1.1 в процессе FW2.0, но такое очень редко случается. Разные версии FW хорошо совместимы по исходному коду и пересобрать под второй фреймворк (и 3.0 и 3.5) не представляет проблем. G>>Следующая версия CLR будет нормально работать в одном процессе с предыдущими. ГВ>>>А .Net с Java естественно стыкуются? G>>только интероп через C или средства межпроцессного взаимодействия.
ГВ>Вопросы были риторическими. Иными словами, на самом деле проблем с совместимостью и интероперабельностью хватает у всех, так что выпячивать аналогичные недостатки C++ как некие особенные тут нет никакого смысла.
На самом деле проблем нету, потому что все описанное является только потенциальными проблемами и очень редко встречается в жизни. Тогда как интероп между C++_ными библиотеками встречается часто.
Здравствуйте, SleepyDrago, Вы писали:
SD>Здравствуйте, gandjustas, Вы писали:
G>>Да вот в этот раз нет. Именно по замерам времени выполнения код на F# оказался быстрее C++_ного варианта в 8 раз.
G>>Правда никто мегаоптимизацией на С++ не занимался. G>>Вот и хочется увидеть вариант решения задачи на С++ от крутых перцев из КСВ. SD>видимо крутые перцы из КСВ заняты
За то время, котороекрутые перцы потратили на постинг булшита могли бы уже такую простую программку написать.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, ollv, Вы писали:
O>>Здравствуйте, gandjustas, Вы писали:
G>>>Здравствуйте, ollv, Вы писали:
O>>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>>>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках
ну посмейся, может в процессе придет понимание того, что в с++ есть возможность сделать то, чего нет в других языках, и есть возможность сделать подобие того, чего в нем изначально не было, и есть в других. И это при том, что в нем можно работать как в менеджед, так и в анменеджед, Сравнивать же менеджед и анменеджед — изначально бредово, т.к. если идет сравнение возможностей, то последние молчат при необходимости работы с МАПИ и библиотеками с ансаппортным диспатч и т.д.
O>>>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>>>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>>>А вот наоборот — редко бывает. O>> пустые слова, шарп расхолаживает G>Чего расхолаживает?
Ощущение , что попал в песочницу с необходимостью постоянно в случае невозможности рыть совочком, прыгать опять за забор или через импорт апишных методов, или чз написание дополнительных утилзов на сях
O>>>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>>>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает. O>> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом, G>А в чем? Зачем скобки переопределять надо?
ты изначально поставил глупый вопрос, нафига в нете делегаты, что методов мало ?
O>>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. G>Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь?
А ты подумай немного, ..как реализовывать late fastening в дотнете ? Когда конструирование аргументов, владельцев методов, и создание каскада вызовов разведено во времени? — никак. а через поздний биндинг это решается.
O>>а при писанине на дотнете после плюсов всегда чувствуешь тормоза, и ограниченность, G> G>Особенно тормоза
O>>т.к. хочется сделать красиво, а не можется G>Красиво это как? Нафигачить шаблоков? G>И как на плюсах сделать красиво IoC-контейнер?
да запросто, причем реализовывается с ограничение депенденси, при превышении даже собираться не будет
G>>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O>> возможность перегружать это от бедности? G>Нет, примерение этой возможности — от бедности. G>В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу.
ах в бууст даже запятую перегрузили .. ты меня реально утомил. Плюсы на столько гибкий язык, что позволяет имлементить реализации модифицирующие синтаксис, да еще и чик __asm и ты уже там . А тебя это раздражает Да
O>>>>Впрочем практика показывает, базовый функционал крупных проектов требующих гибкой архитектуры реализуется чаще на плюсах (во всяком случае в моей практике это именно так) G>>>Какой гибкой архитектуры? C++ не умеет интеропать ни с какими другими языками, даже при интеропе с другой либой на С++ могут возникнуть проблемы. O>> ему это и не надо, а для предоставления интерфейса наверх и предоставлен менеджед С++, и ком G>Менеджед С++ вам не поможет, он интеропа между дувумя бинарями не добавляет. G>COM это хорошо, но мееедлеееенно в случае outproc и небезопасно в случае inproc. Вот тебе и дилемма, выход из которой — managed код.
Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си.
O>>>>констрейны дают возможность предопределить поведение при компиляции. Да и еще, плюсы то развиваются, стандарт постоянно дополняется новыми фичами расширяюшими возможности, typeof это не последнее G>>>За последние 5 лет какое развитие было? O>> фреймворки ж) G>Мы про язык\стандартную библиотеку.
опять за рыбу деньги, — фреймворк внесенный в стандарт становится частью языка. Просто понимаешь какая штука, за время своего существования плюсы стали академическим языком, просто так внести новый фреймворк, не так просто нужно доказать, что в этом есть необходимость.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, gandjustas, Вы писали:
G>>>Правда никто мегаоптимизацией на С++ не занимался. G>>>Вот и хочется увидеть вариант решения задачи на С++ от крутых перцев из КСВ. SD>>видимо крутые перцы из КСВ заняты G>За то время, котороекрутые перцы потратили на постинг булшита могли бы уже такую простую программку написать.
если не интересно здесь кидайте к себе в блог. Ссылки на идею алгоритма недостаточно для того чтобы сдвинуть с места ленивого человека
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил.
Удачи. Учти что ни одной толковой реализации IoC-контейнера на C++ с конфигурированием в рантайме нету.
Я видел только решения с precompile-time кодогенерацией.
ГВ>>>И как это опровергает сказанное мной? Что если фича реализована средствами языка — это не недостаток самого языка? G>>Если фича востребована, а реализация делается через непонятно что. причем за много лет в самом языке это не было исправлено, то это однозначно свидетельствует о недостатке языка. ГВ>В лучшем случае, это свидетельствует о недостатках процесса управления разработкой языка.
Наличие надостатков в управлении разработкой веде к недостаткам в самом языке.
ГВ>Мало ли какие фичи могут оказаться востребованными?
Есть другие языки, достаточно смотреть по сторонам и думать головой.
Кстати разработчики C# сейчас демонстрируют обратный паттерн поведения, и мне реально иногда становится страшно за будущее шарпа.
ГВ>>>Вопросы были риторическими. Иными словами, на самом деле проблем с совместимостью и интероперабельностью хватает у всех, так что выпячивать аналогичные недостатки C++ как некие особенные тут нет никакого смысла. G>>На самом деле проблем нету, потому что все описанное является только потенциальными проблемами и очень редко встречается в жизни. Тогда как интероп между C++_ными библиотеками встречается часто.
ГВ>Как ни странно, но даже это вполне объяснимо количеством производителей компиляторов. В отличие от той же Java и тем более — от .Net. Кстати, заморочки с переносом кода между .Net и Mono, AFAIK, имеют место быть.
Не имеют, надо только уметь готовить.
Специально поставил второй моно, написал на нем Winforms прогу, не используя mono-scecific библиотеки, и она запустилась под .NET без перекомпиляции.
Если хочется переносимости — надо использовать переносимое подмножество библиотек, это аксиома для любого языка.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, ollv, Вы писали:
O>>Здравствуйте, gandjustas, Вы писали:
G>>>Здравствуйте, ollv, Вы писали:
O>>>>Здравствуйте, gandjustas, Вы писали:
G>>>>>Здравствуйте, ollv, Вы писали:
O>>>>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>>>>>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках O>> ну посмейся, может в процессе придет понимание того, что в с++ есть возможность сделать то, чего нет в других языках, и есть возможность сделать подобие того, чего в нем изначально не было, и есть в других. G>Ну тогда в студию GC, с такими же performance характеристиками, как в managed.
нахрен он нужен если есть шаред птр? чтобы морочить себе голову вызовом принудительной сборки для попытки освободить ресурс в прогнозируемое время
O>>И это при том, что в нем можно работать как в менеджед, так и в анменеджед, G>Это не является преимуществом. G>У unmanaged вообще говоря достаточно мало преимуществ.
ты совсем ляпнулся или как ? Код по работе из менеджед с МАПИ? (даже не пытайся, по твоим суждения видно что ты не доганяешь принципиальной разницы диспатч саппортинга )
O>>Сравнивать же менеджед и анменеджед — изначально бредово, т.к. если идет сравнение возможностей, то последние молчат при необходимости работы с МАПИ и библиотеками с ансаппортным диспатч и т.д. G>.NET умеет работать с COM.
: насмешил мои тапочки очередной раз ..ну подними IUnknown
O>>>>>>но вообще метапрограммирование видоизменяет плюсы, а говорить, что это все можно реализовать в джава или дотнете — просто не знать плюсы G>>>>>Рассказываю тайны, большенство программистов на C# достаточно долго программили на плюсах и отлично его знают. G>>>>>А вот наоборот — редко бывает. O>>>> пустые слова, шарп расхолаживает G>>>Чего расхолаживает? O>> Ощущение , что попал в песочницу с необходимостью постоянно в случае невозможности рыть совочком, прыгать опять за забор или через импорт апишных методов, или чз написание дополнительных утилзов на сях G>Ты неверное в другом мире живешь. G>Сколько я проектов сделал на .NET необходимость в вызовах нативных методов возникала раза два. G>Неверное это от твоего незнания библиотеки.
Ха, какой библиотеки если есть области для которых менеджед код не имеет библиотек, МАПИ — это лишь одна — совсем малая из них. Ты что до сих пор не понял, роль менеджед Си?
O>>>>>>Даже простейший вызов из темплейтного метода непредопределенного класса с оператором () — уже недостижимая мечта для шарпа или жавы. G>>>>>Включай моз, для чего нужно переопределение скобок? Чтобы объект вел себя как функция, а это значит что возможностей функций не хватает. O>>>> Преопределение скобок — это лишь перегрузка одного из операторов, и все, а то, что это получило свое развитие это отдельная история, но основа опять таки не в этом, G>>>А в чем? Зачем скобки переопределять надо? O>> ты изначально поставил глупый вопрос, нафига в нете делегаты, что методов мало ? G>Делегаты можно считать навороченным "указателем на функцию", так как в .NET сам методы не являются FCO. G>А в C++ не было ни делегатов и ФВП, были только указатели на функцию, которые как и все указатели наделены родовыми травмами. G>Перегрузка скобок дает возможность делать что-то издалека похоже на делегаты .NET или ФВП, в остальном такая перегрузка нафиг не нужна.
Да нифига, си благодаря своей гибкости () позволяет реализовать то, что есть в других языках без изменения самого Си , функторы появились зодолго до делегатов, — , которые в принципе ничем не отличаются от указателя на функцию, кроме оверкодинга в декларации.
идиома mem_fun и bind это гораздо более широкое понятие, чем делегаты именно благодаря позднему связыванию, когда
декларации вида:
с возможностью биндить как аргументы, так и владельцев, так и чуваков как ты, для обучения тому, что сранивать языки менеджед и анменеджед — глупо, только потому, что у каждого своя роль и преимущество. Что надо писать на лиспе, что-то на прологе,
К примеру анменеджед нельз использовать в том-же ком+. Так чтобы подвеситься на события некоего приложения ханделером через ком+ надо юзать менеджед. А чтобы дергать ком без поддержки диспатч надо юзать анменеджед. Только вот если говорить о синтаксисе, конечно каждый сам себе хозяин — но лично мне ближе плюсы.
O>>>>биндинг в плюсах покрывает делегаты, а вот обратного нет, т.к. теже функторы это лишь одно из множества, и не потому, что не хватает, а потому, что еще и так можно. G>>>Это о чем? Какие делегаты, биндинг, функторы? Вывалил все умные словка, которые знаешь? O>> А ты подумай немного, ..как реализовывать late fastening в дотнете ? Когда конструирование аргументов, владельцев методов, и создание каскада вызовов разведено во времени? — никак. а через поздний биндинг это решается. G>Ты вывалил все оставшиеся слова, которые знаешь? Покажи пример кода на С++.
тебе какой? иди бусты ревьювь, там каждый второй шаг — недостижимая мечта для менеджед языков.
да прочти констрейны для задачи поведения при сборке хотя бы, я там выше пример привел — такое на шарпе и еже с ним не изобразить. И замечу, к слову о абстракции на момент имплемента класса, параметр шаблона чистая абстракция, и вызовы от него в том числе, в отличие от шарпа, где надо указывать кто должен быть чем
O>>>>т.к. хочется сделать красиво, а не можется G>>>Красиво это как? Нафигачить шаблоков? G>>>И как на плюсах сделать красиво IoC-контейнер? O>> да запросто, причем реализовывается с ограничение депенденси, при превышении даже собираться не будет G>Ну код в студию.
денег давай будет — а пока можешь уже готовые решения посмотреть , а они есть ..
G>>>>>Такие выкрутасы с перегрузкой от бедности языка, а обилиле подобных "фич" только повышают возможность создать нифига нечитаемый код. O>>>> возможность перегружать это от бедности? G>>>Нет, примерение этой возможности — от бедности. G>>>В Boost даже зяпятую перегрузили потому что инициализаторов коллейкций не было. В C# таки догоадались включить эту фичу. O>> ах в бууст даже запятую перегрузили .. ты меня реально утомил. Плюсы на столько гибкий язык, что позволяет имлементить реализации модифицирующие синтаксис, да еще и чик __asm и ты уже там . А тебя это раздражает Да G>Если каждый начнет "имплементить реализации" (шибанутое словосочетание) модифицирющие синтаксис, то будет попа. Код станет абсолютно нечитаемым.
на этой попе, простите, сидит весь NET
O>> Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си. G>Это ты сам себе придумал? Из C# отлично дергаются нативные методы, да нужны они очень редко, а работа с комом происходит гораздо проще.
Опять смешишь тапочки, ? создай в шарпе натив экземпляр и вызови от него метод.
G>>>>>За последние 5 лет какое развитие было? O>>>> фреймворки ж) G>>>Мы про язык\стандартную библиотеку. O>> опять за рыбу деньги, — фреймворк внесенный в стандарт становится частью языка. Просто понимаешь какая штука, за время своего существования плюсы стали академическим языком, просто так внести новый фреймворк, не так просто нужно доказать, что в этом есть необходимость. G>Не отмазывайся.
Это не отмазка, изучи историю написания MFC-шных листов и прочего, почему это делалось ? До того как шел в использование стл, после появления стл необходимость в этих листах отпала. Что же касается нета, то там все иначе, пока корпорация не разродится на патч все дышут веником.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, kochetkov.vladimir, Вы писали: MK>>Сначала Дворкин меня задалбывал этим предсказаниями чего там будет через 10-20 лет, теперь вот ты
KV>Не-не-не, он в конце-концов сдался и написал, что "конца С# не будет и никуда он не денется" Re: Сишарпкапец наступает
А какие проблемы ... даже если он изчезнет. Многие С# программисты с удовольствием с ним попрощаются если будет предложено что-то еще более эффективное. К ЯП понятие верность "неуместно". Только вот к тому времени на С++ будут еще меньше писать.
Вобще-то новинки вводят для того чтобы производительность труда программистов повысить. Не хочется не изучай. И вобще-то в C# (как языке) все новинки которые были — совсем мизерные в плане их изучения (2-3 дня) но не по полезности мизерные. Так что ворчать по поводу изменений стандарта С# вобще неуместно. ... Если меняются библиотеки это уже другое дело...
Здравствуйте, gandjustas, Вы писали:
В общем то резюм я понял, твоя стратегия проста — все что преимущество (я даже преимуществом это не назову потому, что для каждой платформы свои задачи) С++ — для нета не нужно. Читай между строк.
G>Здравствуйте, ollv, Вы писали:
G>шаред птр — дополнительные тормоза на каждой операции присваивания и каждом выходе из блока. .NETовский GC порвет релизацию работы с динмамической памятью на shared_ptr как тузик грелку.
весьма самоуверенное и между тем необъективное заявление. Достаточно для проверки провести небольшой тест, создаем определенное количество объектов, в си, и дот нете, и считаем время какое ушло на создание — очистку ссылок. Ок Там и посмотри что тузик, а что грелка ..
O>>>>И это при том, что в нем можно работать как в менеджед, так и в анменеджед, G>>>Это нты е является преимуществом. G>>>У unmanaged вообще говоря достаточно мало преимуществ. O>>ты совсем ляпнулся или как ? Код по работе из менеджед с МАПИ? (даже не пытайся, по твоим суждения видно что ты не доганяешь принципиальной разницы диспатч саппортинга ) G>А нахрен он нужен в .NET?
Знаешь на скольких проектах хотели бы считать так-же как и ты? И не только про мапи, а про весь ком без поддержки диспатча (т.е. те ком объекты которые в принципе не могут использоваться в нете, уже бы пора тебе заметить мой намек)
G>То что ты считаеь крутостью является на самом деле ненужной шелухой. да хватит, я уже понял. Ну не беда, это сейчас, пару раз столкнешься с необходмостью эту "шелуху" просаппортить в нет, и понимание придет.
G>Да нахрен не нужен MAPI, .NET и без него почту слать умеет.
Это какую если не секрет
O>>
//именно по этому тебе бесполезно , чтото говорить, бо суть того о чем тебе говорят вот уже который пост, ты элементарно не доганяешь
G>
O>>с возможностью биндить как аргументы, так и владельцев G>А в чем крутость если тоже самое достигается передачей объекта как параметра?
Я же говорю нет — расхолаживает
G>Зачем тебе денег? Все контейнеры бесплатные. Нормальных решений для С++ нету. G>Слив засчитан.
Согласен, согласен, только вот критерий нормальности у нас вряд ли с тобой совпадают.
G>>>Если каждый начнет "имплементить реализации" (шибанутое словосочетание) модифицирющие синтаксис, то будет попа. Код станет абсолютно нечитаемым. O>> на этой попе, простите, сидит весь NET G>Примеры покажешь как весь .NET сидит на модификации синтаксиса?
Как только ты покажешь мне возможность работы с комом без диспатч, так и сразу
O>>>> Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си. G>>>Это ты сам себе придумал? Из C# отлично дергаются нативные методы, да нужны они очень редко, а работа с комом происходит гораздо проще. O>>Опять смешишь тапочки, ? создай в шарпе натив экземпляр и вызови от него метод. G>Натив экземпляр чего?
экземпляр анменеджед объекта, — еще одну (хоть какую-то, кривую, не кривую, любую иллюстрацию)
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, gandjustas, Вы писали:
ГВ>>>>И как это опровергает сказанное мной? Что если фича реализована средствами языка — это не недостаток самого языка? G>>>Если фича востребована, а реализация делается через непонятно что. причем за много лет в самом языке это не было исправлено, то это однозначно свидетельствует о недостатке языка. ГВ>>В лучшем случае, это свидетельствует о недостатках процесса управления разработкой языка. G>Наличие надостатков в управлении разработкой веде к недостаткам в самом языке.
А ещё это может свидетельствовать о неправильном применении языка, о чрезмерной концентрации на Syntax Sugar и ещё много о чём, вплоть до недостатков, присущих правительству Шарля Де Голля. Тут вопрос в другом: удалось реализовать фичу X средствами самого языка ("понятно какими" или "непонятно какими" — совершенно не важно) или нет. Если не удалось — значит возможностей языка для этой фичи не хватает. Если удалось, то относить сей факт к "недостаткам" можно, ИМХО, только по каким-то очень вычурным соображениям вроде очередного "миллиона индусов, которые завалят нас багами".
ГВ>>Мало ли какие фичи могут оказаться востребованными? G>Есть другие языки, достаточно смотреть по сторонам и думать головой. G>Кстати разработчики C# сейчас демонстрируют обратный паттерн поведения, и мне реально иногда становится страшно за будущее шарпа.
Дык! Об этом заговорили аккурат в том же 2002-м, если мне не изменяет память.
ГВ>>Кстати, заморочки с переносом кода между .Net и Mono, AFAIK, имеют место быть. G>Не имеют, надо только уметь готовить. G>Специально поставил второй моно, написал на нем Winforms прогу, не используя mono-scecific библиотеки, и она запустилась под .NET без перекомпиляции.
Значит, слухи лживые.
G>Если хочется переносимости — надо использовать переносимое подмножество библиотек, это аксиома для любого языка.
Да. Ровно то же самое относится и к C++-библиотекам, с той поправкой, что по сути компиляторы разных производителей представляют собой разные модификации C++ (собственно, для обеспечения согласованности и нужна стандартизация, в том числе и ABI).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, ollv, Вы писали:
O> В общем то резюм я понял, твоя стратегия проста — все что преимущество (я даже преимуществом это не назову потому, что для каждой платформы свои задачи) С++ — для нета не нужно. Читай между строк.
А ты преимуществ то и не привел.
Сможешь объяснить в чем "премущества" С++ заключаются?
В том что на нем можно сделать что-то сильно системное? Так тоже самое можно сделать на С без всей мощи абстрактных шаблонов, а потом вызывать из высокоуровневого кода.
В том что можно на шаблонах делать фигню, которая типа меняет синтасис? Так это сильно сомнительное преимущество, код нечитаемый становится.
То что можно перегрузить скобки? Это просто смешно, в нормальных языках нету необходимости перегружать скобкию
G>>шаред птр — дополнительные тормоза на каждой операции присваивания и каждом выходе из блока. .NETовский GC порвет релизацию работы с динмамической памятью на shared_ptr как тузик грелку. O> весьма самоуверенное и между тем необъективное заявление. Достаточно для проверки провести небольшой тест, создаем определенное количество объектов, в си, и дот нете, и считаем время какое ушло на создание — очистку ссылок. Ок Там и посмотри что тузик, а что грелка ..
Я писал такой тест в этой теме, смотри выше, C++ слил в 3-6 раз. Это без шаред птр
А потом прибежали другие и начали рассказывать что они динамическую память не выделяют и создают все на стеке
O>>>ты совсем ляпнулся или как ? Код по работе из менеджед с МАПИ? (даже не пытайся, по твоим суждения видно что ты не доганяешь принципиальной разницы диспатч саппортинга ) G>>А нахрен он нужен в .NET? O> Знаешь на скольких проектах хотели бы считать так-же как и ты? И не только про мапи, а про весь ком без поддержки диспатча (т.е. те ком объекты которые в принципе не могут использоваться в нете, уже бы пора тебе заметить мой намек)
Ответь на вопрос, нафига MAPI в .NET?
G>>То что ты считаеь крутостью является на самом деле ненужной шелухой. O> да хватит, я уже понял. Ну не беда, это сейчас, пару раз столкнешься с необходмостью эту "шелуху" просаппортить в нет, и понимание придет.
Она там не нужна, чем больше ты хочешь заниматься ковырянием в реализации, тем больнее .NET тебя будет бить за это по ркуам.
G>>Да нахрен не нужен MAPI, .NET и без него почту слать умеет. O>Это какую если не секрет
Электронную
O>>>с возможностью биндить как аргументы, так и владельцев G>>А в чем крутость если тоже самое достигается передачей объекта как параметра? O> Я же говорю нет — расхолаживает
Ответь на вопрос, в чем крутость такого биндинга, если тоже самое делается передачей параметром?
G>>>>Если каждый начнет "имплементить реализации" (шибанутое словосочетание) модифицирющие синтаксис, то будет попа. Код станет абсолютно нечитаемым. O>>> на этой попе, простите, сидит весь NET G>>Примеры покажешь как весь .NET сидит на модификации синтаксиса? O>Как только ты покажешь мне возможность работы с комом без диспатч, так и сразу
С комом без IDispatch нормально все работает. Берешь Tlbimp, натравливаешь его на idl, получешь interop assembly, дальше работаешь как с обычными классами в .NET.
Если нужен IDispatch, то тогда лучше на VB это писать.
O>>>>> Ком нужен для определенной специфики, чтобы мегатяжелые менеджед грабли таки могли получить быстро работающий код, или код, который может дернуть то, чего ну никак не дернуть из менеджед , или просто попытаться избавить себя от гемороя мегатомных импортов. А для реализации прослоек используется менеджед си. G>>>>Это ты сам себе придумал? Из C# отлично дергаются нативные методы, да нужны они очень редко, а работа с комом происходит гораздо проще. O>>>Опять смешишь тапочки, ? создай в шарпе натив экземпляр и вызови от него метод. G>>Натив экземпляр чего? O> экземпляр анменеджед объекта, — еще одну (хоть какую-то, кривую, не кривую, любую иллюстрацию)
Какого анменеджед объекта? Нету анменеджед объектов.
Возьми DLL, скомпилированную Intel C++ Compiler и напиши в visual studio код, который создает объект из этой либы — придет понимание.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>OK, теперь давай выясним, что такое "красиво". Желательный интерфейс набросаешь кратенько? G>>Угу. Есть метод Register, который заносит в контейнер пару (тип интерфейса, тип реализации), и метод Resolve, который по заданному типу интерфейса выдает объект нужного типа реализации. G>>Когда получится можно сделать так чтобы если тип реализации имеет конструктор с параметрами, то при создании объекта в параметры конструктора подсчтавлялись бы объекты полученные через Resolve.
ГВ>OK, сегодня-завтра набросаю. В принципе, сразу можно сказать, что вот такой примерно интерфейс вполне достижим:
ГВ>
Регистрация производится обычно строкой в конфигурационном файле и ее можно менять "на лету". IoC контейнеры спокойно конструируют целое дерево объектов по интерфейсам:
IoC.Resolve<ISomeType>();
где ISomeType это SomeType с конструктором SomeType(ISomeOtherType someOther)
где ISomeOtherType это SomeOtherType с конструктором SomeOtherType(IAnotherType another, IAnotherOtherType anotherOther)
где ...
Будет очень интересно посмотреть как Вы это реализуете на С++. Можно даже без конфигурационного файла — так и быть, но должна быть возможность подгрузки имплементации из библиотек (dll, можно COM, если осилите.
ГВ>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил.
Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
O>>>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков G>>>>ржунимагу. шаблоны позволяют сделать то что уже есть в других языках O> ну посмейся, может в процессе придет понимание того, что в с++ есть возможность сделать то, чего нет в других языках,
окончу мысль: ...чего нет в других языках и не надо
Вы кроме Александреску вообще что-то читали? А реальным программированием занимались?
Здравствуйте, criosray, Вы писали:
C>Регистрация производится обычно строкой в конфигурационном файле и ее можно менять "на лету". IoC контейнеры спокойно конструируют целое дерево объектов по интерфейсам:
C>IoC.Resolve<ISomeType>();
C>где ISomeType это SomeType с конструктором SomeType(ISomeOtherType someOther) C>где ISomeOtherType это SomeOtherType с конструктором SomeOtherType(IAnotherType another, IAnotherOtherType anotherOther) C>где ...
Хм. В принципе, приблизительно так тоже можно. Некоторые сложности с правильной регистрацией. Мне интересно, как разрешается ситуация, если SomeType содержит конструкторы вроде таких: SomeType(int, string, ISomeOtherType) и SomeType(ISomeOtherType)?
C>Будет очень интересно посмотреть как Вы это реализуете на С++. Можно даже без конфигурационного файла — так и быть, но должна быть возможность подгрузки имплементации из библиотек (dll, можно COM, если осилите.
Ну что ж, посмотрим...
ГВ>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
Он и на C++ реализуется примерно за то же время. Надо только подождать, чтобы требований накидали.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
C>>Регистрация производится обычно строкой в конфигурационном файле и ее можно менять "на лету". IoC контейнеры спокойно конструируют целое дерево объектов по интерфейсам:
C>>IoC.Resolve<ISomeType>();
C>>где ISomeType это SomeType с конструктором SomeType(ISomeOtherType someOther) C>>где ISomeOtherType это SomeOtherType с конструктором SomeOtherType(IAnotherType another, IAnotherOtherType anotherOther) C>>где ...
ГВ>Хм. В принципе, приблизительно так тоже можно. Некоторые сложности с правильной регистрацией. Мне интересно, как разрешается ситуация, если SomeType содержит конструкторы вроде таких: SomeType(int, string, ISomeOtherType) и SomeType(ISomeOtherType)?
Выбирается самый длинный подходящий. То есть если IoC`ку указали значения для аргументов int и string, то сконструирует по первому.
C>>Будет очень интересно посмотреть как Вы это реализуете на С++. Можно даже без конфигурационного файла — так и быть, но должна быть возможность подгрузки имплементации из библиотек (dll, можно COM, если осилите.
ГВ>А .Net переписать не надо по ходу дела?
Так ведь тут нам с пеной у рта доказывают, что на С++ все просто чудесно в плане алгоритмизации. В чем проблема-то? А ведь это далеко не все, что позволяют IoC в дотнет. Например, Castle Windsor, Unity, Spring.NET и другие предоставляют до купы мощный механизм AoP (интерцепторы) — путем генерирования прокси-классов на лету...
ГВ>>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
ГВ>Он и на C++ реализуется примерно за то же время. Надо только подождать, чтобы требований накидали.
Ну Вы сделайте для начала то, что уже Вам накидали. Если сделаете — съем свою шляпу, чесслово.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, criosray, Вы писали:
C>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. Х>http://code.google.com/p/pococapsule/ Х>с использованием етой библиотеки реализуется минут за 5-10 опытными программистами на C++
Вы ведь опытный программист, да? Реализацию в студию.
Здравствуйте, Хвост, Вы писали:
C>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. Х>http://code.google.com/p/pococapsule/ Х>с использованием етой библиотеки реализуется минут за 5-10 опытными программистами на C++
Хех. Оно там уже реализовано. Интересно поиграться "с нуля".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
Х>>с использованием етой библиотеки реализуется минут за 5-10 опытными программистами на C++ C>Вы ведь опытный программист, да? Реализацию в студию.
реализацию чего? пока по вашим постам я только понял что вы хотите что-то вроде service locator'а, а не IoC контейнера. Лучше опишите задачу, как вы её решаете с помощью вашего фреймворка, и посмотрим что в етом случае делают в С++.
Здравствуйте, criosray, Вы писали:
ГВ>>Ты уверен, что апелляция к "индусам" в этом контексте выглядит позитивно?
C>Нет, но зато реалистично. Индусы — вездесущи. ;(
Ты называешь шарп языком для индусов ? ну ты счас тут отгребешь ...
Здравствуйте, gandjustas, Вы писали:
ГВ>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. G>Удачи.
Посмотри в этот архив. Это я набросал за сегодня. Внешнего конфигурирования, разумеется, нет, но и буст тоже не используется: его не все любят, а для иллюстрации идеи, ИМХО, этого достаточно.
Собирается VS2K5, там собственно IoC.h и IoC_COM.h — реализация контейнера, остальное тесты и примочки. Дальше см. комментарии, если что не понятно — спрашивай здесь.
Для справки: ушло на это всё где-то около 3-х часов чистого времени.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, minorlogic, Вы писали:
ГВ>>>Ты уверен, что апелляция к "индусам" в этом контексте выглядит позитивно? C>>Нет, но зато реалистично. Индусы — вездесущи. ;( M>Ты называешь шарп языком для индусов ? ну ты счас тут отгребешь ...
Где? На 25-м уровне вложенности ветки из 900 сообщений, расположенной в КСВ? Отгрести? Только если очень напрашиваться!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>Хм. В принципе, приблизительно так тоже можно. Некоторые сложности с правильной регистрацией. Мне интересно, как разрешается ситуация, если SomeType содержит конструкторы вроде таких: SomeType(int, string, ISomeOtherType) и SomeType(ISomeOtherType)? C>Выбирается самый длинный подходящий. То есть если IoC`ку указали значения для аргументов int и string, то сконструирует по первому.
Этого я сейчас делать не стал, чтобы не тянуть буст. Хотя в принципе — возможно.
ГВ>>А .Net переписать не надо по ходу дела? C>Так ведь тут нам с пеной у рта доказывают, что на С++ все просто чудесно в плане алгоритмизации. В чем проблема-то? А ведь это далеко не все, что позволяют IoC в дотнет. Например, Castle Windsor, Unity, Spring.NET и другие предоставляют до купы мощный механизм AoP (интерцепторы) — путем генерирования прокси-классов на лету...
Генерировать прокси, увы, без чего-то вроде emit можно, но довольно сложно. Так что, это точно не здесь и не сейчас.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>лично я заменяю их на императивный цикл for
Мне тебя очень жалко.
Х>сейчас уже есть возможность писать в функциональном стиле, да, скачай msvc10 (CTP) и возрадуйся лямбдам (да ещё и с замыканиями!)
Ой не верю. Для этого нужно GC. Или снова будут UB там и сям.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
Х>>сейчас уже есть возможность писать в функциональном стиле, да, скачай msvc10 (CTP) и возрадуйся лямбдам (да ещё и с замыканиями!)
VD>Ой не верю. Для этого нужно GC.
Нет. GC для этого не обязателен.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>а погуглить? первая ссылка по запросу static polymorphism даёт представление что ето такое и как ето пользовать.
Погугли и почитай, что за бред там пишется. Все про С++. Это локальная терминалогия отдельных идиотов. Научного понятия статического полиморфизма нет. Есть статическая типизация и разные виды полиморфизма. Но любой из них может отрабатывать в рантайме.
VD>>В общем, не стоит так напрягаться. Этому гнилью даже новый стандарт не поможет. Кстати, где он? (с) Х>ето твоему немерлю ничего не поможет, мертворождённый проект.
Странный способ ответита на вопрос. Ну, да ладно.
Гы. Шарп уже впитал из Немерла добрую половину и продолжает двигаться в этом направлении. Лет через 10 C# станет немерлом со шрамами оставленными эволюцией. Это как минимум. А как максимум я тебе пришлю эту ссылочку и посмотрю на то как ты будешь выкручиваться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Собирается VS2K5, там собственно IoC.h и IoC_COM.h — реализация контейнера, остальное тесты и примочки. Дальше см. комментарии, если что не понятно — спрашивай здесь.
Пока код не читал, но интересно — это нынче стандартная практика пихать в хидеры реализацию?
Здравствуйте, criosray, Вы писали:
C>Пока код не читал, но интересно — это нынче стандартная практика пихать в хидеры реализацию?
Там всё на шаблонах.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>Ой не верю. Для этого нужно GC.
ГВ>Нет. GC для этого не обязателен.
Из известных мне вариантов есть еще только подсчет ссылок. Но он тоже вряд ли может быть применен в рамках С++, так как объект не обязаны его реализовывать. Да и подсчет ссылок приводит к зацикливаниям, которые потенциально тоже можно разрыват (пример — Руби), но это опять же проблематично. По любому, подсчет ссылок или GC — это все вариации на тему автоматического управления памятью.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Почему самые высоконагруженные сайты написаны не на С++?
Высоконагруженные части некоторых высоконагруженных сайтов-таки написаны на С/C++.
Не так давно на InfoQ было видео выступления одного из разработчиков FaceBook-а. Посмотри, там много интересного было разсказано.
ГВ> Тут вопрос в другом: удалось реализовать фичу X средствами самого языка ("понятно какими" или "непонятно какими" — совершенно не важно) или нет. Если не удалось — значит возможностей языка для этой фичи не хватает. Если удалось, то относить сей факт к "недостаткам" можно, ИМХО, только по каким-то очень вычурным соображениям вроде очередного "миллиона индусов, которые завалят нас багами".
Все Тьюринг-полные языки равны друг другу по возможностям (ну то есть то, что решается одной строчкой на Хаскеле, можно решить тысячью строк на ассемблере). Другой вопрос — а надо ли, и не взять ли в руки инструмент, котороый повышает эффективность разработки?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Всё это, конечно, правильно, хоть и с некоторыми поправками. Но поправки сейчас не суть важны. Важно другое: что та самая "область" в которой царят все за компанию (кроме C++) магическим образом не пересекается с теми областями, в которых от C++ никак не могут (и не хотят) избавиться по сугубо практическим соображениям. То есть, она как бы есть, но её значимость как бы слегка эфемерна по отношению к тому набору требований, с которым приходится иметь дело C++-никам.
Ну конечно не избавишься сразу от C++ везде. Есть тонны кода на C++, которые приносят много денег и этот код надо саппортить, есть кучи программистов, которых не выгонишь на улицу в один момент, есть кучи недалеких менеджеров, которые кроме C++ других языков и не слышали.
Только ни один из этих факторов не говорит что С++ чем-то хорош.
Здравствуйте, gandjustas, Вы писали:
G>Ну конечно не избавишься сразу от C++ везде. Есть тонны кода на C++, которые приносят много денег и этот код надо саппортить, есть кучи программистов, которых не выгонишь на улицу в один момент, есть кучи недалеких менеджеров, которые кроме C++ других языков и не слышали. G>Только ни один из этих факторов не говорит что С++ чем-то хорош.
А я разве говорил о дихотомии "хорошо-плохо"?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Mamut, Вы писали:
ГВ>> Тут вопрос в другом: удалось реализовать фичу X средствами самого языка ("понятно какими" или "непонятно какими" — совершенно не важно) или нет. Если не удалось — значит возможностей языка для этой фичи не хватает. Если удалось, то относить сей факт к "недостаткам" можно, ИМХО, только по каким-то очень вычурным соображениям вроде очередного "миллиона индусов, которые завалят нас багами".
M>Все Тьюринг-полные языки равны друг другу по возможностям (ну то есть то, что решается одной строчкой на Хаскеле, можно решить тысячью строк на ассемблере). Другой вопрос — а надо ли, и не взять ли в руки инструмент, котороый повышает эффективность разработки?
А кто-то с этим спорит? По-моему, тут грызня о мифических фатальных недостатках C++ и тех, кто на нём программирует. Собственно, пропоненты такой позиции, ИМХО, традиционно поступают в строгом соответствии с советами Тристана:
Если вы на женщин слишком падки,
В прелестях ищите недостатки.
Станет сразу все намного проще:
Девушка стройна, мы скажем: мощи!
Умницу мы наречем уродкой,
Добрую объявим сумасбродкой.
Ласковая — стало быть, липучка,
Держит себя строго — значит, злючка.
Назовем кокетливую шлюхой,
Скажем про веселую — под мухой.
Пухленькая — скоро лопнет с жиру,
Щедрую перекрестим в транжиру.
Ну, а бережлива? — Окрестим в сквалыгу!
Если маленькая? — Ростом с фигу!
Если рослая? — Тогда верзила!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
Х>>язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь.
C>Если бы Вы что-то знали о С# и об Андерсоне, Вы бы не писали такой чуши.
Интересно, почему?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
Х>>язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь. C>Если бы Вы что-то знали о С# и об Андерсоне, Вы бы не писали такой чуши.
Ганс Христиан? Как же, знаком, знаком. "Принцесса на горошине", "Дюймовочка", "Гадкий утёнок", да что там, "Стойкий оловянный солдатик", ето же всё классика и знакома каждому.
А по существу, в чём чушь? Удиви меня.
ГВ>>>Вопрос остаётся тем же самым: сколько это будет стоить пользователю. C>>Стоимость прямо пропорциональна человеко-часам, затраченым в процессе разработки и в этом плане С++ уже давно в отстающих, при чем иногда очень-очень сильно отстающих... ГВ>Началось... Давай вспомним все значения слова "стоимость" и все контексты, к которым его можно привязать.
Началась демогогия... Вам есть что по делу сказать?
ГВ>>>В новой версии стандарта — поддерживает. C>>Поддерживает 1% от ФЯ? Замечательно.
ГВ>Ух ты. А что это такое — 1% от ФЯ? А почему не 0,76% и не 3,84%?
Еще одна порция демагогии. По делу нечего сказать? Под 1% подразумевалась — малая доля, если Вы ничего больше придумать не можете, кроме как цепляться к словам.
Функциональщины в том же С# больше, чем в С++0х (хорошее название, кстати, точно выражает инопланетное происхождение синтаксиса языка), но это не делает С# функциональным языком.
ГВ>>>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо. C>>Представьте себе, среди всего многообразия задач очень мало таких, для которых важно выжимать максимальную производительность.
ГВ>Это как-то опровергает то, что Lisp медленнее C++?
Нет, это означает что во многих (в большинстве, коли Вам так будет угодно) контекстах аргумент производительности конечного продукта абсолютно иррелевантет.
C>>Лучшее — враг хорошего.
ГВ>Бесспорно. На C++ получаются вполне хорошие решения.
Смотря по каким критериям оценивать и в зависимости от задач.
ГВ>>>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта. C>>А вот это иллюзии. В программировании крайне важно сохранять "читабельность кода". Ради этого придумывают много умных терминов вроде SRP, DRY, SoC, Open/close principle, cohesion и т.д. и т.п. ГВ>С кем-то я совсем недавно спорил по поводу читабельности... А, с Владом как раз. Давай, теперь с тобой. Что такое "читабельность"? Какова связь читабельности и, например, open/close principle?
Самая что ни есть прямая.
ГВ>>>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). C>>и это заметно. Чистота вообще не шибко кого заботит в мире С++ и появляются на свет уродливые творения, где над каждой строкой кода надо раздумывать так же долго, как при чтении Ницше... ГВ>Вот те раз, а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы.
Легкость понимания зависит от выразительности и лаконичности синтаксиса языка и структуры кода (и других менее значимых факторов). В этом плане С++, скажем прямо, сосет. И Ваша реализация IoC тому самое явное доказательство (для сравнения смотрите исходник Сastle MicroKernel).
ГВ>>>Ну, что тут скажешь? Я занесу в шпаргалку Абсолютных Противо-C++-ных Аргументов ещё слова: "ересь", "бред" и "вера". C>>Занесите, т.к. Влад абсолютно прав. С++ уродливый и непродуктивный язык и жив он все еще только потому, что у него есть ниша, в которой у него нет достойных конкурентов.
ГВ>Следовательно, для этой ниши C++ вполне подходящий и продуктивный язык, где ему нет достойных конкурентов.
На безрыбьи и рак — щука.
ГВ>>>И это очень хорошо, что не нужно напряженно следить за настроениями в комитете. Нет, это (читай по буквам) О Ч Е Н Ь хорошо. C>>Это очень плохо. Язык должен развиваться. Посмотрите на С# — кому плохо, что за эти 7 лет на пороге уже 4ая версия языка, где каждая версия — серьезный шаг вперед?..
ГВ>Будь я разработчиком компилятора того же C++, меня такая ситуация очень бы устраивала (стабильность спецификации).
Какой процент разработчиков компилятора от общего числа программистов?
Здравствуйте, Хвост, Вы писали:
Х>>>с использованием етой библиотеки реализуется минут за 5-10 опытными программистами на C++ C>>Вы ведь опытный программист, да? Реализацию в студию. Х>реализацию чего? пока по вашим постам я только понял что вы хотите что-то вроде service locator'а, а не IoC контейнера. Лучше опишите задачу, как вы её решаете с помощью вашего фреймворка, и посмотрим что в етом случае делают в С++.
Простейший пример из продакшн кода — форма ввода, построенная на Supervising Controller, где презентация отмечена циклом жизни pooled 0-5, а контроллер на 100% (почти) покрыт модульными тестами и таких форм не одна, ни две, а больше сотни.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, criosray, Вы писали:
C>>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. Х>>http://code.google.com/p/pococapsule/
Очень-очень примитивно, если сравнивать с Castle Windsor.
Где возможность задать Lifecycle?
Где возможность задать Lifestyle?
Где автоматическая регистрация компонент по шаблону?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, criosray, Вы писали:
C>>>>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами. Х>>>>http://code.google.com/p/pococapsule/ C>>Очень-очень примитивно, если сравнивать с Castle Windsor.
ГВ>Ну дык, pococapsule и по объёму чуть не в 10 раз меньше, чем Castle Windsor. Что тут бочку-то катить?
Кого волнует объем? ГВ>Тем не менее, в качестве ответа на вопрос об IoC — вполне себе ответ.
Нет, это не ответ. Что толку от такого IoC, если у него кроме самого базового DI и нету больше ничего?
Вот Вы лично пользуетесь PocoCapsule? Наверняка нет, а мы IoC используем на каждом шагу потому, что сильно облегчает жизнь и естественным образом улучшает архитектуру систем.
C>>Где возможность задать Lifecycle? C>>Где возможность задать Lifestyle?
ГВ>Это уже фичи, которые в тот или иной контейнер могут быть внесены или нет.
Ну покажите мне хоть один контейнер на С++, где были бы эти "фичи". Это, кстати, не просто фичи, а самая основа работы контейнера. Что мне толку от контейнера, если я не могу задать lifestyle компоненты?
C>>Где автоматическая регистрация компонент по шаблону?
ГВ>Можно сделать и так, но понадобится глобальный регистратор всех компонентов, используемых в такой операции.
Ну сделайте. Очень хочу посмотреть. Условия все те же: конфигурирование через конфиг файл. То есть указывается сборки и шаблон, по которому ее сканировать и дальше все делается автоматически контейнером.
C>>Где расширяемость аналогичная Сastle Facilities?
ГВ>Да тоже, вроде бы, ничего сверхъестественного.
Ну нету ведь?
C>>Где интерцепторы???
ГВ>Вот с этим сложнее, но и то, из-за кодогенерации.
Конечно посложнее. И судя по тому, что готовых рабочих решений нету — невыполнимая задача для С++. Так?
ГВ> ГВ>Ты всё же определись, чего ты хочешь от собеседников: чтобы сделали копию Castle Windsor или MS Unity, продемонстрировали возможный подход или ещё чего-то?
Да, я хочу чтоб мне показали аналог Виндсор, но для С++. Еще я хочу увидеть аналог RhinoMocks.
ГВ>Я надеюсь — ты не просто ищешь повод фыркнуть погромче, верно? Можно написать IoC-контейнер и конфигурируемый, и гибкий, и с обилием других качеств, но это, в общем, довольно объёмная работа. Тот же Castle Windsor, если судить по объёму исходников, ну никак не один и не два человеко-месяца.
Для справки, на дотнет реализаций этих контейнеров уже больше десятка (а то и двух десятков). Почему на вашем столь любом замечательном мощном С++ до сих пор нету ничего подобного? Можете ответить на этот вопрос?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Началось... Давай вспомним все значения слова "стоимость" и все контексты, к которым его можно привязать. C>>Началась демогогия... Вам есть что по делу сказать?
ГВ>Я уж сказал, вроде. Стоимость для конечного пользователя — это, в числе прочего, и стоимость аппаратных ресурсов, необходимых для выполнеия программ.
Каких еще ресурсов? Наш вполне себе современный софт с богатым пользовательским интерфейсом (WinForms, и WPF c недавних пор) работает на старых маломощных компьютерах и пользователи им довольны.
ГВ>>>Ух ты. А что это такое — 1% от ФЯ? А почему не 0,76% и не 3,84%? C>>Еще одна порция демагогии. По делу нечего сказать? Под 1% подразумевалась — малая доля, если Вы ничего больше придумать не можете, кроме как цепляться к словам. C>>Функциональщины в том же С# больше, чем в С++0х (хорошее название, кстати, точно выражает инопланетное происхождение синтаксиса языка), но это не делает С# функциональным языком. ГВ>Прости, а кто-то утверждал, что C++ — функциональный язык? Говорили, что он поддерживает функциональный стиль. Это несколько не одно и то же. Не надо додумывать, а потом спорить с додуманным.
Да не поддерживает он функциональный стиль. Хотите функциональный стиль — смотрите тот же F#.
ГВ>>>С кем-то я совсем недавно спорил по поводу читабельности... А, с Владом как раз. Давай, теперь с тобой. Что такое "читабельность"? Какова связь читабельности и, например, open/close principle? C>>Самая что ни есть прямая. ГВ>Сначала ответь на первый вопрос: что такое "читабельность"?
Cвойство текстового материала, характеризующее лёгкость восприятия его человеком.
ГВ>>>Вот те раз, а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы. C>>Легкость понимания зависит от выразительности и лаконичности синтаксиса языка и структуры кода (и других менее значимых факторов). В этом плане С++, скажем прямо, сосет. И Ваша реализация IoC тому самое явное доказательство (для сравнения смотрите исходник Сastle MicroKernel). ГВ>Я разве утверждал, что C++ — лаконичный язык? Его относительная многословность — вполне медицинский факт.
"а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы"
ГВ>Кстати, что касается IoC, то мы начали с желательной модели использования. И кстати, содержательных комментариев так пока и не последовало.
Глаза раззуйте.
ГВ>>>Следовательно, для этой ниши C++ вполне подходящий и продуктивный язык, где ему нет достойных конкурентов. C>>На безрыбьи и рак — щука.
ГВ>Да ну? Разве ж C++ — это безрыбье? Безрыбье — это автокод.
Нет, на безрыбьи и С++ (рак) — щука.
ГВ>>>Будь я разработчиком компилятора того же C++, меня такая ситуация очень бы устраивала (стабильность спецификации). C>>Какой процент разработчиков компилятора от общего числа программистов?
ГВ>Меня это устраивало бы, потому что можно сделать высококачественный компилятор и спокойно его отшлифовать, не опасаясь очередного виража стандартизаторов. А не потому, что я нашёл тихую заводь.
Вы не ответили на поставленный вопрос: Какой процент разработчиков компилятора от общего числа программистов?
Здравствуйте, criosray, Вы писали:
ГВ>>Я уж сказал, вроде. Стоимость для конечного пользователя — это, в числе прочего, и стоимость аппаратных ресурсов, необходимых для выполнеия программ. C>Каких еще ресурсов? Наш вполне себе современный софт с богатым пользовательским интерфейсом (WinForms, и WPF c недавних пор) работает на старых маломощных компьютерах и пользователи им довольны.
А кто-то утверждал, что софт на WPF должен всегда недопустимо тормозить? Вроде, такого не было. Мы, в общем, как раз о том сегменте, где те самые проценты разницы в производительности программ на C++ и .Net (или не проценты — как повезёт) имеют значение.
ГВ>>Прости, а кто-то утверждал, что C++ — функциональный язык? Говорили, что он поддерживает функциональный стиль. Это несколько не одно и то же. Не надо додумывать, а потом спорить с додуманным. C>Да не поддерживает он функциональный стиль. Хотите функциональный стиль — смотрите тот же F#.
Упс. А лямбды — не функциональный стиль? Да даже бустовые замыкания — и то функциональный стиль.
ГВ>>>>С кем-то я совсем недавно спорил по поводу читабельности... А, с Владом как раз. Давай, теперь с тобой. Что такое "читабельность"? Какова связь читабельности и, например, open/close principle? C>>>Самая что ни есть прямая. ГВ>>Сначала ответь на первый вопрос: что такое "читабельность"? C>Cвойство текстового материала, характеризующее лёгкость восприятия его человеком.
Каковы объективные характеристики этого свойства (я и в самом деле этого не знаю, хоть пальцем ткни, где про сие почитать)? Какова связь этого свойства с open/close principle?
ГВ>>>>Вот те раз, а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы. C>>>Легкость понимания зависит от выразительности и лаконичности синтаксиса языка и структуры кода (и других менее значимых факторов). В этом плане С++, скажем прямо, сосет. И Ваша реализация IoC тому самое явное доказательство (для сравнения смотрите исходник Сastle MicroKernel). ГВ>>Я разве утверждал, что C++ — лаконичный язык? Его относительная многословность — вполне медицинский факт. C>"а мужики-то и не знают, что "лёгкость понимания", оказывается, зависит от чистоты парадигмы"
Это к чему? Я что-то запутался. Чтобы исключить намёки, повторю своё мнение. Итак, на мой взгляд, чистота парадигмы — неизвестно что, поскольку зачастую неизвестно, что такое сама парадигма (только на википедию ссылаться не надо); лёгкость понимания — явление субъективное, т.е. — с трудом поддающееся объективным измерениям (мне, например, вполне понятно, что написано в IoC.h и ещё в туче других библиотек на C++); "многословность" — до некоторой степени измерима сравнением количества лексем в коде аналогичной функциональности на разных языках.
Понятно, почему я иронизирую над апелляциями к "лёгкости понимания" и "чистоте парадигмы"?
ГВ>>Кстати, что касается IoC, то мы начали с желательной модели использования. И кстати, содержательных комментариев так пока и не последовало. C>Глаза раззуйте.
Дружище, как-то оно не по-товарищески — хамить в ответ на предложенный код. Собери свои претензии в один постинг, будь добр, и забрось в ответ по IoC, а то я не могу понять, где претензии к предложенному примеру, где к C++, где к IoC-контейнерам на C++ "вообще" и т.п.
ГВ>>Меня это устраивало бы, потому что можно сделать высококачественный компилятор и спокойно его отшлифовать, не опасаясь очередного виража стандартизаторов. А не потому, что я нашёл тихую заводь. C>Вы не ответили на поставленный вопрос: Какой процент разработчиков компилятора от общего числа программистов?
Это нерелевантный в данном контексте вопрос, да и не смог бы я на него содержательно ответить, даже если бы и захотел. С другой стороны, cие не имеет ни малейшего значения с точки зрения оценки самого C++. Пойми, медленное развитие C++ как языка имеет свои положительные стороны — как минимум, разработчики компиляторов могут дать более качественные (оптимизированные и т.п.) компиляторы, чем это было бы в ситуации очень быстрых изменений. Во всяком случае, такое предположение вполне логично.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>Ну дык, pococapsule и по объёму чуть не в 10 раз меньше, чем Castle Windsor. Что тут бочку-то катить? C>Кого волнует объем?
В общем — никого, согласен. Просто pocoapsule — это мелочёвка, в общем-то. Годится в качестве заготовки, пожалуй, ну так она для того и приведена была здесь.
ГВ>>Тем не менее, в качестве ответа на вопрос об IoC — вполне себе ответ. C>Нет, это не ответ. Что толку от такого IoC, если у него кроме самого базового DI и нету больше ничего? C>Вот Вы лично пользуетесь PocoCapsule? Наверняка нет, а мы IoC используем на каждом шагу потому, что сильно облегчает жизнь и естественным образом улучшает архитектуру систем.
Да я вообще самописными контейнерами такого рода пользуюсь. И не жужжу особо. Просто называю их не IoC-контейнерами, а настраиваемыми агрегатами, например.
C>>>Где возможность задать Lifecycle? C>>>Где возможность задать Lifestyle? ГВ>>Это уже фичи, которые в тот или иной контейнер могут быть внесены или нет. C>Ну покажите мне хоть один контейнер на С++, где были бы эти "фичи". Это, кстати, не просто фичи, а самая основа работы контейнера. Что мне толку от контейнера, если я не могу задать lifestyle компоненты?
Сдаётся мне, что тут дело в несколько иной общей культуре разработки на C++ — здесь не так модны большие тяжёлые компоненты типа "унифицирующих контейнеров" a-la Java. А написать самостоятельно что-то в таком духе — дело не сложное (как раз мой пример о том и свидетельствует). Можно и lifestyle/lifecycle прикрутить — опять таки, дело не хитрое.
C>>>Где автоматическая регистрация компонент по шаблону? ГВ>>Можно сделать и так, но понадобится глобальный регистратор всех компонентов, используемых в такой операции. C>Ну сделайте. Очень хочу посмотреть. Условия все те же: конфигурирование через конфиг файл. То есть указывается сборки и шаблон, по которому ее сканировать и дальше все делается автоматически контейнером.
Нет такого явления в C++, как "сборки" — это раз. Есть DLL, но нет такого явления, как "сканирование содержимого DLL". Чтобы получить нечто подобное поиску нужного класса нужно а) определить способ и формат описания класса (реестр), б) занести описания всех классов в такой реестр и в) напустить на указанный реестр операцию поиска. В рантайме-то у C++-ных классов никаких имён нет. Техника очевидная для любого C++-ника. В принципе, если формат выбран с человекочитаемыми именами, то их можно перенсти и в конфиг-файл. Тоже, в общем, не бином Ньютона.
Мне сейчас, честно говоря, просто возиться с этим не хочется. Для форумного спора как-то слишком много усилий на квадратный дюйм.
C>>>Где расширяемость аналогичная Сastle Facilities? ГВ>>Да тоже, вроде бы, ничего сверхъестественного. C>Ну нету ведь?
Где? У меня?
C>>>Где интерцепторы??? ГВ>>Вот с этим сложнее, но и то, из-за кодогенерации. C>Конечно посложнее. И судя по тому, что готовых рабочих решений нету — невыполнимая задача для С++. Так?
Проще сказать — да, невыполнимая. Прокси придётся писать вручную. Максимум, чем можно воспользоваться — довольно хитрыми играми с препроцессором.
ГВ>>Ты всё же определись, чего ты хочешь от собеседников: чтобы сделали копию Castle Windsor или MS Unity, продемонстрировали возможный подход или ещё чего-то? C>Да, я хочу чтоб мне показали аналог Виндсор, но для С++. Еще я хочу увидеть аналог RhinoMocks.
Зачем? Это послужит тебе аргументом за то, что C++ — "достаточно мощный"? Или интересует принципиальная возможность реализации таких вещей?
ГВ>>Я надеюсь — ты не просто ищешь повод фыркнуть погромче, верно? Можно написать IoC-контейнер и конфигурируемый, и гибкий, и с обилием других качеств, но это, в общем, довольно объёмная работа. Тот же Castle Windsor, если судить по объёму исходников, ну никак не один и не два человеко-месяца. C>Для справки, на дотнет реализаций этих контейнеров уже больше десятка (а то и двух десятков). Почему на вашем столь любом замечательном мощном С++ до сих пор нету ничего подобного? Можете ответить на этот вопрос?
Значит, просто никому не нужно. А вообще говоря, не знаю, почему оно так.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Как ты правильно заметил, Тьюринг-полные языки, в общем, эквивалентны по своим возможностям в смысле выражения абстракций. Всё дело в итоговой цене на билет. Я не сомневаюсь, что абстракцию автоматического управления ресурсами вроде std::auto_ptr можно реализовать и на Хаскеле, и на Лиспе и ещё много на чём. Вопрос остаётся тем же самым: сколько это будет стоить пользователю.
У тебя проблемы с терминологией. std::auto_ptr — это помошник упрощающий ручное управление памятью. В языках с автоматическим управлением памятью они ненужны. Меж тем сделать их не сложно.
ГВ>Так с современными, или с теми, которые старше и на которых обкатывались идеи, впитанные C++?
А что мешает языку быть старше другого языка и оставаться при этом современным? Лисп вещь самодостаточная. У него никогда не было проблем с std::auto_ptr. По этому он и сейчас почти в любой пенесометрии порвет С++ как тузик грелку.
ГВ>В новой версии стандарта — поддерживает.
1. Где эта версия? Стандарт уже зарелизили? А то мне про него последние 10 лет рассказывают, рассказывают...
2. Без GC толку от этого будет не много.
VD>>Еще одно утверждение не достойное серьезного человека. Рабивается простым примером. По верх дотнета реализован С++ в котром возоности шаблонов реализованы полностью.
ГВ>По всей видимости, ollv имеет в виду C#, говоря о .Net.
Ну, так пора запомнить, что это разные вещи.
ГВ>В том же, что кодогенерация C++ перенастроена на IL ничего необычного нет.
Спасибо за поддержку.
ГВ>Тьюринг-полнота, ага. Из C++ можно и Lisp генерировать. И наоборот. Вопрос в практичности такого решения.
А что непрактичного в генерации il-а? Скорсть практически та же. Другое дело, что многим это может быть не нужно. Но перенацеливание С++ для дотнета было сделано ради упрощения итеропа, так что практичность и целесообразность очень высоки.
VD>>Теперь я тебе открою правду о шаблонах.
ГВ>[skip обнажённая правда, от блеска которой слепит глаза и хочется сморкаться]
Это у тебя неадекватные реакции. Ничего, бывает....
ГВ>Всё это, конечно, правильно, хоть и с некоторыми поправками. Но поправки сейчас не суть важны. Важно другое: что та самая "область" в которой царят все за компанию (кроме C++) магическим образом не пересекается с теми областями, в которых от C++ никак не могут (и не хотят) избавиться по сугубо практическим соображениям.
Ошибаешься! Такие как ollv по незнанию или из фанатических побуждений применяют С++ там где ему совсем не место и в условиях где он противопоказан.
Понимаешь, я не буду спорить, что если задача очень тиражная и скорость является основным требованием, то С++ подходящий язык. Хотя и тут есть альтернативные решения и С++ зачастую выбирается исходя из распространенности и разрекламированности. Но когда сил не много, а нужно в кратчайшие строки получить надежное решение, когда денег на разработку нехватает, С++ является худшим выбором. Например, на С++ сайты не пишут даже в Майкрософт и АйБиЭм. А наши лаботрясы пишут. И еще с пеной у рта доказывают, что только так и надо.
ГВ>То есть, она как бы есть, но её значимость как бы слегка эфемерна по отношению к тому набору требований, с которым приходится иметь дело C++-никам.
В большинстве случаев это домысли тех самых С++-ников.
ГВ>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо.
Когда-то давно производительность Лиспа была огромной проблемой. Но сейчас есть высокопроизводительные компиляторы. Плюс Лисп позволят генерировать исполянемый код. Вот недавно мне дали ссылку на забавный продукт (можно сказать в некотором роде конкурент Немерла): http://lambda-the-ultimate.org/node/3281
Это язык основанный на Лиспе позволяющий расширять свой синтаксис и семантику. К сожалению, информации по нему пока очень мало. Но факт в том, что этот язык имеет библиотеку позволяющую преобразовывать код на этом языке в il тем самым уходя от интерпретации и получая высокопроизводительные решения.
ГВ>Суть вещей — многогранное явление. Для каждого она своя.
Для людей не обладающих информацией она всегда однобока.
O>>> Кроме того, на плюсах вполне реализуемы элементы не родственных стурктур, к примеру итерации for_each, find_if count_if, функторы, придают плюсам оттенки функциональных языков,
VD>> Они придают плюсам оттенок помойки. Попиши сначала на полноценном ФЯ, а потом делай такие заявления.
ГВ>Помойка или нет — это сугубо эмоциональная оценка.
Эмоциональная она для тех, кто не видел библиотек функциональных языков. Там все очень смеялись бы увидев функции вроде find_if и count_if. Их авторам рассказали бы, что на то есть универсальные функции высшего порядка filter и fold, а find_if и count_if реализуются на их базе добавлением простейшей лямбды.
ГВ>Не нравится — не пользуйся, никто не заставляет.
Не нравится. Не пользуюсь. Будь уверен.
ГВ> Зато нет никакой необходимости любой ценой приводить структуру потока управления в соответствие с некоторой "правильной парадигмой".
Это ты в том смысле сказал, что усе уже сделано не правильно и делать что-то правильно не надо?
VD>>[...] С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
ГВ>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта.
Забавно, что ты даже не понимаешь о чем идет речь. Речь же идет о побочных эффектах воплощения шаблонов. Эти эффекты позволяют заниматься метапрограммированием во время компиляции. Но как и все, что достигается не предусмотренными для этого средствами, данное решение является очень неудобным и ограниченным.
ГВ>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). Пуризм — это ещё одно ругательство, как и BASIC, если ты не в курсе. Есть только два критерия: "удобно написать удобную фишку X" и "иметь возможности для отступления в случае потерь производительности".
Это как раз тот случай где отсутствие чистых и грамотных решений толкает на использование кривых.
Ты с книгами Александеску хорошо знаком?
ГВ>Теоретические же базисы хороши для формирования общей культуры программиста и исследования теоретических же проблем. Хотя это отнюдь не отрицает, например, того, что Lisp хорош в сфере обработки символических данных. Кстати, обрати внимание — Lisp тоже поддерживает императивный стиль одновременно с функциональным.
Да, да, да. Зачем наука в программировании? Ты давно всем доказал, что программирование особая отрасль и мозг в ней не нужен. Главное трясти по сильнее. То ли дело автомобили. Вот там наука важна. Ведь на автомобилях ездеем мы сами, а софт используют какие-то ламеры.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>У тебя проблемы с терминологией. std::auto_ptr — это помошник упрощающий ручное управление памятью. В языках с автоматическим управлением памятью они ненужны. Меж тем сделать их не сложно.
GC научился удалять строго указанные объекты (освобождать занятую память) в строго указанный момент времени? Он же, вроде, с точностью до поколения может работать?
ГВ>>Так с современными, или с теми, которые старше и на которых обкатывались идеи, впитанные C++? VD>А что мешает языку быть старше другого языка и оставаться при этом современным? Лисп вещь самодостаточная. У него никогда не было проблем с std::auto_ptr. По этому он и сейчас почти в любой пенесометрии порвет С++ как тузик грелку.
ГВ>>В новой версии стандарта — поддерживает. VD>1. Где эта версия? Стандарт уже зарелизили? А то мне про него последние 10 лет рассказывают, рассказывают...
Ну... Комитет (tm).
VD>2. Без GC толку от этого будет не много.
ИМХО, ты ошибаешься.
ГВ>>В том же, что кодогенерация C++ перенастроена на IL ничего необычного нет. VD>Спасибо за поддержку.
Пожалуйста.
ГВ>>Тьюринг-полнота, ага. Из C++ можно и Lisp генерировать. И наоборот. Вопрос в практичности такого решения. VD>А что непрактичного в генерации il-а? Скорсть практически та же. Другое дело, что многим это может быть не нужно. Но перенацеливание С++ для дотнета было сделано ради упрощения итеропа, так что практичность и целесообразность очень высоки.
Я и не оспариваю практическую полезность генерации IL компилятором C++.
ГВ>>Всё это, конечно, правильно, хоть и с некоторыми поправками. Но поправки сейчас не суть важны. Важно другое: что та самая "область" в которой царят все за компанию (кроме C++) магическим образом не пересекается с теми областями, в которых от C++ никак не могут (и не хотят) избавиться по сугубо практическим соображениям. VD>Ошибаешься! Такие как ollv по незнанию или из фанатических побуждений применяют С++ там где ему совсем не место и в условиях где он противопоказан.
Это слишком сильное утверждение, насчёт незнания и фанатизма. Так что, тут я согласиться не могу.
VD>Понимаешь, я не буду спорить, что если задача очень тиражная и скорость является основным требованием, то С++ подходящий язык. Хотя и тут есть альтернативные решения и С++ зачастую выбирается исходя из распространенности и разрекламированности. Но когда сил не много, а нужно в кратчайшие строки получить надежное решение, когда денег на разработку нехватает, С++ является худшим выбором. Например, на С++ сайты не пишут даже в Майкрософт и АйБиЭм. А наши лаботрясы пишут. И еще с пеной у рта доказывают, что только так и надо.
Не надо переворачивать с ног на голову. Сайты бывают разные, и требования — тоже разные. MS и IBM (как и все остальные) вольны поступать так, как им заблагорассудится. И кроме всего прочего, слишком мало критериев для отсечения C++: "в кратчайшие строки получить надежное решение, когда денег на разработку нехватает". Он запросто может оказаться наилучшим выбором с учётом других факторов. Тут проблема в другом: почему-то те, кто ругают C++ приписывают ему какую-то имманентную глюкавость, запредельную трудоёмкость и т.п. чуть ли не по всем аспектам, тогда как на самом деле это а) не так и б) зачастую обусловлено тем же контекстом, т.е. постановкой задачи, анализом требований и т.п.
ГВ>>То есть, она как бы есть, но её значимость как бы слегка эфемерна по отношению к тому набору требований, с которым приходится иметь дело C++-никам. VD>В большинстве случаев это домысли тех самых С++-ников.
Домыслы — это как раз попытка любой ценой соблюсти теоретическую цельность. ИМХО, бессмысленная и глупая затея: простое заколачивание гвоздя может быть обложено целой тучей теорий и псевдотеорий, но заколачивальщик вовсе не обязан им следовать.
ГВ>>А так — да, бесспорно. На Lisp можно написать очень много всего интересного. Если бы ещё не потеря производительности по сравнению с "убогим" C/C++ — всё было бы совсем хорошо. VD>Когда-то давно производительность Лиспа была огромной проблемой. Но сейчас есть высокопроизводительные компиляторы.
AFAIK, на данный момент Lisp примерно на 5-20% проигрывает C++, пробегало где-то на www.franz.com. Естественно, это не весь Lisp, вполне вероятно, что есть и пошустрее. Про SBCL я знаю, но сильно с ним не возился.
VD>Плюс Лисп позволят генерировать исполянемый код. Вот недавно мне дали ссылку на забавный продукт (можно сказать в некотором роде конкурент Немерла): VD>http://lambda-the-ultimate.org/node/3281 VD>Это язык основанный на Лиспе позволяющий расширять свой синтаксис и семантику. К сожалению, информации по нему пока очень мало. Но факт в том, что этот язык имеет библиотеку позволяющую преобразовывать код на этом языке в il тем самым уходя от интерпретации и получая высокопроизводительные решения.
Тоже неплохо.
ГВ>>Суть вещей — многогранное явление. Для каждого она своя. VD>Для людей не обладающих информацией она всегда однобока.
VD>>> Они придают плюсам оттенок помойки. Попиши сначала на полноценном ФЯ, а потом делай такие заявления. ГВ>>Помойка или нет — это сугубо эмоциональная оценка. VD>Эмоциональная она для тех, кто не видел библиотек функциональных языков. Там все очень смеялись бы увидев функции вроде find_if и count_if. Их авторам рассказали бы, что на то есть универсальные функции высшего порядка filter и fold, а find_if и count_if реализуются на их базе добавлением простейшей лямбды.
Да нет, она эмоциональная по сугубо формальным признакам. find_if и Co вполне решают свои задачи в рамках STL/C++. Понятно, что это не filter/fold, но тем не менее.
ГВ>> Зато нет никакой необходимости любой ценой приводить структуру потока управления в соответствие с некоторой "правильной парадигмой". VD>Это ты в том смысле сказал, что усе уже сделано не правильно и делать что-то правильно не надо?
Да не... Парадигм слишком много и каждая — самонаилучшая. С точки зрения адептов. Но абсолютная "правильность" — это миф такой, весьма живучий, вроде абсолютной качественности. Есть решения подходящие более или менее по вполне определённым критериям, вот и всё. Эти критерии выбираются исходя из требований текущих и прогнозируемых. Иногда удаётся предугадать изменение требований и тогда решение объявляется "правильным", иногда — нет и его объявляют "неправильным". Ну и ещё добавим сюда критерии, связанные с практическим удобством разработки и легко прогнозируемыми модификациями.
ГВ>>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта. VD>Забавно, что ты даже не понимаешь о чем идет речь. Речь же идет о побочных эффектах воплощения шаблонов. Эти эффекты позволяют заниматься метапрограммированием во время компиляции. Но как и все, что достигается не предусмотренными для этого средствами, данное решение является очень неудобным и ограниченным.
Удивительно, но именно шаблоны я и имел в виду.
ГВ>>А чистота "метапрограммирования", или "функционального программирования", или ещё какая "чистота" какой-нибудь очередной мутной "парадигмы" вообще не шибко-то кого и беспокоит (в мире C++). Пуризм — это ещё одно ругательство, как и BASIC, если ты не в курсе. Есть только два критерия: "удобно написать удобную фишку X" и "иметь возможности для отступления в случае потерь производительности". VD>Это как раз тот случай где отсутствие чистых и грамотных решений толкает на использование кривых.
Скажем так, это квинтэссенция практических мотиваций.
VD>Ты с книгами Александеску хорошо знаком?
Наизусть не помню, конечно. А что?
ГВ>>Теоретические же базисы хороши для формирования общей культуры программиста и исследования теоретических же проблем. Хотя это отнюдь не отрицает, например, того, что Lisp хорош в сфере обработки символических данных. Кстати, обрати внимание — Lisp тоже поддерживает императивный стиль одновременно с функциональным. VD>Да, да, да. Зачем наука в программировании? Ты давно всем доказал, что программирование особая отрасль и мозг в ней не нужен. Главное трясти по сильнее. То ли дело автомобили. Вот там наука важна. Ведь на автомобилях ездеем мы сами, а софт используют какие-то ламеры.
Да ну?! Вроде как я обычно доказываю прямо противоположное. Мозг как раз нужен и теоретическая подготовка — тоже. Так что, что-то ты перепутал.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Это нерелевантный в данном контексте вопрос, да и не смог бы я на него содержательно ответить, даже если бы и захотел. С другой стороны, cие не имеет ни малейшего значения с точки зрения оценки самого C++. Пойми, медленное развитие C++ как языка имеет свои положительные стороны — как минимум, разработчики компиляторов могут дать более качественные (оптимизированные и т.п.) компиляторы, чем это было бы в ситуации очень быстрых изменений. Во всяком случае, такое предположение вполне логично.
Качество компиляторов можно повысить спроектировав качественный язык, а не давая 10 лет на реализацию запутанного и мутного монстра.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
Х>язык C++ в своей молодости тоже бурно развивался, почитай D&E, только вот когда количество программистов на нём выросло до миллионов, количество платформ и компиляторов до десятков, то тут уже начинает главенствовать принцип "не навреди". C#, дай бог ему здоровья, если обретёт такой же ареал то будет развиваться тоже не шустро, уж поверь.
Не возьмусь оценить точные проценты применения, но почему-то мне кажется, что C#, а уж тем более Ява применяется гораздо чаще на сегодняшний день. И объясняется это тем, что он применяется для автоматизации предприятий и создания сайтов в интернет. В этих областях есть много нюансов и написать единый коробочный софт для них в принципе невозможно. А это ниша для огромных стад разработчиков. С++ же используется в последнее время больше частью для создания высокотиражных продуктов где стоимость разработки не так важна, так как окупается количеством продаж (т.е. — игры, ОС, офисные приложения), а меньшее потребление компьютерных ресурсов может увеличить объем продаж.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>>>2. Без GC толку от этого будет не много. ГВ>>ИМХО, ты ошибаешься. VD>Да? Объясни тогда оду простую вещь. Для эффективного использования замыканий сами замыкания и все на что они замкнуты (т.е. имеют ссылки) должно жить столько сколько живет само замыкание. А замыкание может быть передано в ФВП которая так же может передать его в другие ФВП. Как не имея системы автоматического управления памятью реализовать безопасные (не приводящие к UB ошибкам времени выполения) замыкания?
Замыкать можно ещё и значения. Значения указателей — в том числе и т.д., и т.п.
VD>>>Ошибаешься! Такие как ollv по незнанию или из фанатических побуждений применяют С++ там где ему совсем не место и в условиях где он противопоказан. ГВ>>Это слишком сильное утверждение, насчёт незнания и фанатизма. Так что, тут я согласиться не могу. VD>Что в нем сильного? Оно не противоречит утверждению, что есть люди использующие С++ осознанно и для задач где он является конкурентно-способным.
Вот это: "Такие как ollv". Если бы ты сказал "некоторые", я бы согласился. А так ты едва ли не прямо сомневаешься в квалификации ollv, что порицается правилами форума.
ГВ>>Не надо переворачивать с ног на голову. Сайты бывают разные, и требования — тоже разные. VD>Ага. Не надо. Не надо разглагольствовать о разных задах сайтов. С++ там по любому не место. Если только в виде какого-то там драйвера или мелкого компонента вроде ISAPI-фильтра.
Место ему там или нет — оставь решение этой задачи самим разработчикам сайтов. Полагаю, что их квалификации вполне достаточно для такого выбора. Ты скажи, ты сам много сайтов на C++ написал, а потом переписал их на что-то ещё, чтобы уверенно утверждать, что C++ не даёт никаких преимуществ?
ГВ>>MS и IBM (как и все остальные) вольны поступать так, как им заблагорассудится. VD>Ага. И выбирают для сайтов Яву и дотнет.
И что с того? Выбрали и выбрали. Как это должно сказываться на выборе, который делают совсем другие люди?
ГВ>> И кроме всего прочего, слишком мало критериев для отсечения C++: "в кратчайшие строки получить надежное решение, когда денег на разработку нехватает". Он запросто может оказаться наилучшим выбором с учётом других факторов. VD>Ага. Но другим фактором может быть только крайняя нужда в достижении высокой вычислительной производительности путем ручной оптимизации.
Отнюдь. Решающим фактором может оказаться всё, что угодно, вплоть до наличия под рукой подходящих библиотек и доступности программистов. А ещё фактором может оказаться, например, необходимость тащить .Net FW.
ГВ>> Тут проблема в другом: почему-то те, кто ругают C++ приписывают ему какую-то имманентную глюкавость, запредельную трудоёмкость и т.п. чуть ли не по всем аспектам, тогда как на самом деле это а) не так и б) зачастую обусловлено тем же контекстом, т.е. постановкой задачи, анализом требований и т.п. VD>Глюкавость приписывают не языку, а коду на нем написанном. И не почему-то, а исходя из общирного опыта и объективных логических рассуждений. Язык не типобезопасен, возлагает на программиста массу ответственности.
Э... Не так. C++ допускает опасные операции. Но вовсе не требует. А ответственность везде в цене, это от языка не зависит.
VD>Есть такое умное высказывание (не помню чье) — человек не должен делать работу которую может сделать машина. А С++ заставляет человека делать работу которую можно возложить на машину.
Не так. C++ позволяет человеку влезть в то, чем обычно занимается машина.
VD>Все остальное последсвия. Ну, и С++ как раз очень сильно сковывает программиста в выборе абстракции. По сути, большинство С++-программистов, начинают решать все задачи с помощью шаблонов.
Опять двадцать пять.
1. Ограничения на выбор допустимых абстракции есть у любого языка программирования. Так уж они, засранцы, устроены.
2. Шаблоны широко используются в программировании на C++. Не понятно, ты считаешь это негативной чертой? Или — ограничителем в выборе абстракции?
VD>Причем очень распростронено мнение, что производительность важнее качества.
Нередко производительность является составляющей интегральной характеристики "качественно".
VD>Многие защитники С++ приводят в качестве примера 3D-игры. Мол, "почему их пишут на С++?". А стоило бы посмотреть на другой аспект. Почти все эти игры безбожно глючат. Играть в некоторые до выхода патчей просто невозможно. Большая часть ошибок в этих играх могла бы быть попросту не допущена, будь программа написана на более качественном языке.
С чего ты это взял? Например, известно, что крутоглюкавый Сталкер (который без кучи патчей вылетает в самых неожиданных местах) написан с использованием Lua. Известна также душещипательная история о скоростной резке Сталкера перед выходом (часть карт порезана, часть выброшена и т.д.) Думается, что вторая причина посущественнее остальных будет.
ГВ>>AFAIK, на данный момент Lisp примерно на 5-20% проигрывает C++, пробегало где-то на www.franz.com. VD>Твой AFAIK. Высосан из пальцев. В прочем я не Лиспер и дать тебе точных данных не могу. Но я проверял их данные и скорее соглашусь с ними, а не с тобой. Кстати, проигрышь в 20% это вообще смешно. Отдельные компиляторы С++ проигрывают друг-другу в разны на разных задачах.
Не понял. Чьи данные ты проверял?
ГВ>>Да нет, она эмоциональная по сугубо формальным признакам. find_if и Co вполне решают свои задачи в рамках STL/C++. Понятно, что это не filter/fold, но тем не менее. VD>Офтоп — Люблю русский "да нет". VD>Если понятно, то лучше помалкивать про find_if и компанию. И уж точно не заикаться о "применимости к объектам разного класса" или как там?...
О чём не заикаться? Я тебя не понимаю что-то. fold, в общем, до какой-то степени эмулируется accumulate+boost::bind, а у find_if — своё, вполне определённое назначение и она вполне применима к широкому набору типов. Шаблон же, однако.
ГВ>>>>Забавно, что как раз использование "побочных эффектов" и делает C++ столь привлекательным по критерию производительности программиста при сохранении производительности продукта. VD>>>Забавно, что ты даже не понимаешь о чем идет речь. Речь же идет о побочных эффектах воплощения шаблонов. Эти эффекты позволяют заниматься метапрограммированием во время компиляции. Но как и все, что достигается не предусмотренными для этого средствами, данное решение является очень неудобным и ограниченным. ГВ>>Удивительно, но именно шаблоны я и имел в виду. VD>Да? Иди прочти еще раз свои слова. Если ты говорил о шаблонах, то они вообще теряют смысл.
Так... Тогда объясни, что ты считаешь "прямыми", а что "побочными" эффектами шаблонов?
VD>>>Это как раз тот случай где отсутствие чистых и грамотных решений толкает на использование кривых. ГВ>> Скажем так, это квинтэссенция практических мотиваций. VD>Это э....ыы... жопа, если одним словмо.
Real World, The.
VD>Если знаком (с МП на Lisp и Nemerle — ГВ.), то должен понимать, что это как небо и земля. В случае шаблонов С++ трудоемкость офигительная, сложность высокая, результат так себе и при этом все еще совсем плохо по ресурсам потребляемым компилятором. А в результате метапрограмма деже не может выдать сообщение об ошибке или обратиться к внешнему файлу. Ну, куда это годится?
А зачем метапрограмме на C++ обращаться к внешнму файлу, если эта самая метапрограмма "работать"-то может только во время компиляции? Что до сообщений об ошибках, тут согласен — подчас их весьма сложно анализировать. Ну и различия в МП мне тоже вполне понятны. Только я не согласен с тем, что результат — так себе. Вполне себе нормальный результат.
ГВ>>Да ну?! Вроде как я обычно доказываю прямо противоположное. Мозг как раз нужен и теоретическая подготовка — тоже. Так что, что-то ты перепутал. VD>Я перепутал? Ну, не знаю. Я тебя читал.
Просто любопытно: из чего ты сделал вывод, что я считаю, что "мозг не нужен" и "главное — трясти"?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Erop, Вы писали:
E>>Да, так бывает. И не только в ПО. И не только сейчас, но и раньше было. E>>То, что ты не умеешь искать такие позиции, всего лишь говорит что-то о тебе, а не об окружающем мире... E>>Можешь подумать над значением слова "подмастерье"...
VD>Ой, я же забыл. Мы же о сапожниках говорим. Вот только ученикам зарплату не платили. Им максимум еду давали. VD>Почему всем будет смешно, если им расскажут о подмастерьи физика, химика или врача. Так почему же подмастерья программистов обсуждаются серьезно?
Очень просто. Профессия программиста стоит особняком. У Макконнела ("Совершенный код") написано что программистами становятся 40% (боюсь тут соврать) не профильных программистов. А физиков сколько непрофильных? Химикив? Вот и ответ. Если речь идет о системных программистах, то да — это серъезно, а в остальном случае важнее может оказаться иная специальность. Мне кажется, что в большинстве случаев важнее математические способности или физические или экономические, так как сам, решая задачи медленно но верно из освоения технологии скатываюсь к книжкам по алгоритмам. Язык программирования и технологии вторичны.
Про подмастерья не согласен. Надо учить и платить. И чем талантливее ученик, тем больше платить. А то, что я слышу, это просто отголоски честолюбия и высокомерия. Вот только должно быть по Фаусту — "Наследовать достоин тот, кто сам способен дать наследство." Я так считаю.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором. G>Очень мало таких ситуаций. На практике оказывается что там где подходит С++ на самом деле нужно что-то вроде C_ _ классами. Высокоуровневые абстакции С++ идут лесом, упор делается на вычисления.
http://en.wikipedia.org/wiki/Objective-C — во многих смыслах замечательное решение, а с недавних пор еще и автоматическая сборка муссора появилась (опционально).
Здравствуйте, gandjustas, Вы писали:
ГВ>>Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором. G>Очень мало таких ситуаций. На практике оказывается что там где подходит С++ на самом деле нужно что-то вроде C_ _ классами. Высокоуровневые абстакции С++ идут лесом, упор делается на вычисления.
По чьей практике так оказывается?
ГВ>>Ты, почему-то, додумываешь, что это является призывом использовать C++ где ни попадя, вопреки здравому смыслу. G>Ну попытка использвания C++ для сайтов или High-load сценариев — вопреки здравому смыслу. G>Хотя многие тут уверены в обратном.
Вероятно, нужно обратиться к тем, кто использует C++ для high-load. Тогда всё станет на свои места.
ГВ>>Прям, не язык, а монстр. (отсмеяшись) Знаешь, где самые страшные монстры? В воображении! G>Сарказм здесь не уместен. C++ действительно заставляет программиста работать на очень низком уровне, даже если ему этого не хочется. G>Это огромная проблема для языка.
Скажем так, это неотъемлемая черта языка — возможность работы с низким уровнем. Надо это делать или нет — зависит от.
ГВ>>Есть ещё abstraction penalty. AFAIK, Java и .Net на данный момент справляются с ним несколько хуже, чем C++. Возможно, что когда-нибудь ситуация изменится, я это вполне допускаю. Только не надо читать мне лекцию по JIT-компиляции и возможностях этого подхода, я их отлично представляю. G>О каком конкретно abstarction penality идет речь?
Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв".
ГВ>>И что характерно — она глючит похлеще движка. Если прикинуть, то ИМХО, плотность глюков на единицу скриптового кода получается поболе, чем в движке. G>Только глюк в движке на С++ приведет к AV и падению, а глюк в игрологике может остаться незамеченным совсем.
Ну да! Ещё как замеченным!
ГВ>>Я думаю, что на этот вопрос нет ответа. Единственно, что будь игровая логика написана на C++, её было бы не так легко модифицировать моддерам. G>На самом деле на С++ она не была бы написана никогда.
О! Свежая мысль.
ГВ>>Синтетика не показательная. Например, что касается C++-ного фрагмента, то он может быть и вот таким: ГВ>>
Да на здоровье. Можно и ссылки, и указатели запихнуть.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором. G>>Очень мало таких ситуаций. На практике оказывается что там где подходит С++ на самом деле нужно что-то вроде C_ _ классами. Высокоуровневые абстакции С++ идут лесом, упор делается на вычисления. ГВ>По чьей практике так оказывается?
По практике общения здесь в первую очередь.
Все "защитники" С++, если хоть немного разбираются в managed языках, упор делают а performance в C++.
Причем с++ обеспечивает быстродействие в числомолотильных алгоримтах в первую очередь. Там где требуется активная работа с памятью, сложными структурами данных, С++ без приседаний с аллокаторами сливает.
ГВ>>>Ты, почему-то, додумываешь, что это является призывом использовать C++ где ни попадя, вопреки здравому смыслу. G>>Ну попытка использвания C++ для сайтов или High-load сценариев — вопреки здравому смыслу. G>>Хотя многие тут уверены в обратном. ГВ>Вероятно, нужно обратиться к тем, кто использует C++ для high-load. Тогда всё станет на свои места.
Если кто-то пишет High-load на С++, то это не означает что так надо делать. Кроме того некоторые системы могут бть написаны на С++ по историческим причинам.
Вообще аппеляции к тому что "кто-то так делает" не показывают равильность такого применения.
ГВ>>>Прям, не язык, а монстр. (отсмеяшись) Знаешь, где самые страшные монстры? В воображении! G>>Сарказм здесь не уместен. C++ действительно заставляет программиста работать на очень низком уровне, даже если ему этого не хочется. G>>Это огромная проблема для языка. ГВ>Скажем так, это неотъемлемая черта языка — возможность работы с низким уровнем. Надо это делать или нет — зависит от.
Не надо подменять понятия, в С++ это не возможность, а необходимость.
ГВ>>>Есть ещё abstraction penalty. AFAIK, Java и .Net на данный момент справляются с ним несколько хуже, чем C++. Возможно, что когда-нибудь ситуация изменится, я это вполне допускаю. Только не надо читать мне лекцию по JIT-компиляции и возможностях этого подхода, я их отлично представляю. G>>О каком конкретно abstarction penality идет речь? ГВ>Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв".
И что? 2-3 виртуальных вызова вообще незаметны будут ни при каком раскладе.
Давай конкретно, о каком penality идет речь?
вот насчет abstarction gain — оно есть в .NET. Одно из проявлений — динамическая кодогенерация. Я недавно писал runtime-генератор конечных автоматов по описанию. В С++ такое в принципе невозможно.
ГВ>>>Синтетика не показательная. Например, что касается C++-ного фрагмента, то он может быть и вот таким: ГВ>>>
G>>А если выражение лямбды работает не с числами? ГВ>Да на здоровье. Можно и ссылки, и указатели запихнуть.
Ну и как быдет выглядет "лямбда" на C++, в которой вызывается метод объекта-параметра и его результат сравнивается к чем-либо?
Здравствуйте, gandjustas, Вы писали:
ГВ>>Вероятно, нужно обратиться к тем, кто использует C++ для high-load. Тогда всё станет на свои места. G> G>Если кто-то пишет High-load на С++, то это не означает что так надо делать. Кроме того некоторые системы могут бть написаны на С++ по историческим причинам. G>Вообще аппеляции к тому что "кто-то так делает" не показывают равильность такого применения.
Не только. То, что "кто-то так делает" не показыват ни априорную правильность, ни априорную неправильность такого решения. Всё, что таким образом можно показать, так это в буквальном смысле то, что "кто-то так делает".
G>>>Это огромная проблема для языка. ГВ>>Скажем так, это неотъемлемая черта языка — возможность работы с низким уровнем. Надо это делать или нет — зависит от. G>Не надо подменять понятия, в С++ это не возможность, а необходимость.
Э... Тогда поясни, что имеется в виду под низким уровнем? __asm, void*, арифметика указателей или вообще любые упоминания указателей?
ГВ>>>>Есть ещё abstraction penalty. AFAIK, Java и .Net на данный момент справляются с ним несколько хуже, чем C++. Возможно, что когда-нибудь ситуация изменится, я это вполне допускаю. Только не надо читать мне лекцию по JIT-компиляции и возможностях этого подхода, я их отлично представляю. G>>>О каком конкретно abstarction penality идет речь? ГВ>>Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв". G>И что? 2-3 виртуальных вызова вообще незаметны будут ни при каком раскладе. G>Давай конкретно, о каком penality идет речь?
Ну, во-первых, к 2-3 виртуальным вызовам абстракции редко сводятся, а во-вторых, здесь мне надо поискать отдельно. От ответа не отказываюсь, просто нужно кое-какие детали восстановить.
G>Ну и как быдет выглядет "лямбда" на C++, в которой вызывается метод объекта-параметра и его результат сравнивается к чем-либо?
class Foo {
public:
int foo(){...};
};
std::vector<Foo*> vec;
find_if (myvector.begin(), myvector.end(), bind(&T::foo, _1) != 42);
Это опять таки — бустовая примочка.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
.
Обращение не конкретно к ГВ, а к тем, кто пожелает защитить честь неуправляемого кода, или просто помочь человеку разобраться с тем, что он делает не так.
Кстати, это далеко не первый случай выбора платформы по бенчмарку Дело даже не в бенчмарке, а в том, _какие_ специалисты делают эти бенчмарки и принимают потом решения.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>Если кто-то пишет High-load на С++, то это не означает что так надо делать. Кроме того некоторые системы могут бть написаны на С++ по историческим причинам. G>>Вообще аппеляции к тому что "кто-то так делает" не показывают равильность такого применения. COF>Хм, а на что тогда опираться? на победные реляции сан и микрософт? Критерий истины — практика
Факторы, влиящие на практическе применение, зачастую очень далеки от технических.
ГВ>>>Да он почти всегда к одному сводится: к куче вложенных вызовов "абстрактных слоёв". G>>И что? 2-3 виртуальных вызова вообще незаметны будут ни при каком раскладе. G>>Давай конкретно, о каком penality идет речь?
COF>Так скажем, не будут заметны в большинстве случаев. Однако, опираясь на практику как критерий истины , я могу однозначно сказать, что не только виртуальные, но и обычные вызовы влияют на производительность. Проверяется это очень просто — я интенсивно использую инлайны в проектах на C++, так вот время отклика для релизной версии в несколько раз (если не на порядок) лучше чем в отладочной — скажем 40-50 мс и 300-400 мс. Что это значит для пользователя я думаю объяснять не надо. Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает. На C++ так извращаться не надо — в итоге программы получаются эффективными, но асбсолютно не теряют в читаемости. В принципе, это была изначальная цель при создании C++ и она с успехом достигнута.
Думаешь разница в скорости между release и debug достигается инлайнингом?
Кстати JIT сам умеет инлайнить, прчием начиная с 3.5SP1 весьма неплохо.
COF>У C++ конечно есть недостатки и наверное можно придумать язык лучше, но по моему проблема в том, что вместо лучшего навязывается другое. Скажем, лисп — это отличный язык, но он не лучше и не хуже C++, он просто другой. То же самое с C# и явой.
Lisp — не mainstream, изначально по причине медленности, впоследствии из-за своего синтаксиса.
Здравствуйте, Геннадий Васильев, Вы писали:
G>>>>Это огромная проблема для языка. ГВ>>>Скажем так, это неотъемлемая черта языка — возможность работы с низким уровнем. Надо это делать или нет — зависит от. G>>Не надо подменять понятия, в С++ это не возможность, а необходимость. ГВ>Э... Тогда поясни, что имеется в виду под низким уровнем? __asm, void*, арифметика указателей или вообще любые упоминания указателей?
1)Ручное управление памятью, надо следить чтобы указатель нигде не повис. Использовать умные указатели или следить чтобы везде вызывался delete
2)Арифметика указателей, надо следить чтобы использовались STL-ные итераторы вместо указателей
3)Даже с бустом сложные лямбды надо формировать кучей методов bind.
4)Небезопасные приведения типов
продолжать можно долго...
Здравствуйте, gandjustas, Вы писали:
G>Думаешь разница в скорости между release и debug достигается инлайнингом? G>Кстати JIT сам умеет инлайнить, прчием начиная с 3.5SP1 весьма неплохо.
Здравствуйте, gandjustas, Вы писали:
G>Я писал такой тест в этой теме, смотри выше, C++ слил в 3-6 раз. Это без шаред птр G>А потом прибежали другие и начали рассказывать что они динамическую память не выделяют и создают все на стеке
Ты мерял там на самом деле разницу в производительности GC и WinAPI функции HeapAlloc.
А никак не работу с shared ptr.
G>Ответь на вопрос, нафига MAPI в .NET?
Вот хочется ему. Представь что он заказчик и ему надо именно MAPI.
G>Возьми DLL, скомпилированную Intel C++ Compiler и напиши в visual studio код, который создает объект из этой либы — придет понимание.
ICC манглит имена так же как и визжалка. Так что никаких проблем не ожидается.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
. S>Обращение не конкретно к ГВ, а к тем, кто пожелает защитить честь неуправляемого кода, или просто помочь человеку разобраться с тем, что он делает не так.
Да что там защищать-то? Там одна fprintf чего стоит — она сама по себе тормоз ещё тот.
S>Кстати, это далеко не первый случай выбора платформы по бенчмарку Дело даже не в бенчмарке, а в том, _какие_ специалисты делают эти бенчмарки и принимают потом решения.
[шутка on]
Да-да! Вот у _таких_ специалистов-то .Net и оказывается шустрее всего вокруг.
[шутка off]
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Э... Тогда поясни, что имеется в виду под низким уровнем? __asm, void*, арифметика указателей или вообще любые упоминания указателей? G>1)Ручное управление памятью, надо следить чтобы указатель нигде не повис. Использовать умные указатели или следить чтобы везде вызывался delete G>2)Арифметика указателей, надо следить чтобы использовались STL-ные итераторы вместо указателей G>3)Даже с бустом сложные лямбды надо формировать кучей методов bind. G>4)Небезопасные приведения типов G>продолжать можно долго...
Понятно. Справедливости ради:
— арифметикой указателей можно и не пользоваться;
— bind — это уже не низкий уровень;
— правильные приведения типов (не через static_cast<void*>) никаких нежданных побочных эффектов не имеют.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Понятно. Справедливости ради: G>Ты опыть не понял о чем тебе толкуют.
Понял, только не согласен с оценкой перечисленных фич, как низкоуровневых.
ГВ>>- арифметикой указателей можно и не пользоваться; G>Можно и С++ не пользоваться. G>А если пользоваться С++, то постоянно следить чтобы нигде не накосячить, чтобы не использовать арифметику указателей вмето итераторов, чтобы не использовать обычны указатели вместо умных итп. G>В нормальных языках за этим следит компилятор и рантайм. В C# для работы с указателями программист должен описать это явно. А вызывающий код может отказаться вызывать, то что небезопасно.
Мне кажется, ты дуешь на воду. Проблема выбора, конечно, существует, но я не склонен считать её чем-то слишком трудным. Но, в любом случае, твоё мнение мне теперь понятно.
ГВ>>- bind — это уже не низкий уровень; G>Очень низкий. Связыванием должен заниматься компилятор, а не программист. Для простых типов и арифметических операция в C++ этого удалось добиться, а для всех остальных — нет.
Ну вот уже ты, по-моему, путаешься. Описанием связывания в любом случае занимается программист. И потом, bind — это, в общем-то, не полноценные лямбды, как ни крути. Показательно то, что на C++ их можно реализовать.
ГВ>>- правильные приведения типов (не через static_cast<void*>) никаких нежданных побочных эффектов не имеют. G>Введение дополниельных конструкций для "правильного приведения типов" уж точно не свидетельствует о высокоуровневости языка. G>В остальном аналогично указателям.
Как раз строго наоборот. xxxxx_cast потому и сделаны такими, чтобы указать на неправильность подобных приведений. Естетсвенные приведения (от наследника к родителю) выполняются прозрачно, без дополнительных инструкций.
ГВ>>P.S.: Не хочешь высказаться по IoC
? G>Хочу. Код также свидетельствует о черезмерной низкоуровневости С++. Метаинформацией о типах дожен заниматься рантайм, а не программист.
А где ты там метаинформацию нашёл?
G>Все остальное — действительно задача, которая решается неочень опытным программистом в короткое время.
+1
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>>>Ответь на вопрос, нафига MAPI в .NET? CC>>Вот хочется ему. Представь что он заказчик и ему надо именно MAPI. G>Если заказчик диктует технические решения, то я с таким не связываюсь. И другим не рекомендую.
Заказчик сам может быть вынужден диктовать технические решения.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Кто это тут защищал использование C++ там, где он не подходит должным образом? По-моему, тебе померещилось. Разговор идёт о гротескной преувеличенности недостатков C++ и о том, что в некоторых ситуациях он оказывается наилучшим выбором. G>>Очень мало таких ситуаций. На практике оказывается что там где подходит С++ на самом деле нужно что-то вроде C_ _ классами. Высокоуровневые абстакции С++ идут лесом, упор делается на вычисления.
ГВ>По чьей практике так оказывается?
Здравствуйте, MxKazan, Вы писали:
COF>>Да что там говорить, достаточно почитать рекомендации по написанию производительного кода на яве или .нет — как можно меньше маленьких функций, объектов, все вычисления выносить в одну большую простыню, тогда может jit что-то и сделает. MK>А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций?
+1 Сколько лет на дотнет пишу, а впервый раз слышу такое.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, MxKazan, Вы писали:
MK>>А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций? MK>>А то страшно стало! Быстрее всё всё всё в main переношу...
COF>Пожалуйста, не поленился и специально нашел такой пример
COF>http://www.cnblogs.com/jerryzhao/archive/2007/08/29/873986.html
COF>One of the ways in which you can improve the performance of loading a form is by reducing the number of method calls made during form initialization.
Оттуда же
This application was built using the Release profile and deployed to the Pocket PC 2002 emulator, where it was run 5 times.
Под покетом походу надо и на длине названий методов экономить
Здравствуйте, COFF, Вы писали:
MK>>А можно ссылку на эту рекомендацию писать как можно меньше маленьких функций? MK>>А то страшно стало! Быстрее всё всё всё в main переношу...
COF>Пожалуйста, не поленился и специально нашел такой пример
COF>http://www.cnblogs.com/jerryzhao/archive/2007/08/29/873986.html
COF>One of the ways in which you can improve the performance of loading a form is by reducing the number of method calls made during form initialization.
Раз: Improving Microsoft .NET Compact Framework-based Application Form Load Performance
Два: March 2002
Три: Microsoft® .NET Compact Framework 1.0
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, samius, Вы писали:
S>>Если кто так не сделает, то его код будет работать медленнее, чем C++ и ему никак не догнать плюсы по перфомансу, что означает конец карьеры программиста
COF>На самом деле, это все (и еще много чего другого) я делаю когда пишу на C++, если надо написать действительно быстрый код. То что Вас это забавляет показывает только то, что с задачами, критичными по скорости Вам сталкиваться не приходилось. Увы...
Возможно не в той степени, что Вам...
Предпочитаю другие методы оптимизации. В тех задачах, с которыми я сталкивался их хватало. До экономии на минимизации кол-ва методов не доходило. (Заменять вызовы через интерфейс в дотнете на другие вызовы — приходилось)
Здравствуйте, criosray, Вы писали:
C>Раз: Improving Microsoft .NET Compact Framework-based Application Form Load Performance C>Два: March 2002 C>Три: Microsoft® .NET Compact Framework 1.0
C>Акелла промахнулся. :down:
Ну да, а что, что-то принципиально поменялось? Я именно тогда эту статью и читал. Более того, и сейчас используется огромное количество устройств с .NET Compact Framework 1.0.
Здравствуйте, COFF, Вы писали:
COF>Пожалуйста, не поленился и специально нашел такой пример COF>http://www.cnblogs.com/jerryzhao/archive/2007/08/29/873986.html COF>One of the ways in which you can improve the performance of loading a form is by reducing the number of method calls made during form initialization.
Не, ты правда относишь эти рекомендации в разряд общих, относящихся ко всему Фреймворку в его текущей реализации, ммм?
Здравствуйте, criosray, Вы писали:
C>Быстрый код получается не тогда, когда Вы тратите 90% времени на техническую оптимизацию кода и 10% на алгоритмизацию, а 90% на алгоритмизацию, 10% на техническую оптимизацию.
Конечно я в курсе, что любую программу можно ускорить если заменить сортировку пузырьком на что-то более продвинутое :)
Здравствуйте, COFF, Вы писали:
C>>Раз: Improving Microsoft .NET Compact Framework-based Application Form Load Performance C>>Два: March 2002 C>>Три: Microsoft® .NET Compact Framework 1.0
C>>Акелла промахнулся.
COF>Ну да, а что, что-то принципиально поменялось? Я именно тогда эту статью и читал. Более того, и сейчас используется огромное количество устройств с .NET Compact Framework 1.0.
Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5
Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
C>>Быстрый код получается не тогда, когда Вы тратите 90% времени на техническую оптимизацию кода и 10% на алгоритмизацию, а 90% на алгоритмизацию, 10% на техническую оптимизацию.
COF>Конечно я в курсе, что любую программу можно ускорить если заменить сортировку пузырьком на что-то более продвинутое
Очень рад, что Вы знаете сортировку пузырьком. Надеюсь, Вы так же знаете, что это самое ускорение от замены сортировки пузырьком на "что-то более продвинутое" далеко не всегда рационально?
Здравствуйте, COFF, Вы писали:
C>>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
COF>Нет, не вижу разницы. Серьезно
Зачем же так откровенно выставлять на показ свое невежество?..
Здравствуйте, MxKazan, Вы писали:
MK>Т.е. это проблема Forms Designer, а никак не .Net. MK>И если бы дизайнер генерил не очень удачный C++ код, к нему можно было бы предъявить точно такие же претензии.
Хорошо, вот более релевантная ссылка — просто не имею привычки (к сожалению) локально сохранять все статьи, которые я прочитал, чтобы при случае была возможность блеснуть на rsdn :) Поэтому пришлось погуглить немного
Здравствуйте, COFF, Вы писали:
C>>Зачем же так откровенно выставлять на показ свое невежество?..
COF>То есть таки под мобильные устройства надо писать на C++, не используя CF, я так понимаю этот вот пассаж про невежество?
Здравствуйте, MxKazan, Вы писали:
COF>>Пожалуйста, не поленился и специально нашел такой пример COF>>http://www.cnblogs.com/jerryzhao/archive/2007/08/29/873986.html COF>>One of the ways in which you can improve the performance of loading a form is by reducing the number of method calls made during form initialization. MK>Не, ты правда относишь эти рекомендации в разряд общих, относящихся ко всему Фреймворку в его текущей реализации, ммм?
Справедливости ради, часть этих рекомендаций действительно общего характера. К примеру, про avoid boxing/unboxing совершенно верно написано (впрочем, заметное падение производительности будет лишь на многократно повторяющихся операциях в короткий промежуток времени...).
Но вот про "избегайте использовать много мелких объектов и мелких методов" — полный бред.
ГВ>>>- bind — это уже не низкий уровень; G>>Очень низкий. Связыванием должен заниматься компилятор, а не программист. Для простых типов и арифметических операция в C++ этого удалось добиться, а для всех остальных — нет. ГВ>Ну вот уже ты, по-моему, путаешься. Описанием связывания в любом случае занимается программист.
Да ну. Вот я пишу лямбду на C#: x => x.SomeMethod() == someValue, при этом someValue создает полноценное лексическое замыкание, которое в С++ невозможно вообще. Где здесь связывание?
ГВ>И потом, bind — это, в общем-то, не полноценные лямбды, как ни крути. Показательно то, что на C++ их можно реализовать. Показательно то что их нет в современном языке.
? G>>Хочу. Код также свидетельствует о черезмерной низкоуровневости С++. Метаинформацией о типах дожен заниматься рантайм, а не программист. ГВ>А где ты там метаинформацию нашёл?
TypeName, TrivialClassTraitDep1, TrivialClassTraitDep2, методы контейнера RegisterDep1, RegisterDep2, RegisterDep. В той или иной мере реализуют метаинформацию.
Здравствуйте, gandjustas, Вы писали:
ГВ>>>>- bind — это уже не низкий уровень; G>>>Очень низкий. Связыванием должен заниматься компилятор, а не программист. Для простых типов и арифметических операция в C++ этого удалось добиться, а для всех остальных — нет. ГВ>>Ну вот уже ты, по-моему, путаешься. Описанием связывания в любом случае занимается программист. G>Да ну. Вот я пишу лямбду на C#: x => x.SomeMethod() == someValue, при этом someValue создает полноценное лексическое замыкание, которое в С++ невозможно вообще. Где здесь связывание?
А упоминание someValue вот здесь: x => x.SomeMethod() == someValue — это что, как не описание того, что нужно связать, сиречь, описание связывания?
Ровно то же самое делается на C++: bind(&X::SomeMethod, _1) == someValue. И тоже, знаешь ли, полноценное лексическое замыкание. В конце концов, главное при создании замыкания что? ИМХО — связать переменные локального контекста с параметрами (или переменными) некоторой функции. Совершенно не важно, используем мы ссылки или значения. По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#.
Но и в том, и в другом случае программист описывает, что именно связыватся.
ГВ>>И потом, bind — это, в общем-то, не полноценные лямбды, как ни крути. Показательно то, что на C++ их можно реализовать. G> Показательно то что их нет в современном языке.
Как это — нет? А новый стандарт? А новый компилятор от MS (который, правда, я ещё не щупал)? Всё есть, вроде. И опять таки, bind — пусть и не полноценная замена, но по крайней мере, для "маленьких функций" — вполне подходящее решение. Примечательно же оно тем, что получено средствами самого C++.
ГВ>>>>P.S.: Не хочешь высказаться по IoC
? G>>>Хочу. Код также свидетельствует о черезмерной низкоуровневости С++. Метаинформацией о типах дожен заниматься рантайм, а не программист. ГВ>>А где ты там метаинформацию нашёл? G>TypeName, TrivialClassTraitDep1, TrivialClassTraitDep2, методы контейнера RegisterDep1, RegisterDep2, RegisterDep. В той или иной мере реализуют метаинформацию.
Хм. Я бы так не сказал, поскольку Traits используются для конструирования типа (для инстанцирования RegisterDep). Ну а сами RegisterDep просто зависят от типа используемого конструктора (учтём, что сигнатура = тип функции), точно так же, как и любая функция требует параметров вполне определённых типов. Но мы же не называем требование соблюдать типы параметров функции использованием метаданных. А не то, знаешь, можно любое наследование метаданными назвать.
Программист в данном случае должен только выбрать, как именно регистрировать в контейнере тот или иной тип. Но это всегда обязанность программиста, выбор нужного конструктора полностью на компилятор не переложишь.
Исключение, пожалуй, TypeName — эта структура, действительно, похожа на метаданные — то есть такие данные, которые сопоставляются типу, но прямо в него не включены. Но от TypeName можно избавиться посредством type_info — тогда метаданными будет заниматься только рантайм. Мне просто хотелось оставить возможность назначать объектам идентификаторы разных типов: GUID, int, const wchar_t * и так далее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>Быстрый код получается не тогда, когда Вы тратите 90% времени на техническую оптимизацию кода и 10% на алгоритмизацию, а 90% на алгоритмизацию, 10% на техническую оптимизацию.
Назвать тот бред, что ты перечислил оптимизациями вообще язык не поворачивается. Ту чушь оптимизируют компиляторы (JIT или обычные). Ручное вмешательство там на сегодня только вредит, так как нарушает те самые партерный что оптимизируются компиляторами.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, COFF, Вы писали:
COF>http://www.cnblogs.com/jerryzhao/archive/2007/08/29/873986.html
COF>One of the ways in which you can improve the performance of loading a form is by reducing the number of method calls made during form initialization.
Уважаемый! Прежде чем давать ссылки на что-то, не плохо было бы прочесть то на что даешь ссылку.
В этой ссылке написано, что если в API есть метод позволяющий задать значение за один раз, то нужно использовать его, а не несколько отдельных вызовов. Вот пример оттуда:
this.textBox1.Location = new Point(10,20);
this.textBox1.Size = new Size(72,23);
This can be consolidated into a single method call by using the Bounds property:
this.textBox1.Bounds = new Rectangle(10,20,72,23);
Самое смешно, что увеличение производительности тут достигается не за счет уменьшения времени затрачиваемого на лишний вызов, а за счет того, что оконной системе приходится меньше перерисовывать свое изображение и пересчитывать свои размеры.
Правило универсальное. Применимо и для любой программы написанной на С++. Так что мотай на ус.
ЗЫ
Не выставляй себя полным ламером. Молчи по тем темам в которых не шаришь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, criosray, Вы писали:
C>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
Этот пример справедлив и для настольного фрэймворка последней версии. Ты вчитайся в код. Там не о экономии на вызове метода речь идет. Там речь о том, что не надо устанавливать размеры окна в два приема, если тоже самое можно сделать за один прием.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, criosray, Вы писали:
C>Но вот про "избегайте использовать много мелких объектов и мелких методов" — полный бред.
Не. Для Компакт-фрэймворка, особенно старых версий — это правильная рекомендация. GC там весьма примитивный. Никакой инкрементальной сборки. Так что и правад укрупнение объектов имело смысл. К тому же любой объект занимает лишнее место (для обычного фрэймворка это где-то 12 байт), так что укрупнение может дать выигрыш. Вопрос только в том, что актуальным этот совет будет если в память нужно поднять миллионы объектов. Естественно, что на обычном фрэймворке такой совет полная чушь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>На самом деле это многое говорит... о тебе. :))
Я просто стараюсь избегать преждевременной пессимизации кода. В итоге, наши программы работают лучше программ конкурентов, что приносит вполне ощутимое конкурентное преимущество.
Здравствуйте, VladD2, Вы писали:
C>>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
VD>Этот пример справедлив и для настольного фрэймворка последней версии. Ты вчитайся в код. Там не о экономии на вызове метода речь идет. Там речь о том, что не надо устанавливать размеры окна в два приема, если тоже самое можно сделать за один прием.
Хорошо, тут я был не прав. Привел неудачный пример. Но я действительно неоднократно видел подобные рекомендации — ссылок к сожалению не сохранил, поэтому пытался найти в гугле что есть :) Да и ты сам ниже подтверждаешь мои слова.
Вообще, в чем принципиальное отличие компактного фреймворка от большого — только в том, что последний работает на компьютере с ограниченными ресурсами. И вот тут все прелести managed языков в плане ресурсоемкости и производительности вылезают во всей красе. Только и всего. На десктопе, и особенно на сервере этого не заметно, или так скажем не так явно заметно. Вот только пользователи жалуются — типа установил консоль оракла написанную на яве и ничего больше запустить не могу, съела всю память :)
C>>Быстрый код получается не тогда, когда Вы тратите 90% времени на техническую оптимизацию кода и 10% на алгоритмизацию, а 90% на алгоритмизацию, 10% на техническую оптимизацию.
VD>Назвать тот бред, что ты перечислил оптимизациями вообще язык не поворачивается. Ту чушь оптимизируют компиляторы (JIT или обычные). Ручное вмешательство там на сегодня только вредит, так как нарушает те самые партерный что оптимизируются компиляторами.
Здравствуйте, COFF, Вы писали:
C>>>Ну во-первых, очень многое поменялось и сейчас 99% WM устройств с .NET CF 3.5 C>>>Во-вторых, Вы не видитте разницы между CLR для мобильных телефонов и CLR для полноценных компьютеров?
VD>>Этот пример справедлив и для настольного фрэймворка последней версии. Ты вчитайся в код. Там не о экономии на вызове метода речь идет. Там речь о том, что не надо устанавливать размеры окна в два приема, если тоже самое можно сделать за один прием.
COF>Хорошо, тут я был не прав. Привел неудачный пример. Но я действительно неоднократно видел подобные рекомендации — ссылок к сожалению не сохранил, поэтому пытался найти в гугле что есть Да и ты сам ниже подтверждаешь мои слова.
COF>Вообще, в чем принципиальное отличие компактного фреймворка от большого — только в том, что последний работает на компьютере с
Это не отличие фреймворка. Это отличие рабочих условий. COF>ограниченными ресурсами. И вот тут все прелести managed языков в плане ресурсоемкости и производительности вылезают во всей красе. Только и всего. На десктопе, и особенно на сервере этого не заметно, или так скажем не так явно заметно. Вот только пользователи жалуются — типа установил консоль оракла написанную на яве и ничего больше запустить не могу, съела всю память
А вот у меня на WM6.1 устройстве с .NET CF 3.5 есть три приложения на .NET CF и визуально по производительности они ничуть не уступают приложениям на С++ (MFC) — летают.
Здравствуйте, criosray, Вы писали:
COF>>Вообще, в чем принципиальное отличие компактного фреймворка от большого — только в том, что последний работает на компьютере с C>Это не отличие фреймворка. Это отличие рабочих условий. COF>>ограниченными ресурсами. И вот тут все прелести managed языков в плане ресурсоемкости и производительности вылезают во всей красе. Только и всего. На десктопе, и особенно на сервере этого не заметно, или так скажем не так явно заметно. Вот только пользователи жалуются — типа установил консоль оракла написанную на яве и ничего больше запустить не могу, съела всю память :) C>А вот у меня на WM6.1 устройстве с .NET CF 3.5 есть три приложения на .NET CF и визуально по производительности они ничуть не уступают приложениям на С++ (MFC) — летают.
Хорошо, что это за приложения? Я их поставлю и если они действительно летают, то я признаю свою неправоту :)
Здравствуйте, gandjustas, Вы писали:
ГВ>>Ровно то же самое делается на C++: bind(&X::SomeMethod, _1) == someValue. И тоже, знаешь ли, полноценное лексическое замыкание. В конце концов, главное при создании замыкания что? ИМХО — связать переменные локального контекста с параметрами (или переменными) некоторой функции. Совершенно не важно, используем мы ссылки или значения. G>Важно. Если связать что-нить с объектом в хипе, выделенном в текущем скоупе, и время жизни лямбды больше, чем текущий скоуп, то получится утечка.
А... Так ты про согласование жизненных циклов? Ну тогда да. Только это не "связывание", вроде, а "согласование ЖЦ".
ГВ>>По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#. G>Не надо торговаться. лямбды и замыкания в С++ ущербны.
Не "ущербны", а специфичны для C++. У любого языка есть своя специфика.
ГВ>>Но и в том, и в другом случае программист описывает, что именно связыватся. G>Нет, в случае C# программист пишет функцию. Ему не надо вникать что там внутри компилятора происходит. В случае C++ он должен заниматься сввязыванием.
Ну всё, я уже понял. C++-ник должен отследить согласованность ЖЦ. Да, это есть, хотя и далеко от чудовищной проблемности, приписываемой такому подходу. Ну и опять таки.... Ладно, хватит уже про shared_ptr.
ГВ>>Как это — нет? А новый стандарт? А новый компилятор от MS (который, правда, я ещё не щупал)? Всё есть, вроде. И опять таки, bind — пусть и не полноценная замена, но по крайней мере, для "маленьких функций" — вполне подходящее решение. Примечательно же оно тем, что получено средствами самого C++. G>Ну и где этот стандарт?
Планируется к принятию. Компилятор, AFAIK, уже вышел. (Можно подумать, что появись этот стандарт прямо сейчас, что-то бы изменилось в твоей риторике! Ага, верю я...)
ГВ>>Хм. Я бы так не сказал, поскольку Traits используются для конструирования типа (для инстанцирования RegisterDep). Ну а сами RegisterDep просто зависят от типа используемого конструктора (учтём, что сигнатура = тип функции), точно так же, как и любая функция требует параметров вполне определённых типов. G>Это и есть метаданные типов.
Понятно. Значит, любую привязку к типу сейчас нужно называть использованием метаданных. А мужики-то...
ГВ>>Программист в данном случае должен только выбрать, как именно регистрировать в контейнере тот или иной тип. Но это всегда обязанность программиста, выбор нужного конструктора полностью на компилятор не переложишь. G>На компилятор — нет, а на контейнер — можно.
А как контейнер вычислит, что мне нужен именно определённый конструктор? Допустим, что у объекта два конструктора, оба с двумя аргументами, типы которых известны контейнеру. Контейнер сам примет решение? А на основании каких критериев?
G>Ты считаешь что описание количества и типов параметров конструктора, совмещенное с методами создания объекта, не является метаданными? G>Не стоит себя обманывать.
Хм. Это есть явное указание типа (сигнатуры) используемого конструктора. Где тут метаданные? От цифр в названиях методов можно избавиться.
G>На type_info все не заменишь, типизированность пропадет, генериков в рантайме у С++ нету.
Как это — типизированность пропадёт? Какая? Где? std::string(raw_name) и полный вперёд!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>>>Вообще, в чем принципиальное отличие компактного фреймворка от большого — только в том, что последний работает на компьютере с C>>Это не отличие фреймворка. Это отличие рабочих условий. COF>>>ограниченными ресурсами. И вот тут все прелести managed языков в плане ресурсоемкости и производительности вылезают во всей красе. Только и всего. На десктопе, и особенно на сервере этого не заметно, или так скажем не так явно заметно. Вот только пользователи жалуются — типа установил консоль оракла написанную на яве и ничего больше запустить не могу, съела всю память C>>А вот у меня на WM6.1 устройстве с .NET CF 3.5 есть три приложения на .NET CF и визуально по производительности они ничуть не уступают приложениям на С++ (MFC) — летают.
COF>Хорошо, что это за приложения? Я их поставлю и если они действительно летают, то я признаю свою неправоту
ThrottleLauncher, Twittula и самописное бизнес-приложение.
Здравствуйте, Геннадий Васильев, Вы писали: ГВ>Ты бы за логической связью последил. Если копирование — это не один из приёмов, который может использоваться для построения замыкания, то... То я прям, не знаю, даже.
Гм. Вообще-то у замыкания есть своя, четко определенная семантика. Копирование, о котором ты говоришь — малоинтересный частный случай.
В общем случае замыкается именно лексический контекст, причем он не readonly:
int sum = 0;
IteratePackageStructure(structure, (item) => sum += item.Size));
Console.WriteLine(sum);
Никакими копированиями эмулировать поведение вот этого маленького фрагмента кода не получится. Придется выполнять замыкание вручную, например написать функтор, у которого sum станет мембером. ГВ>Это всё понятно, и никто с этим не спорит. Равно как никто и не пытается объявить C++ "чистым ФЯ".
Да, это всего лишь громоздкий и многословный императивный язык.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
ГВ>>>>По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#. G>>>Не надо торговаться. лямбды и замыкания в С++ ущербны. ГВ>>Не "ущербны", а специфичны для C++. У любого языка есть своя специфика. G> Не надо торговаться, не на рынке находимся.
Конечно-конечно. Гораздо правильнее принять "ущербно" вместо "специфично". Дружище, мы не на рынке, но и ты в законодатели терминов ещё не выбился, так что, давай уж согласовывать термины.
ГВ>>Ну всё, я уже понял. C++-ник должен отследить согласованность ЖЦ. Да, это есть, хотя и далеко от чудовищной проблемности, приписываемой такому подходу. Ну и опять таки.... Ладно, хватит уже про shared_ptr. G>Какую согласованность, какого ЖЦ? Придумыванием терминов ущербность не скрыть.
ЖЦ = жизненный цикл. Если это новый термин, то программирование появилось позавчера.
ГВ>>>>Как это — нет? А новый стандарт? А новый компилятор от MS (который, правда, я ещё не щупал)? Всё есть, вроде. И опять таки, bind — пусть и не полноценная замена, но по крайней мере, для "маленьких функций" — вполне подходящее решение. Примечательно же оно тем, что получено средствами самого C++. G>>>Ну и где этот стандарт? ГВ>>Планируется к принятию. Компилятор, AFAIK, уже вышел. (Можно подумать, что появись этот стандарт прямо сейчас, что-то бы изменилось в твоей риторике! Ага, верю я...) G>Про стандарт уже давно говорят, а его пока нет.
Зато компилятор, AFAIK, уже есть. Жаль, никак руки не доходят его плотно пощупать.
ГВ>>>>Хм. Я бы так не сказал, поскольку Traits используются для конструирования типа (для инстанцирования RegisterDep). Ну а сами RegisterDep просто зависят от типа используемого конструктора (учтём, что сигнатура = тип функции), точно так же, как и любая функция требует параметров вполне определённых типов. G>>>Это и есть метаданные типов.
ГВ>>Понятно. Значит, любую привязку к типу сейчас нужно называть использованием метаданных. А мужики-то... G>Не любую привзку типу, а любые структуры данныих или методы, которые так или иначе описывают некоторый тип и его содержимое.
Э... Что-то опять новенькое. Я как-то привык считать, что метаданные нужны для того, чтобы сопоставить типу (или объекту) какие-то параметры, о которых сам тип (объект) и слыхом не слыхивал. Meta = "над".
ГВ>>>>Программист в данном случае должен только выбрать, как именно регистрировать в контейнере тот или иной тип. Но это всегда обязанность программиста, выбор нужного конструктора полностью на компилятор не переложишь. G>>>На компилятор — нет, а на контейнер — можно.
ГВ>>А как контейнер вычислит, что мне нужен именно определённый конструктор? Допустим, что у объекта два конструктора, оба с двумя аргументами, типы которых известны контейнеру. Контейнер сам примет решение? А на основании каких критериев? G>На основании каких хочет, это его дело.
Нет, Девид Блейн... Я таких вольностей свои программам не позволяю.
G>>>Ты считаешь что описание количества и типов параметров конструктора, совмещенное с методами создания объекта, не является метаданными? G>>>Не стоит себя обманывать. ГВ>>Хм. Это есть явное указание типа (сигнатуры) используемого конструктора. Где тут метаданные? От цифр в названиях методов можно избавиться. G>От этого метаданные не исчезнут.
Ты видишь суслика? Я, лично, — нет.
G>>>На type_info все не заменишь, типизированность пропадет, генериков в рантайме у С++ нету. ГВ>>Как это — типизированность пропадёт? Какая? Где? std::string(raw_name) и полный вперёд! G>Ну код в студию: типобезопасное создание в рантайме ообъекта по заданному type_info.
Если не лень будет, переделаю свой пример, но обещать не буду.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Sinclair, Вы писали:
ГВ>>Ты бы за логической связью последил. Если копирование — это не один из приёмов, который может использоваться для построения замыкания, то... То я прям, не знаю, даже. S>Гм. Вообще-то у замыкания есть своя, четко определенная семантика. Копирование, о котором ты говоришь — малоинтересный частный случай.
Смотря что копируется. Копировать можно и ссылки. В остальном проблема передачи параметров замыкания носит ровно тот же самый характер, что и передача параметров в процедуру: по ссылке, по указателю или по значению. Согласование жизненных циклов объектов — из той же оперы.
S>В общем случае замыкается именно лексический контекст, причем он не readonly:
Забавно, что сейчас ты апеллируешь к тому, что иной раз подаётся как преимущество "ФП": отсуствие побочных эффектов. Но это так, в offtop-порядке.
S>
S>int sum = 0;
S>IteratePackageStructure(structure, (item) => sum += item.Size));
S>Console.WriteLine(sum);
S>
S>Никакими копированиями эмулировать поведение вот этого маленького фрагмента кода не получится. Придется выполнять замыкание вручную, например написать функтор, у которого sum станет мембером.
Скажем так, по состоянию на данный момент такое поведение трудновато реализовать.
ГВ>>Это всё понятно, и никто с этим не спорит. Равно как никто и не пытается объявить C++ "чистым ФЯ". S>Да, это всего лишь громоздкий и многословный императивный язык.
Да-да, осталось отказаться от замшелых стереотипов... На колу мочало.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>>>По-моему, не стоит впадать в крайности и считать "полноценным" замыканием только такое, которое использует ссылки в стиле C#. G>>>>Не надо торговаться. лямбды и замыкания в С++ ущербны. ГВ>>>Не "ущербны", а специфичны для C++. У любого языка есть своя специфика. G>> Не надо торговаться, не на рынке находимся.
ГВ>Конечно-конечно. Гораздо правильнее принять "ущербно" вместо "специфично". Дружище, мы не на рынке, но и ты в законодатели терминов ещё не выбился, так что, давай уж согласовывать термины.
Не надо согласовывать, если что-то делается в С++ созданием кучи шаблонов, когда в других языках оно уже есть, то это именно "ущербно".
ГВ>Э... Что-то опять новенькое. Я как-то привык считать, что метаданные нужны для того, чтобы сопоставить типу (или объекту) какие-то параметры, о которых сам тип (объект) и слыхом не слыхивал. Meta = "над".
Правильно, а теперь еще раз перечитай свой код. Очень даже сопоставляется строковое имя типа и количество параметров конструктора с типами аргументов.
G>>>>Ты считаешь что описание количества и типов параметров конструктора, совмещенное с методами создания объекта, не является метаданными? G>>>>Не стоит себя обманывать. ГВ>>>Хм. Это есть явное указание типа (сигнатуры) используемого конструктора. Где тут метаданные? От цифр в названиях методов можно избавиться. G>>От этого метаданные не исчезнут. ГВ>Ты видишь суслика? Я, лично, — нет.
Это не суслик, а огромный слон.
Здравствуйте, Геннадий Васильев, Вы писали: ГВ>Смотря что копируется. Копировать можно и ссылки. В остальном проблема передачи параметров замыкания носит ровно тот же самый характер, что и передача параметров в процедуру: по ссылке, по указателю или по значению. Согласование жизненных циклов объектов — из той же оперы.
Вот то-то и оно, что в нормальных замыканиях "передача параметров" происходит по ссылке. И параметры образуются неявным образом. А не вручную — вручную можно и функтор напедалить, кто бы спорил. Там и буст не особо нужен.
ГВ>Скажем так, по состоянию на данный момент такое поведение трудновато реализовать. Об этом речь и идет. Ежу понятно, что "поведение С++" на С++ реализовывать легко и приятно.
ГВ>Да-да, осталось отказаться от замшелых стереотипов... На колу мочало.
Угу. С нетерпением ждем реализации Linq на С++. Хотя бы в объеме библиотеки, т.е. без специального синтаксиса query expressions.
Смею полагать, что "по состоянию на данный момент такое поведение трудновато реализовать".
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Конечно-конечно. Гораздо правильнее принять "ущербно" вместо "специфично". Дружище, мы не на рынке, но и ты в законодатели терминов ещё не выбился, так что, давай уж согласовывать термины. G>Не надо согласовывать, если что-то делается в С++ созданием кучи шаблонов, когда в других языках оно уже есть, то это именно "ущербно".
Ясно. Значит, ты считаешь такое явление ущербностью со всеми сопутствующими эмоциональными оттенками. На здоровье. Я полагаю это спецификой.
ГВ>>Э... Что-то опять новенькое. Я как-то привык считать, что метаданные нужны для того, чтобы сопоставить типу (или объекту) какие-то параметры, о которых сам тип (объект) и слыхом не слыхивал. Meta = "над". G>Правильно, а теперь еще раз перечитай свой код. Очень даже сопоставляется строковое имя типа и количество параметров конструктора с типами аргументов.
Не совсем так, только строковое имя типа именно сопоставляется с типом и может называться "метаданными типа". А количество параметров конструктора — часть определения самого типа. Понимаешь разницу?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Конечно-конечно. Гораздо правильнее принять "ущербно" вместо "специфично". Дружище, мы не на рынке, но и ты в законодатели терминов ещё не выбился, так что, давай уж согласовывать термины. G>>Не надо согласовывать, если что-то делается в С++ созданием кучи шаблонов, когда в других языках оно уже есть, то это именно "ущербно". ГВ>Ясно. Значит, ты считаешь такое явление ущербностью со всеми сопутствующими эмоциональными оттенками. На здоровье. Я полагаю это спецификой.
ГВ>>>Э... Что-то опять новенькое. Я как-то привык считать, что метаданные нужны для того, чтобы сопоставить типу (или объекту) какие-то параметры, о которых сам тип (объект) и слыхом не слыхивал. Meta = "над". G>>Правильно, а теперь еще раз перечитай свой код. Очень даже сопоставляется строковое имя типа и количество параметров конструктора с типами аргументов. ГВ>Не совсем так, только строковое имя типа именно сопоставляется с типом и может называться "метаданными типа". А количество параметров конструктора — часть определения самого типа. Понимаешь разницу?
И можно у "самого типа" спросить о том какие у него есть конструкторы?
Здравствуйте, Sinclair, Вы писали:
ГВ>>Смотря что копируется. Копировать можно и ссылки. В остальном проблема передачи параметров замыкания носит ровно тот же самый характер, что и передача параметров в процедуру: по ссылке, по указателю или по значению. Согласование жизненных циклов объектов — из той же оперы. S>Вот то-то и оно, что в нормальных замыканиях "передача параметров" происходит по ссылке. И параметры образуются неявным образом. А не вручную — вручную можно и функтор напедалить, кто бы спорил. Там и буст не особо нужен.
C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель. "Нормальные" замыкания, судя по твоему высказыванию — это только ссылка, контролируемая GC. Я не хочу сказать, что такая точка зрения не имеет права на существование, но это никак не противоречит копированиям и прочим тра-ля-ля.
ГВ>>Скажем так, по состоянию на данный момент такое поведение трудновато реализовать. S> Об этом речь и идет. Ежу понятно, что "поведение С++" на С++ реализовывать легко и приятно.
Ну, я имел в виду, что с бустом сие сложновато будет реализовать. В смысле, именно такую конструкцию — со ссылкой на неконстантную переменную. Но и то, из-за design goals самой BLL (boost lambda library). А так, вроде, C++0x должен содержать такую возможность.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Не совсем так, только строковое имя типа именно сопоставляется с типом и может называться "метаданными типа". А количество параметров конструктора — часть определения самого типа. Понимаешь разницу? G>И можно у "самого типа" спросить о том какие у него есть конструкторы?
А зачем? Пользователь сам явно указывает, какой конструктор нужно использовать для создания экземпляра.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ> C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель. "Нормальные" замыкания, судя по твоему высказыванию — это только ссылка, контролируемая GC.
Нет, это "только ссылка". Потому что семантика передачи ссылки принципиально отличается от передачи по значению, и именно она нужна. GC — второстепенная деталь реализации, без которой всё вместе трудно заставить работать. ГВ> Я не хочу сказать, что такая точка зрения не имеет права на существование, но это никак не противоречит копированиям и прочим тра-ля-ля.
Геннадий, не надо придуриваться. Есть общепринятая трактовка замыкания, в которой замыкается полный лексический контекст. И плюсы не в состоянии обеспечить реализацию этой трактовки. А говорить "вот мы изобрели некоторое малополезное подмножество вашей функциональности, и назвали его точно так же, как полное — вот вам и замыкания" — это нечестно.
ГВ>Ну, я имел в виду, что с бустом сие сложновато будет реализовать. В смысле, именно такую конструкцию — со ссылкой на неконстантную переменную. Но и то, из-за design goals самой BLL (boost lambda library). А так, вроде, C++0x должен содержать такую возможность.
Да, мы в курсе, что C++0x должен содержать все нужные возможности по определению.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
ГВ>> Я не хочу сказать, что такая точка зрения не имеет права на существование, но это никак не противоречит копированиям и прочим тра-ля-ля. S>Геннадий, не надо придуриваться. Есть общепринятая трактовка замыкания, в которой замыкается полный лексический контекст. И плюсы не в состоянии обеспечить реализацию этой трактовки. А говорить "вот мы изобрели некоторое малополезное подмножество вашей функциональности, и назвали его точно так же, как полное — вот вам и замыкания" — это нечестно.
Ясно, терминологически мы разошлись, поскольку я называл "замыканием", по сути, передачу параметров лямбда-выражению, а не операцию, подразумевающую эээ... Совмещение пространства имён лямбды с пространством имён функции, где эта лямбда создаётся, и сопутствующим неявным порожденем связей, переменных и т.п.
Короче говоря, я понял, о каком различии ты говоришь, но тут сейчас сам точно не знаю, что именно будет реализовано в C++0x.
ГВ>>Ну, я имел в виду, что с бустом сие сложновато будет реализовать. В смысле, именно такую конструкцию — со ссылкой на неконстантную переменную. Но и то, из-за design goals самой BLL (boost lambda library). А так, вроде, C++0x должен содержать такую возможность. S>Да, мы в курсе, что C++0x должен содержать все нужные возможности по определению.
А я вот ещё не в курсе, будет ли в нём именно лексическое замыкание в "общепринятой трактовке" (с неявной модификацией жизненного цикла замкнутых переменных). Скорее всего — нет.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Mamut, Вы писали:
ГВ>> C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель. M>Учитывая, что два последних — это, по сути, одно и то же...
Все они одно и то же — значение чего-то.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Короче говоря, я понял, о каком различии ты говоришь, но тут сейчас сам точно не знаю, что именно будет реализовано в C++0x.
Пойми меня правильно: я не думаю, что в C++0x появится вездесущий GC и возможность менять время существования переменной без явного указания этого программистом. Я просто не в курсе деталей стандарта и уж тем более — особенностей реализации C++0x разными компиляторами. Поэтому не могу уверенно что-то говорить.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Я просто стараюсь избегать преждевременной пессимизации кода. В итоге, наши программы работают лучше программ конкурентов, что приносит вполне ощутимое конкурентное преимущество.
Это полнейший лам. Ты ни грамма не ускоришь программу этими глупостями.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, criosray, Вы писали:
C>Так это и есть пессимизация кода, если Вы во время написания кода стараетесь экономить на количестве тактов процессора и байтов памяти, там, где это абсолютно не принципиально и только отвлекает Вас от, собственно, решения поставленной задачи.
Все еще смешнее. Большая часть из перечисленного ровным счетом не влияет на производительность. Скажем выбор префикской и постфиксной записи мог влиять на что-то во времена Страуструпа, но современные компиляторы оптимизируют генерируемый код и в случае если просто поменять форму инкремента в цикле, ничего не изменится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, COFF, Вы писали:
COF>Вдогонку, COF>У меня был знакомый, который на C++ осознанно писал вот так — for( int i = 0; i < array.GetCount(); i++ ), типа компилятор должен сам такие ситуации разруливать. Ну и в других местах он поступал аналогично. Потом он уволился и мне пришлось в его коде разбираться и оптимизировать. Так вот без всяких алгоритмических штучек, просто вычищением лишних уровней косвенности и выпрямления интерфейсов, мне удалось ускорить его код в несколько раз.
Если array.GetCount() нормально инлайнится, то разницы в релизе не будет.
А если нет, то это уже проблемы в ДНК, а не в уровнях косвенности.
Кстати, что профайлер сказал на такой код?
COF>Так что пессимизация кода в малом скорее всего значит и пессимизацию в большом. Это мое твердое убеждение.
Это ты полнейший бред говоришь от непонимания того как заниматься оптимизацией.
Вполне возможно что вместо прохода по массиву каждый раз надо было результаты вычислений закешировать или, например, использовать другие структуры данных для улучшения ассимптотики вычислений.
Кстати. Твой знакомый работал и никого не беспокоило быстродействие кода, а ты в первую очередь занялся "выпрямлением интерфейсов", что сократило простор для алгоритмической или архитектурной оптимизации.
Здравствуйте, COFF, Вы писали:
COF>Хорошо, тут я был не прав. Привел неудачный пример. Но я действительно неоднократно видел подобные рекомендации — ссылок к сожалению не сохранил, поэтому пытался найти в гугле что есть Да и ты сам ниже подтверждаешь мои слова.
Нет таких ссылок и быть не может. Потому как это бред. Стоимость вызова микроспопически мала. Ее можно заметить на вызове методов-пустышек в цикле. А их то как раз отлично оптимизирует (инлайнит) JIT.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Нет таких ссылок и быть не может. Потому как это бред. Стоимость вызова микроспопически мала. Ее можно заметить на вызове методов-пустышек в цикле. А их то как раз отлично оптимизирует (инлайнит) JIT.
Ссылка старовата, зато от производителя. Интересны советы касательно использования virtual и упрощения графа вызовов. Например, вот это:
Copy Frequently Called Code into the Loop
If you repeatedly call methods from inside a loop, consider changing the loop to reduce the number of calls made. The JIT compiler usually inlines any called code if it is simple, but in most complex scenarios it is your responsibility to optimize the code. The costs of the call increase as you cross process or computer boundaries with remoting or Web services. The following code shows a method being called repeatedly inside a loop.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Ссылка старовата, зато от производителя. Интересны советы касательно использования virtual и упрощения графа вызовов. Например, вот это:
ГВ>
ГВ>Copy Frequently Called Code into the Loop
ГВ>If you repeatedly call methods from inside a loop, consider changing the loop to reduce the number of calls made. The JIT compiler usually inlines any called code if it is simple, but in most complex scenarios it is your responsibility to optimize the code. The costs of the call increase as you cross process or computer boundaries with remoting or Web services. The following code shows a method being called repeatedly inside a loop.
Что тебя тут удивило или заинтересовало?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Что тебя тут удивило или заинтересовало?
Очень созвучно тому, о чём говорил COFF — про объединение мелких методов в один. Ты, вроде, утверждал, что таких рекомендаций не может быть вообще. Как видишь — бывают.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
VD>>Это махровое ламерство. Собственно данная беседа для меня потеряла всяческий интерес.
COF>Для меня эта беседа потеряла интерес когда я покрутил приложение, которое (по словам одного из обвинителей меня в ламерстве) якобы летает. Оказалось, что мало того, что оно тормозит, так еще и память утекает, причем со свистом — так, что средней C++-ной программе надо постараться такую утечку организовать. В общем, гладко было на бумаге, да забыли про овраги — практика пока теорию не подтверждает. Лепите уважаемые свои лямбды дальше
Камень в мой огород? Оно действительно летает и не тормозит. В версии 0.9.5 В RC явно что-то перемудрили. Почти наверняка проблема там в анменеджед модулях — например, во флэщ проигрывателе, который активно используется. Впрочем, не берусь утверждать.
Здравствуйте, criosray, Вы писали:
C>Продолжим общение, когда Вы смените хамский тон на нечто более цивилизованное.
Боюсь, что это не возможно, поскольку мой "хамский тон" существует, преимущественно, в твоём воображении.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, Sinclair, Вы писали: ГВ>>> C++ предполагает три различных способа передачи параметров: значение, ссылка, указатель. "Нормальные" замыкания, судя по твоему высказыванию — это только ссылка, контролируемая GC. S>>Нет, это "только ссылка". Потому что семантика передачи ссылки принципиально отличается от передачи по значению, и именно она нужна. GC — второстепенная деталь реализации, без которой всё вместе трудно заставить работать. Х>спасибо, Капитан, за ликбез про семантику, а "мужики то не знали". Только с чего ты взял что нужна именно она? С++ предоставляет вариант — замыкать контекст по ссылке или по значению (кстати некотороые из lisp'ов таки замыкания реализуют через копирование, ага). Очевидно ето плюс, т.к. программист не ограничен "единственно правильным решением".
Ага, он ограничен двумя неправильными, и одним неочевидным и частично правильным.
Кроме того полноценные замыкания, которые продлевают жизнь контекста, невозвожны без GC.
Куча способов сделать неправльно — плохая черта для языка.
ГВ>>> Я не хочу сказать, что такая точка зрения не имеет права на существование, но это никак не противоречит копированиям и прочим тра-ля-ля. S>>Геннадий, не надо придуриваться. Есть общепринятая трактовка замыкания, в которой замыкается полный лексический контекст. И плюсы не в состоянии обеспечить реализацию этой трактовки. А говорить "вот мы изобрели некоторое малополезное подмножество вашей функциональности, и назвали его точно так же, как полное — вот вам и замыкания" — это нечестно. Х>не надо выдумывать, в новом с++ именно замыкание, аргументов против так и не увидел, разве отсутствует "замыкание на полный лексический контекст", али что?
"замыкание на полный лексический контекст" и есть то самое замыкание с которого начался разговор. То что может быть когда-нибудь будет в новом стандарте С++ замыканием не станет.
Здравствуйте, gandjustas, Вы писали:
G>"замыкание на полный лексический контекст" и есть то самое замыкание с которого начался разговор. То что может быть когда-нибудь будет в новом стандарте С++ замыканием не станет.
Напротив. Это как раз полное классическое замыкание с некоторой спецификой, свойственной C++ (явное разделение ссылок и значений, const/mutable, далее по тексту). То, что лямбда не навязывает обязательной модификации жизненного цикла контекста — есть хорошо, и хорошо весьма.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>"замыкание на полный лексический контекст" и есть то самое замыкание с которого начался разговор. То что может быть когда-нибудь будет в новом стандарте С++ замыканием не станет.
ГВ>Напротив. Это как раз полное классическое замыкание с некоторой спецификой, свойственной C++ (явное разделение ссылок и значений, const/mutable, далее по тексту). То, что лямбда не навязывает обязательной модификации жизненного цикла контекста — есть хорошо, и хорошо весьма.
Срок жизни такого замыкания ограничен блоком, в котором объявлена лямбда. А значит за пределами этого блока при обращении к лямбде ждет UB. Т.е. лямбду можно передать аргументом, но вернуть в качестве результата ни лямбду, ни что-то ее использующее нельзя. Как можно говорить о классическом замыкании то что работает как замыкание только в одну сторону?
Здравствуйте, criosray, Вы писали:
c> с учетом того, что компьютерное время все более и более дешево в сравнении с человеко-часами, затрачиваемыми на разработку
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
Еще как стаовится. Исчезает целый класс применения.
В общем, будет еще больше багов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
Х>в с++ лямбда может копировать контекст по значению, тогда UB отменяется.
Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
VD>Еще как стаовится. Исчезает целый класс применения.
Да ну? И какой же это класс?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, VladD2, Вы писали:
ГВ>>>ИМХО, можно. Просто вопросы согласования жизненных циклов, как обычно, лежат на программисте. Само по себе замыкание от этого неполноценным не становится, но (как это всегда бывает на C++) нужно контролировать, что именно происходит с твоими переменными.
VD>>Еще как стаовится. Исчезает целый класс применения.
ГВ>Да ну? И какой же это класс? http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
Здравствуйте, samius, Вы писали:
S>И тут нет замыкания
Согласен. Но ты лучше посмотри статью по ссылке.
S>Т.е. если захотелось передать лямбду с замыканием наружу — то как надо поступить?
Я думаю, замкнуть контекст надо по значению. Ну, или через shared_ptr — всё как обычно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, samius, Вы писали:
VD>>>>Еще как стаовится. Исчезает целый класс применения.
ГВ>>>Да ну? И какой же это класс? S>>http://en.wikipedia.org/wiki/Closure_(computer_science)#Closures_and_first-class_functions
ГВ>Э... Ты хочешь сказать, что наличие замыканий в C++0x свидетельствует об отсутствии замыканий в C++0x? Я в самом деле тебя не понимаю.
Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++.
Конкретно, как вот это может быть записано с помощью лямбды на С++?
Здравствуйте, samius, Вы писали:
S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++. S>Конкретно, как вот это может быть записано с помощью лямбды на С++? S>
Здравствуйте, samius, Вы писали:
S>ненене, не оно. Промахнулся с примером. Хотел пример с возвратом функции
; Return a function that approximates the derivative of f
; using an interval of dx, which should be appropriately small.
(define (derivative f dx)
(lambda (x) (/ (- (f (+ x dx)) (f x)) dx)))
Здравствуйте, samius, Вы писали:
S>Нет, я просто привел класс применения лямбд, с которым вижу сложности на C++. S>Конкретно, как вот это может быть записано с помощью лямбды на С++? S>
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Кстати, интересный вопрос, ответ на который мне пока не ясен, это как на самом деле реализован захват контекста. По идее, где-то должно быть неявное "превращение" функции в объект.
Может как раз тот случай, когда это вешается на разработчика?
Этот код — это чисто предположение, или компилящийся и выполняющийся?
Здравствуйте, VladD2, Вы писали:
ГВ>>Я имел в виду Part 1. VD>Собственно, что и ожидалось. Недолямбды в недоязыке.
А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?
Влад, ну я тебя прям не узнаю.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Я имел в виду Part 1. VD>>Собственно, что и ожидалось. Недолямбды в недоязыке.
ГВ>А где же "замшелые стереотипы" и "косность мышления" "Страуструпа, впавшего в маразм"?
ГВ>Влад, ну я тебя прям не узнаю.
В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, samius, Вы писали:
S>Может как раз тот случай, когда это вешается на разработчика?
А смысл тогда в лямбдах? Те же объекты.
S>Этот код — это чисто предположение, или компилящийся и выполняющийся?
Пока только предположение. Постараюсь поставить CTP на днях, тогда скажу точнее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>В Лиспе замыкания (причем полноценные) появились где-то в пятидесятых годах прошлого века. В С++ даже недозамыканий нет по сей день. Со времени публикации последнего стандарта прошло 11 лет. Так что вопрос риторический. Конечно на месте. Когда на добавление всем известной фичи тратят 12 лет и получают хреновый результат, то ни о чем кроме замшелости говорить не приходится.
А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи?
А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков. Языки вроде Явы и Шарпа обзавелись большей частью фич которые только обсуждались в С++ох. Скажем методы расширения шарпа были тупо стянуты из одного из реквестов еще в 2002.
12 лет — это строк за который человек вырастает. А они не смогли принять какой-то там стандарт.
За это время обсуждение проблем С++ плавно переросла в обсуждение его реальной необходимости и в итоге просто исчезло так как те кто задавались вопросами просто пересели на другие языки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи? VD>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков. Языки вроде Явы и Шарпа обзавелись большей частью фич которые только обсуждались в С++ох. Скажем методы расширения шарпа были тупо стянуты из одного из реквестов еще в 2002. VD>12 лет — это строк за который человек вырастает. А они не смогли принять какой-то там стандарт. VD>За это время обсуждение проблем С++ плавно переросла в обсуждение его реальной необходимости и в итоге просто исчезло так как те кто задавались вопросами просто пересели на другие языки.
По-моему, явление по имени "C++" нужно рассматривать в комплексе с такими штуками, как куча производителей, которые реализовывали язык, как заблагорассудится, неторопливой активностью комитета и тем фактом, что некоего единого владельца С++ нет в природе. В отличие от десятков других языков, у которых есть владелец, есть узкий круг лиц, занимающихся развитием и нет "отвязного" комитета. Я не хочу сказать, что второе — плохо, но это главным образом определяет отличия динамики развития C++ от Java, C# и иже с ними.
Так что, как бы там что-то во что-то ни перерастало, и какими бы метафизическими свойствами C++ ни наделялся, но он как раз является плодом объёмного договорного процесса очень разных разработчиков программного обеспечения. "Какой-то там" стандарт можно принимать хоть по десять раз на дню, а такой, что удовлетворит кучу разных участников и принимается не для проформы, вырабатывать, всё же, посложнее. 10-12 лет для таких взаимодействий — не то, что мелочь, а так, цветочек понюхать не успеешь. Хорошо, хоть не разругались. Здесь интересно поведение производителя конкурирующего (якобы) языка. Обрати внимание, Microsoft реализовала стандарт 98-го года только в 2003-м, спустя пять лет после принятия, тогда как нововведения C++0x появились в VS10 CTP до принятия стандарта. С чего бы это MS впереди паровоза понеслась, тогда как раньше относилась к стандарту хорошо, если не наплевательски?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
ГВ>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи? VD>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков.
Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, VladD2, Вы писали:
VD>>Ты забыл добавить, что при этом отменяются высокая производительность и некоторые области применения. А как только данные начинают передоваться по ссылке, то здравствуй UB и море багов. Х>ой ли, ты часто передаёшь лямбды после выхода из scope?
Постоянно. При наличии Linq, у которого отложенное выполнение, лямбды в большенстве случаев живут дольше скоупа.
Х>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага).
Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.
Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке.
Х>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления.
Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам.
Здравствуйте, gandjustas, Вы писали:
Х>>как раз таки остутствие гц и возможность захватывать контекст по ссылке обеспечивает экстремальную производительность (нет боксинга для стековых объектов как в дотнете, ага). G>Возможность захватывать контекст по ссылке без GC обеспечивает море глюков, а копирование — тормоза. Причем избавиться от того и другого одновременно нельзя.
Вот это вот очень сильно бабушка надвое сказала. Всегда остаётся возможность оптимизировать передачу захватом по ссылке и одновременным контролем жизненного цикла. Собственно, это обычная техника для C++.
G>Боксингом мугать никого не надо, для примитивных типов затраты на боксинг минимальны, а более сложные структуры и так передаются по ссылке.
Тормозами тоже пугать никого не надо. (<- косность мозга, тузик, тряпка)
Х>>Ещё раз, ето юмор такой или что? лямбды в с++ предлагают два варианта захвата контекста, причём можно гибко выбирать что захватывать по ссылке, что по значению. Таких гибких лямбд нет ни в одном языке программирования, назвать ето "недолямбдами" и "ограничением области применения" можно разве только по причине шаблонности мышления. G>Это правда жизни, в С++ — недолямбды, потому что оба варианта, из которых еще надо выбирать, не позволяют решть все задачи, доступные обычным лямбдам.
Похоже, что ты не прав. Хотя, конечно, никто тебе не запретит называть C++-ные лямбды "недолямбдами".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Ага, "контроль жазненного цикла" обычно как делается? shared_ptr или другой подсчет ссылок. Иначе получаете трудноуловимые баги при изменениях.
ГВ>Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.
Здравствуйте, Геннадий Васильев, Вы писали:
S>>Этот код — это чисто предположение, или компилящийся и выполняющийся?
ГВ>Судя по всему, предположение не совсем правильное. Перечитал драфт и обсуждения, кажется, должно быть так:
ГВ>
ГВ>И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п.
Невполне ясно.
Поправь меня если ошибаюсь:
согласно моим представлениям, приведенное выше предположение должно быть транслировано во что-то следующее:
Разве возвращается не обертка над объектом на стеке? Копирования я тут не вижу. А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает? (Кстати, эта обертка — аналог boost-овской?)
Здравствуйте, MxKazan, Вы писали:
MK>Хоспадя, да нет там боксинга. Один ни черта не разбирающийся ляпнул, другой зачем то ответил, третий зацепился...
...короче говоря, на форуме КСВ было скучно и тихо.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.
G>Ну как например?
Есть ещё совсем ничего не подсчитывающий auto_ptr. Как минимум.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
ГВ>>И что касается копирований, то тоже, кажется, ясно. По сути, лямбда — это объект, содержащий замкнутые значения. А дальше — как обычно с объектами. Те же ограничения, те же особенности передачи и сохранения параметров по ссылке и по значению, и т.п. S>Невполне ясно.
S>Поправь меня если ошибаюсь: S>согласно моим представлениям, приведенное выше предположение должно быть транслировано во что-то следующее:
S>
ИМХО, похоже.
S>Разве возвращается не обертка над объектом на стеке?
Нет, это не обёртка над стеком: m_f, m_dx — собственные члены объекта.
S>Копирования я тут не вижу.
1. В конструкторе: "m_f(f), m_dx(dx)" — это копирования аргумента и указателя на функцию.
2. Неявно сгенерированный конструктор копирования: LambdaFunctor(const LambdaFunctor &). Если какая-то функция вернёт LambdaFunctor (например, как делает derivative: return LambdaFunctor(f, dx)), то вызван будет как раз этот конструктор копирования.
S>А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает?
Повторюсь, это не обёртка.
S>Кстати, эта обертка — аналог boost-овской?
Скорее, это обычный функтор. boost-овые лямбды сильно посложнее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>А с чего ты взял, что эти 11-12 лет были потрачены только лишь на добавление одной фичи? VD>>А что если фичей 2 или 6, то это меняет дело? За это время с нуля спроектировали десятки языков.
ГВ>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.
Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это...
Здравствуйте, criosray, Вы писали:
ГВ>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.
C>Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это...
Я думаю, что это к тому, что компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
C>>Это то о чем Вам говорил Влад. Лямбды С++ — неудобные недолямбды. Потому ими и не пользуются.
ГВ>Дело не в удобстве, а в культуре программирования.
При чем тут "культура"? Вот в С# лямбды широко используются, не смотря на то, что язык, как и С++ императивный, а не функциональный. Просто потому, что там это УДОБНО.
ГВ>>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами.
C>>Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это...
ГВ>Я думаю, что это к тому, что компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников.
"ГВ>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами."
Здравствуйте, Геннадий Васильев, Вы писали:
S>>Разве возвращается не обертка над объектом на стеке?
ГВ>Нет, это не обёртка над стеком: m_f, m_dx — собственные члены объекта.
догадался
S>>Копирования я тут не вижу.
ГВ>1. В конструкторе: "m_f(f), m_dx(dx)" — это копирования аргумента и указателя на функцию. ГВ>2. Неявно сгенерированный конструктор копирования: LambdaFunctor(const LambdaFunctor &). Если какая-то функция вернёт LambdaFunctor (например, как делает derivative: return LambdaFunctor(f, dx)), то вызван будет как раз этот конструктор копирования.
Ок, функция возвращает копию. Но вызывающая сторона принимает function<double(double)>. Что это? Я подумал, что это "Polymorphous wrapper for function object". Но я не знаю физики этого понятия. Какое отношение тип function<double(double)> имеет к возвращаемой копии экземпляра LambdaFunctor?
S>>А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает? ГВ>Повторюсь, это не обёртка.
Точно?
S>>Кстати, эта обертка — аналог boost-овской?
ГВ>Скорее, это обычный функтор. boost-овые лямбды сильно посложнее.
функтор — это экземпляр объекта. Экземпляр может быть таким или этаким, когда принимающая сторона знает каким он будет — тут все поянтно, т.к. на стеке выделится память под экземпляр. А что есть function<double(double)>.
З.Ы. Извиняюсь за нубские вопросы, с C++ не имел дела с выхода шарпа. В поиске нашел только вот это.
Здравствуйте, criosray, Вы писали:
C>>>Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это... ГВ>>Я думаю, что это к тому, что компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. C>"ГВ>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами."
И при чём здесь C#?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>>>Что даже не сильно удивляет. Длинные и многоярусные лямбды противоречат принципам реюзинга, "обычные" функторы могут быть предпочтительнее с этой точки зрения. Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
C>>>Это то о чем Вам говорил Влад. Лямбды С++ — неудобные недолямбды. Потому ими и не пользуются. ГВ>>Дело не в удобстве, а в культуре программирования. C>При чем тут "культура"? Вот в С# лямбды широко используются, не смотря на то, что язык, как и С++ императивный, а не функциональный. Просто потому, что там это УДОБНО.
Ну ё-моё, ты хоть прочти то, чему возражаешь:
Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
Это был раз. А два, так я вот, например, вполне даже пользуюсь лямбдами (бустовыми). Но совершенно не удивляюсь, что кто-то другой ими не пользуется (только не заводи опять шарманку, что это невозможно и неудобно использовать).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
S>Ок, функция возвращает копию. Но вызывающая сторона принимает function<double(double)>. Что это? Я подумал, что это "Polymorphous wrapper for function object". Но я не знаю физики этого понятия.
См. ниже.
S>Какое отношение тип function<double(double)> имеет к возвращаемой копии экземпляра LambdaFunctor?
М-м-м... Да, приведение типов я прозевал. function<double(double)> (теоретически) может ссылаться на экземпляр LambdaFunctor и вызывать LambdaFunctor::operator()(double). Правда для этого вполне может понадобиться разместить экземпляр LambdaFunctor в динамической памяти с подсчётом ссылок, управлением и всей свитой.
S>>>А даже если бы оно было, разве обертка управляет временем жизни того, что она обертывает? ГВ>>Повторюсь, это не обёртка. S>Точно?
Ну а что она оборачивает? Разве что вызов f через оператор.
S>>>Кстати, эта обертка — аналог boost-овской? ГВ>>Скорее, это обычный функтор. boost-овые лямбды сильно посложнее. S>функтор — это экземпляр объекта. Экземпляр может быть таким или этаким, когда принимающая сторона знает каким он будет — тут все поянтно, т.к. на стеке выделится память под экземпляр. А что есть function<double(double)>.
По-простому — это шаблон, инстанцированный типом double(double), сиречь — сигнатурой функции double func(double). В бусте это — довольно хитрый шаблон, там есть собственный менеджер, shared_ptr-ы, динамическая память... До фига всего. Мне интересно, как это реализовали в C++0x. Заморочка понятна: если по сигнатуре мы ещё можем точно вычислить размер памяти, необходимый для хранения параметров и соответственно их скопировать, то когда появляются ещё и локальные переменные, всё становится намного интереснее. Либо динамическая память, либо ещё какой-то механизм неявного "дораспределения" памяти для таких переменных.
S>З.Ы. Извиняюсь за нубские вопросы, с C++ не имел дела с выхода шарпа. В поиске нашел только вот это.
Что касается C++0x, то на данный момент я точно такой же нуб. Я ж говорю, что живого компилятора ещё в руках не держал.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
C>>>>Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это... ГВ>>>Я думаю, что это к тому, что компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. C>>"ГВ>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами."
ГВ>И при чём здесь C#?
С# пример того, что можно очень активно развивать язык, сохраняя "обратную совместимость" на уровне компилятора.
Здравствуйте, criosray, Вы писали:
C>>>>>Компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. Интересно, к чему бы это... ГВ>>>>Я думаю, что это к тому, что компилятор С# 3.0 прекрасно справляется со сборкой С# 1 исходников. C>>>"ГВ>>Добавим к проблемам развития C++ ещё то, что очень мало кто хочет столкнуться с необходимостью переписывать всё ранее разработанное ПО, чтобы оно компилировалось новыми компиляторами." ГВ>>И при чём здесь C#? C>С# пример того, что можно очень активно развивать язык, сохраняя "обратную совместимость" на уровне компилятора.
А кто спорит с тем, что это можно? Я только констатирую возможные соображения, которые влияют на развитие C++.
С другой стороны, в период 2000-2003 был вполне себе ощутимый конфликт между возможностями Intel C++ и MSVC++. Собственно, разнобой в возможностях компиляторов вполне сохранился и по сей день (в том же бусте куча кода посвящена как раз этому разнобою). Хотя да, можно сохранять совместимость, а вот тем не менее.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, CreatorCray, Вы писали:
VD>>Ага. Причем юмор начинается со слов "лямбды в с++" ибо на сегодня в С++ нет даже тех недолямбд которые описаны в С++ох (читать как си-плюс-плюс ох). CC>Ну в С++0х они есть. Компилеры с лямбдами тоже есть (ICC). CC>Удивительно, но из всего что появилось в ICC из С++0х применения в живых проектах не нашли только лямбды.
Для особо одаренных повторяю. Нет никакого С++0х. С++0х — это рабочее название черновика.
А в "кампилирах" есть еще свойства и поддержка COM. И что с того?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Для особо одаренных повторяю. Нет никакого С++0х. С++0х — это рабочее название черновика.
Хорошо, C++0x в данном контексте — это эвфемизм для "C++ Standard Draft Which Is Close To Approve By The Appropriate Standard Commitee".
VD>А в "кампилирах" есть еще свойства и поддержка COM. И что с того?
В компиляторах много чего есть, но не всё из этого планируется к принятию в виде стандарта.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
VD>>А в "кампилирах" есть еще свойства и поддержка COM. И что с того?
ГВ>В компиляторах много чего есть, но не всё из этого планируется к принятию в виде стандарта.
Оно уже 11 лет планируется. Так что говорить о чем-то будет можно только когда стандарт выйдет. О чем я и говорил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Обычно он делается по-разному, это раз. Баги согласования жизненных циклов ловятся не труднее, чем любые другие — это два.
G>>Ну как например?
ГВ>Есть ещё совсем ничего не подсчитывающий auto_ptr. Как минимум.
Семантика владения в лямбде никак не подойдет. Еще варианты есть?
Может всетаки уже стоит признать что в С++ в обозримом будущем не будет нормальных лямбд.
Здравствуйте, VladD2, Вы писали:
VD>>>А в "кампилирах" есть еще свойства и поддержка COM. И что с того? ГВ>>В компиляторах много чего есть, но не всё из этого планируется к принятию в виде стандарта. VD>Оно уже 11 лет планируется. Так что говорить о чем-то будет можно только когда стандарт выйдет. О чем я и говорил.
Отнюдь. Даже если в окончательную версию стандарта лямбды не войдут (что выглядит фантастично), их из компиляторов никто убирать не будет (это выглядит ещё более фантастичным). Поэтому с формальной точки зрения ты прав — стандарта ещё нет, и казалось бы, обсуждать нечего, но коль скоро на практике фичи в компиляторах уже есть (больше того, описание фич прямо ссылается на драфт стандарта), следовательно, утверждать, что их нет — абсурд. И следовательно, нам вполне есть, что обсуждать.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Есть ещё совсем ничего не подсчитывающий auto_ptr. Как минимум. G>Семантика владения в лямбде никак не подойдет. Еще варианты есть?
Почему не подойдёт? Как по мне, так вполне подойдёт.
G>Может всетаки уже стоит признать что в С++ в обозримом будущем не будет нормальных лямбд.
Знаешь, это очень сильное колдунство — признавать отсутствие наличествующего. "Видишь суслика? А его нет!"
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
ГВ>>Отнюдь. Даже если в окончательную версию стандарта лямбды не войдут (что выглядит фантастично), их из компиляторов никто убирать не будет VD>Еще как будут, как убирали несоответствия с 98-ым стандартом.
Маловероятно. И первое, и второе. Гораздо более вероятно, что как и с 98-м стандартом, начнётся вакханалия, как это было во времена VC6 — сколько компиляторов, столько реализаций шаблонов. Здесь будут другие заморочки.
ГВ>>Поэтому с формальной точки зрения ты прав — стандарта ещё нет, и казалось бы, обсуждать нечего, но коль скоро на практике фичи в компиляторах уже есть (больше того, описание фич прямо ссылается на драфт стандарта), следовательно, утверждать, что их нет — абсурд. И следовательно, нам вполне есть, что обсуждать.
VD>Никаких расширений пока нет. Речь идет о бэтах которые не зарелизятся до 2010 года.
Ну и что? Значит эти расширения пока в бетах. Факт их существования не отменяется.
VD>Мне кажется, что включение фич из черновика стандарта является своеобразным протестом против глупого затягивания его принятия и способом подтолкнуть его принятие хоть в каком-то виде, потому как комитет давно живет ради собственного развлечения.
Да не так всё просто, судя по всему. Где-то пробегало, что это составляющая процедуры принятия стандарта — разработчики компиляторов получают некоторый запас времени для предварительной реализации фич. Есть ещё и сугубо ISO-шные процедуры принятия стандарта, которые, как я понимаю, должны пройти после того, как окончательный драфт стандарта будет одобрен комитетом. В общем, в этой бюрократии я не силён, но похоже, что твои высказывания о "протесте против затягивания" и "ради собственного развлечения" не совсем отражают действительность.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
G>Точно, ты ведь до сих пор не признаешь что нету и не будет в С++ нормальных лямбд, а в других языках есть.
Ты только функциональщикам не говори о "нормальности" лямбд, допускающих побочные эффекты. Могут и на смех поднять.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Ну ё-моё, ты хоть прочти то, чему возражаешь:
ГВ>
Больше того, даже два использования какой-нибудь коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" уже побуждают сделать вместо неё обычную функцию или функтор, и обращаться к ним по собственному имени.
И что? От двукратного прочтения фигня фигней быть не перестанет.
Потому, что два использования коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" побуждают к вот такому:
var isWithinRange = (int x) => x >= SOMETHING_LOW && x <= SOMETHING_HIGH;
А вовсе не к обычной функции или функтору. Потому, что так — удобно.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, VladD2, Вы писали:
ГВ>>В компиляторах много чего есть, но не всё из этого планируется к принятию в виде стандарта. VD>Оно уже 11 лет планируется. Так что говорить о чем-то будет можно только когда стандарт выйдет. О чем я и говорил.
Ты так цепляешься за жалкую отмазку "еще не вышел" как будто больше сказать нечего.
Какая мне например разница, вышел он или нет. Гораздо важнее что уже есть реализация в промышленных компиляторах.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Sinclair, Вы писали:
S>Потому, что два использования коротенькой лямбды типа "x >= SOMETHING_LOW && x <= SOMETHING_HIGH" побуждают к вот такому:
S>
S>var isWithinRange = (int x) => x >= SOMETHING_LOW && x <= SOMETHING_HIGH;
S>
S>А вовсе не к обычной функции или функтору. Потому, что так — удобно.
Гы-гы.
auto isWithinRange = [](int x) -> bool { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
vs.
inline bool isWithinRange(int x) { return x >= SOMETHING_LOW && x <= SOMETHING_HIGH; }
Обрати внимание, функцию с именем isWithinRange невозможно подменить в рантайме.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Я признаю наличие в других языках других реализаций лямбд. Но я не считаю "единственно нормальной" реализацию лямбд в каком-то определённом языке, или их наборе. Например, то, что лямбды в "других" языках непременно требуют вовлечения GC я считаю изъяном их реализации, пусть и повсеместно встречающимся. Я, например, знаю, что использование лямбда-выражений не всегда требует отдельного управления жизненным циклом замкнутых переменных. Отсюда, я не думаю, что непременное привлечение GC — "нормально", т.е., сродни эталону. G>А другие варианты есть? Явное управление временем жизни не подойдет, надеюсь это понятно.
Да варианты-то самые обыкновенные: от отсутствия специального управления, до подсчёта ссылок и опционального (!) GC. Пойми, я не против GC самого по себе, я не люблю, когда мне его навязывают в обязательном порядке. Вот в маленькой локальной лямбде:
int upper = ...;
it = find_if(v.begin(), v.end(), [=](int x) -> bool { return x >= 0 && x <= upper; })
на фига GC? Здесь вполне достаточно снапшота по значению. Её вообще имеет смысл всю инлайнировать (кстати, я охотно допускаю, что JIT именно так и поступит). И ещё в десятках ситуаций, когда время существования вовлечённых объектов гарантированно превышает время существования лямбды — зачем GC? Зачем GC вообще ставить в известность о том, что ты создаёшь какую-то там лямбду, когда ты на 100% уверен, что она будет удалена до того, как пропадут использованные ей объекты?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Я признаю наличие в других языках других реализаций лямбд. Но я не считаю "единственно нормальной" реализацию лямбд в каком-то определённом языке, или их наборе. Например, то, что лямбды в "других" языках непременно требуют вовлечения GC я считаю изъяном их реализации, пусть и повсеместно встречающимся. Я, например, знаю, что использование лямбда-выражений не всегда требует отдельного управления жизненным циклом замкнутых переменных. Отсюда, я не думаю, что непременное привлечение GC — "нормально", т.е., сродни эталону. G>>А другие варианты есть? Явное управление временем жизни не подойдет, надеюсь это понятно.
ГВ>Да варианты-то самые обыкновенные: от отсутствия специального управления, до подсчёта ссылок и опционального (!) GC. Пойми, я не против GC самого по себе, я не люблю, когда мне его навязывают в обязательном порядке. Вот в маленькой локальной лямбде:
ГВ>
ГВ>на фига GC? Здесь вполне достаточно снапшота по значению. Её вообще имеет смысл всю инлайнировать (кстати, я охотно допускаю, что JIT именно так и поступит). И ещё в десятках ситуаций, когда время существования вовлечённых объектов гарантированно превышает время существования лямбды — зачем GC? Зачем GC вообще ставить в известность о том, что ты создаёшь какую-то там лямбду, когда ты на 100% уверен, что она будет удалена до того, как пропадут использованные ей объекты?
Простые случаи мало интересуют, они будут отлично оптимизироваться JIT. Наличие или остуствие GC там никакой роли не играет.
В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC.
Не получится сделать в C++ сборщик мусора, сравнимый по быстродействию с .NETовским.
В итоге пришли к тому же: С++, даже в новом стандарте, позволяет эффективно использовать только подмножество лямбд.
Здравствуйте, gandjustas, Вы писали:
G>Простые случаи мало интересуют, они будут отлично оптимизироваться JIT. Наличие или остуствие GC там никакой роли не играет.
Я очень рад, если это так.
G>В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC.
Величина этого оверхеда — вопрос с трудно предсказуемым ответом.
G>Не получится сделать в C++ сборщик мусора, сравнимый по быстродействию с .NETовским.
Ой, сомневаюсь.
G>В итоге пришли к тому же: С++, даже в новом стандарте, позволяет эффективно использовать только подмножество лямбд.
Угу, то есть тезис о неполноценности лямбд в C++ снимается повестки дня. Уже что-то. А то, что там где-то что-то побыстрее, где-то что-то помедленнее — так на то они и разные языки: C++, C#, Java, Haskell... Чтобы где-то выигрывать по отношению друг к другу, где-то проигрывать.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Угу, то есть тезис о неполноценности лямбд в C++ снимается повестки дня.
Имел в виду "тезис о принципиальной неполноценности лямбд в C++0x".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
ГВ>>Обрати внимание, функцию с именем isWithinRange невозможно подменить в рантайме. S>Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров.
В данном случае я отвечал на вполне определённый выпад Синклера.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали: ГВ>на фига GC? Здесь вполне достаточно снапшота по значению. Её вообще имеет смысл всю инлайнировать (кстати, я охотно допускаю, что JIT именно так и поступит). И ещё в десятках ситуаций, когда время существования вовлечённых объектов гарантированно превышает время существования лямбды — зачем GC? Зачем GC вообще ставить в известность о том, что ты создаёшь какую-то там лямбду, когда ты на 100% уверен, что она будет удалена до того, как пропадут использованные ей объекты?
Гена, я тебе открою тайну, но GC никто ни в какую известность не ставит. Всё как раз наоборот: это в плюсах нужно что-то "удалять", когда оно больше не нужно.
А GC всего лишь оставляет только те объекты, которые доступны. В частности, если локальная лямбда выйдет из области видимости до того, как использованные ей объекты, то GC про неё никогда не узнает, и ни такта не будет затрачено на её уборку. Зато "100% уверен" — это как раз в случае с GC: именно он даёт такую гарантию. А в твоём случае 100% — это нечестное округление от 99.9999....%
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>В частности, если локальная лямбда выйдет из области видимости до того, как использованные ей объекты, то GC про неё никогда не узнает, и ни такта не будет затрачено на её уборку.
А можно раскрыть мысль? Такая лямбда не обрастет делегатом?
Здравствуйте, Sinclair, Вы писали:
S>Гена, я тебе открою тайну, но GC никто ни в какую известность не ставит. Всё как раз наоборот: это в плюсах нужно что-то "удалять", когда оно больше не нужно.
Антон, спасибо, но это для меня не тайна. Говоря "ставить в известность" я не имел в виду ручное оповещение GC об использовании объекта.
S>А GC всего лишь оставляет только те объекты, которые доступны. В частности, если локальная лямбда выйдет из области видимости до того, как использованные ей объекты, то GC про неё никогда не узнает, и ни такта не будет затрачено на её уборку.
Ну и превосходно. Правда, AFAIK, не во всех языках с "полноценными" лямбдами дело обстоит именно так.
S>Зато "100% уверен" — это как раз в случае с GC: именно он даёт такую гарантию. А в твоём случае 100% — это нечестное округление от 99.9999....%
Да нет, есть случаи как раз тех самых 100%. Я понимаю, что хочется сказать, что я выдаю желаемое за действительное и приплести излюбленные противо-C++-ные аргументы, но смею тебя заверить, это было бы неправильным.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
ГВ>>А Microsoft с Intel-ом и не знают, что они отсебятину несут. VD>Можно ссылку на место где я могу купить компилятор от Microsoft реализующий черновик стандарта?
Дык. Гугль тебя спасёт, ключевые слова "VC10 CTP download". Это действительно бета, как ты правильно заметил (вернее — CTP, я не знаю, как он соотносится с альфа/бета/RC по обычной классификации). Про интеловский компилятор спроси у CreatorCray.
VD>Если нет, то предлагаю вам всем прекратить нести пургу.
Чья б корова...
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Понятно. Но эту сказку про C++ рассказывают с регулярностью, достойной лучшего применения, всё то время, пока я на нём программирую — все 14 лет. Тут, знаешь, что ни язык, так непременно его апологеты апеллируют к тому, что на C++ всё глюкаво, громоздко и ненадёжно. Так что, не ты первый, не ты последний.
Что интересно , как ни язык то все к С++, не друг на друга а именно на С++.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Он везде есть — больше или меньше. G>О как, а только пару страниц назад было утверждение что в С++ нет оверхедов.
В каких-то случаях — нет, в каких-то есть. Чудес же не бывает.
G>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен.
ИМХО, нельзя.
G>Не в библиотеках вопрос, лексическое замыкание накакими библиотечными функциями не заменишь, там нудно по-другом управлять временем жизни объектов.
Опять двадцать пять.
G>Так действительно на С++ все глюкаво и ненадежно.
Во-во, слово в слово. Все 14 лет.
G>А то что ьты 14 лет на нем пишешь чести тебе не делает.
В чьих глазах?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
G>>>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен. ГВ>>ИМХО, нельзя. G>Обоснования?
Обосновать негативно сформулированный тезис — нельзя. Так что, это ты обоснуй своё высказывание.
ГВ>>Во-во, слово в слово. Все 14 лет. G>Так за 14 лет ничего не поменялось
Где? В риторике критиков? Угу.
G>С++ и по сей день остается языком, на котором больше всего завалено проектов было.
Пересчитывал?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Sinclair, Вы писали:
S>>В частности, если локальная лямбда выйдет из области видимости до того, как использованные ей объекты, то GC про неё никогда не узнает, и ни такта не будет затрачено на её уборку.
S>А можно раскрыть мысль? Такая лямбда не обрастет делегатом?
Может и обрастет. Только уборка мертвого объекта ничего не стоит, потому пофиг что чем обрастет.
G>А то что ьты 14 лет на нем пишешь чести тебе не делает.
В чьих глазах?
Вопрос остаётся в силе.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>>>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен. ГВ>>>ИМХО, нельзя. G>>Обоснования?
ГВ>Обосновать негативно сформулированный тезис — нельзя. Так что, это ты обоснуй своё высказывание.
Обосновываю, сейчас в С++ популярны средства неявного управления временем жизни объектов в куче. Но эти способы обладают некоторыми недостатками.
GC, который свободен от этих недостатков, будет очень востребован.
G>>С++ и по сей день остается языком, на котором больше всего завалено проектов было. ГВ>Пересчитывал?
Я — нет, а некоторые фирмы часто занимаются статистическими исследованиями.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, minorlogic, Вы писали:
M>>"Лямбды удобнее тем, что их можно сочетать вместе с замыканиями в то время когда функцию придется передавать толпу параметров." не всегда является достаточным аргументом, например
M>>Глобальные переменные удобнее тем, что их можно использовать из любого места и не придется передавать как толпу параметров.
S>А GOTO удобнее функций. Из любого места в любое и без параметров! S>(я так не считаю, только проиронизировал аналогию)
G>>>>>В более сложных случаях, когда требуется GC, подсчет ссылок дает оверхед, как и опциональный GC. ГВ>>>>Величина этого оверхеда — вопрос с трудно предсказуемым ответом. G>>>Тем не менее он есть. ГВ>>Он везде есть — больше или меньше. G>О как, а только пару страниц назад было утверждение что в С++ нет оверхедов.
Все правильно: пару страниц назад в С++ не было оверхедов, но язык развивается — успел обрасти оверхедами, понимаете ли какое дело...
Здравствуйте, gandjustas, Вы писали:
G>>>>>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен. ГВ>>>>ИМХО, нельзя. G>>>Обоснования? ГВ>>Обосновать негативно сформулированный тезис — нельзя. Так что, это ты обоснуй своё высказывание. G>Обосновываю, сейчас в С++ популярны средства неявного управления временем жизни объектов в куче. Но эти способы обладают некоторыми недостатками.
А что за недостатки (кроме синхронного подсчёта количества ссылок)?
G>GC, который свободен от этих недостатков, будет очень востребован.
Давай, сначала про недостатки. Мне интересно, что ты считаешь недостатками, кроме указанного.
G>>>С++ и по сей день остается языком, на котором больше всего завалено проектов было. ГВ>>Пересчитывал? G>Я — нет, а некоторые фирмы часто занимаются статистическими исследованиями.
Ссылкой не поделишься? Просто любопытно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Если бы я не знал тебя и твою любовь к демагогии, то подумал бы что ты или не умеешь читать, или торонулся рассудком. Я же кажется четко написал "ссылку на место где можно купить компилятор".
Нет такой ссылки, потому что компилятор от MS ещё не продаётся. Его можно скачать, как CTP.
Только это не означает, что нам нечего обсуждать. Я тебе уже писал об этом. Гипотетические рассуждения о том, что завтра перекромсают почти утверждённый стандарт и поубирают все фичи из компиляторов, давай оставим тем, кто любит обсуждать сюжетные ходы в плохой фантастике.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Вопрос остаётся в силе. G>В глазах тех, кто успел попользоваться не только С++, но и более современными языками.
За всех отвечаешь? А по Хуану ли сомбреро?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>>>>>Ну раз shared_ptr придумали, и они пользуются значительным успхом, то можно предположить что GC очень нужен. ГВ>>>>>ИМХО, нельзя. G>>>>Обоснования? ГВ>>>Обосновать негативно сформулированный тезис — нельзя. Так что, это ты обоснуй своё высказывание. G>>Обосновываю, сейчас в С++ популярны средства неявного управления временем жизни объектов в куче. Но эти способы обладают некоторыми недостатками.
ГВ>А что за недостатки (кроме синхронного подсчёта количества ссылок)?
сам по себе подстчет ссылок — не лучшый механизи. Дает оверхед по памяти и по быстродействию, не разруливает циклы, непотокобезопасны.
auto_ptr с передачей владения не намного лучше обычных указателей, при этом надо ими пользоваться очень осторожно и хорошо понимать что происходит "под капотом".
G>>>>С++ и по сей день остается языком, на котором больше всего завалено проектов было. ГВ>>>Пересчитывал? G>>Я — нет, а некоторые фирмы часто занимаются статистическими исследованиями. ГВ>Ссылкой не поделишься? Просто любопытно.
Не поделюсь, потому что ссылки не храню.
Здравствуйте, VladD2, Вы писали:
VD>Значит и обсуждать не чего.
да ну? или для дотнетчиков microsoft бог и царь и то что для С++ есть компиляторы от других производителей уже не в счёт?
Здравствуйте, Хвост, Вы писали:
Х>да ну? или для дотнетчиков microsoft бог и царь и то что для С++ есть компиляторы от других производителей уже не в счёт?
А во всех других уже реализован черновик стандарта?
Нет?
Вот когда реализуют, тогда обсудим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
Х>>>в случае с с++ лямбдами исполнено на 100%, G>>На 200%, лямбд просто нету Есть только жалкое подобие. Х>может ты найдёшь определение lambda в интернет и перестанешь нести ахинею?
Х>>>в дотнете же оверхеды на ровном месте, т.е. беспричинно, в силу его устройства. G>>А примеры будут? или опять пердение в лужу? Х>да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед.
Здравствуйте, gandjustas, Вы писали:
ГВ>>А что за недостатки (кроме синхронного подсчёта количества ссылок)? G>сам по себе подстчет ссылок — не лучшый механизи. Дает оверхед по памяти и по быстродействию, не разруливает циклы, непотокобезопасны. G>auto_ptr с передачей владения не намного лучше обычных указателей, при этом надо ими пользоваться очень осторожно и хорошо понимать что происходит "под капотом".
OK, принято. ИМХО, самый серьёзный недостаток такого способа — потенциальные заморочки с циклическими зависимостями. Ну что же, действительно, опциональный (библиотечный) GC иной раз не помешал бы. В принципе — не помешал бы. Другое дело, что острота потребности в GC, ИМХО, невероятно преувеличена. Вот тут, честно тебе скажу, доказать ты её (острую потребность) не сможешь. Потому что придётся доказывать, исходя из субъективных моментов, а субъективно как раз таких проблем нет — C++-ники привыкли управлять своими объектами и им это вполне удаётся. Хорошим C++-никам — удаётся, а кто не умеет — тот плохой C++-ник, и к его мнению не особо прислушиваются. ИМХО, потому про GC хоть и поговаривают, но не особо.
ГВ>>Ссылкой не поделишься? Просто любопытно. G>Не поделюсь, потому что ссылки не храню.
Жаль, было бы интересно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед.
А можно узнать, решениями каких задач ты занимаешься на С++?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
Х>>>здесь поподробней пожалуйста, что имеется ввиду? G>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно.
ГВ>Ключевое слово — пул.
Вы только что узнали новое слово и решили вставить его, чтоб казаться умным?
Здравствуйте, VladD2, Вы писали:
ГВ>>Так и не обсуждай. Тебя кто-то заставляет? VD>Обсуждал, ты а теперь откровенно гонишь. Учись признавать свою неправоту.
Иными словами, сказать тебе больше нечего.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
Х>>>здесь поподробней пожалуйста, что имеется ввиду? G>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. ГВ>Ключевое слово — пул.
Угу, очередной "закат солнца вручную". Кроме того с пулом возникают дополнительные проблемы управления временем жизни.
G>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. ГВ>Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении.
Угу, но работают медленно. Даже при однопоточном выделении. Блокировки небесплатные.
Здравствуйте, criosray, Вы писали:
ГВ>>Ключевое слово — пул. C>Вы только что узнали новое слово и решили вставить его, чтоб казаться умным?
Конечно. Я из этой дискуссии столько нового почерпнул — ты не поверишь! Столько новых слов, столько новых идей! Люблю с умными людьми общаться — сразу умнее становлюсь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Ключевое слово — пул. G>Угу, очередной "закат солнца вручную". Кроме того с пулом возникают дополнительные проблемы управления временем жизни.
Это какие такие проблемы? Что объекты должны быть уничтожены до уничтожения самого пула? Так это — то же самое, что и общее предотвращение утечек памяти.
G>>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. ГВ>>Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении. G>Угу, но работают медленно. Даже при однопоточном выделении. Блокировки небесплатные.
Ты уж определись: работают стандартные аллокаторы в многопоточном окружении или нет.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>А можно узнать, решениями каких задач ты занимаешься на С++?
Можно, в данный момент ето десктопная GIS.
В свою очередь можно узнать, какие задачи ты решаешь на C#?
Здравствуйте, Хвост, Вы писали:
Х>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность
Что за темы?
Здравствуйте, MxKazan, Вы писали:
Х>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность MK>Что за темы?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, gandjustas, Вы писали:
ГВ>>Это какие такие проблемы? Что объекты должны быть уничтожены до уничтожения самого пула? Так это — то же самое, что и общее предотвращение утечек памяти. G>Опять возвращаемся к ручному управлнию памятью, никаких shred_ptr и прочего.
Почему? Самое обыкновенное управление модулями в программе на C++. В числе прочих, фаза завершения работы модуля может включать и очистку статических (глобальных) указателей.
G>>>>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. ГВ>>>>Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении. G>>>Угу, но работают медленно. Даже при однопоточном выделении. Блокировки небесплатные. ГВ>>Ты уж определись: работают стандартные аллокаторы в многопоточном окружении или нет. G>Раьотают, но медленно
То есть, "нормальная" в твоей терминологии работа — это работа без блокировок, я прав?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. Х>для интенсивных операций существует пулы/арены
А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер?
G>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. Х>ну ето просто неправда
Наверное неправльно понял. Приседания требуются в самом аллокаторе, кто снижает производительность.
Х>>>>>в случае с с++ лямбдами исполнено на 100%, G>>>>На 200%, лямбд просто нету Есть только жалкое подобие. Х>>>может ты найдёшь определение lambda в интернет и перестанешь нести ахинею? G>>Ты прочитай 3 предыдущие страницы. Нормальные лямбды подразумевают лексические замыкания, которых нету и не будет в С++. Х>во-первых: лямбды не подразумевают замыкания, ето замыкания подразумевают лямбды.
Источник этого бреда в студию.
Х>во-вторых: лексическое замыкание есть, прочитай теперь ты 3 предыдущие страницы.
Нету. Можно сымитировать подобие лексических замыканий причем со значительными ограничениями.
Х>>>да уж, дотнет действительно замазка для мозга. гц, метаданные, промежуточный код + jit, бесчисленные проверки кода на сейфанутость — всё ето есть даже тогда когда тебе етого не нужно, и ето всё в таком случае — не нужный оверхед. G>>Не разводи демагогию, давай факты. Х>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность
Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
ГВ>>>Это какие такие проблемы? Что объекты должны быть уничтожены до уничтожения самого пула? Так это — то же самое, что и общее предотвращение утечек памяти. G>>Опять возвращаемся к ручному управлнию памятью, никаких shred_ptr и прочего.
ГВ>Почему? Самое обыкновенное управление модулями в программе на C++. В числе прочих, фаза завершения работы модуля может включать и очистку статических (глобальных) указателей.
Ох ё....
G>>>>>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. ГВ>>>>>Это что-то новенькое. Стандартные аллокаторы как раз вполне работают в многопоточном окружении. G>>>>Угу, но работают медленно. Даже при однопоточном выделении. Блокировки небесплатные. ГВ>>>Ты уж определись: работают стандартные аллокаторы в многопоточном окружении или нет. G>>Раьотают, но медленно
ГВ>То есть, "нормальная" в твоей терминологии работа — это работа без блокировок, я прав?
Правильная работа — это когда не надо думать выделять память или нет.
Здравствуйте, MxKazan, Вы писали:
MK>>>Что за темы? Х>>тебе дать ссылку на тему которую завёл ты сам? MK>Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг!
и где же здесь лажа? что просил то и получил.
кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали:
MK>>>>Что за темы? Х>>>тебе дать ссылку на тему которую завёл ты сам? MK>>Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг! Х>и где же здесь лажа? что просил то и получил. Х>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода?
Это и называется лексическим замыканием
На C++ (даже с новым стандартом) такое повторить сможешь?
Здравствуйте, gandjustas, Вы писали:
G>>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. Х>>для интенсивных операций существует пулы/арены G>А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер?
даа, вся программа состоит из аллокаций в хипе, такую ещё поискать надо, а как же твои незабвенные 10% кода отнимают 90% ресурсов? или ето не распространяется на высоконагруженные сервера?
G>>>Кроме того проход по списку непотокобезопасен, поэтому требуются особые приседания чтобы стандартный аллокатор нормально заработал в многопоточном окружении. Х>>ну ето просто неправда G>Наверное неправльно понял. Приседания требуются в самом аллокаторе, кто снижает производительность.
что-то я совсем запутался, кто и где приседает.
Х>>>>>>в случае с с++ лямбдами исполнено на 100%, G>>>>>На 200%, лямбд просто нету Есть только жалкое подобие. Х>>>>может ты найдёшь определение lambda в интернет и перестанешь нести ахинею? G>>>Ты прочитай 3 предыдущие страницы. Нормальные лямбды подразумевают лексические замыкания, которых нету и не будет в С++. Х>>во-первых: лямбды не подразумевают замыкания, ето замыкания подразумевают лямбды. G>Источник этого бреда в студию.
какого бреда? лямбда — анонимная функция
замыкание — функция знающая о контексте вызывающей функции
возможно я погорячился что замыкания подразумевают лямбды, но в большинстве языков ето так, с чем ты не согласен собственно?
ещё раз про замыкания, в c++ ты можешь скопировать весь контекст (синтаксис [=]) и ето будет идентично по семантике с некоторыми лиспами, которые тоже копируют контекст, а не ссылки. Так с чем ты не согласен? то что С++ позволяет программисту оптимально оперировать контекстом? и там где не нужно копирование воспользоваться ссылкой? да, в случае ссылок программист должен учитывать время их жизни, но ето в мире с++ есстесственно, и от етого очевидно лямбды не меняют своего называния.
Х>>во-вторых: лексическое замыкание есть, прочитай теперь ты 3 предыдущие страницы. G>Нету. Можно сымитировать подобие лексических замыканий причем со значительными ограничениями.
ещё раз, где иммитация? в чём иммитация?
Х>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность G>Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету.
я рад за тебя что у тебя нет проблемм с производительностью, а в коде над которым я работаю нет утечек памяти, и явные delete можно пересчитать по пальцам, и что?
Здравствуйте, MxKazan, Вы писали:
MK>Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг!
Шутки-шутками, но если заглянуть в .NET GUI, то там прямо таки несколько активных топиков — про производительность. Однако!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
MK>>Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг!
ГВ>Шутки-шутками, но если заглянуть в .NET GUI, то там прямо таки несколько активных топиков — про производительность. Однако!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали: MK>>Я, конечно, предполагал, что ты так можешь облажаться, но что Геннадий туда же... Это прямо как про боксинг! ГВ>Шутки-шутками, но если заглянуть в .NET GUI, то там прямо таки несколько активных топиков — про производительность. Однако!
Ага. Только потом выясняется, что в обеих программисты создают по 10 тысяч пользовательских элементов, в одной это длиться 1-4 секунды, а в другой тормоза обнаруживаются в нативном(!) слое отрисовки. Только чтобы это понять, надо хотя-бы немного шарить в WPF, а не вестись на название тем. Кстати, еще упоминалось про тормоза в ветке .NET (не GUI). Не поделишься ссылками?
Здравствуйте, Хвост, Вы писали:
Х>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода?
Структуры, являющиеся контекстом лямбды изначально расположены не на стеке, а в хипе вместе со всем контекстом лямбды. Потому боксинга здесь нет.
Здравствуйте, MxKazan, Вы писали:
Х>>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода? MK>Легко. Эти структуры размещаются не на стеке, а в полях класса, который и лямбду оборачивает.
логично, в с++ вероятно похожая схема
Здравствуйте, Хвост, Вы писали:
Х>>>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода? S>>Структуры, являющиеся контекстом лямбды изначально расположены не на стеке, а в хипе вместе со всем контекстом лямбды. Потому боксинга здесь нет. Х>эээ, ребят, вы таки определитесь как оно работает
То, что структура лежит в хипе, не означает что она отбоксирована. Может хоть немного сделаешь вид, что понимаешь о чем пишешь?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали:
MK>>Легко. Эти структуры размещаются не на стеке, а в полях класса, который и лямбду оборачивает. Х>логично, в с++ вероятно похожая схема
Судя по описанию новшеств в C++0x, ссылку на которое давал ГВ, схема в C++ невероятно не похожа на дотнетовскую.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>>>кстати про боксинг, будь добр расскажи, какой магией структуры на стеке, которые являются контекстом лямбды, продляют свою жизнь при возврате лямбды из метода? S>>>Структуры, являющиеся контекстом лямбды изначально расположены не на стеке, а в хипе вместе со всем контекстом лямбды. Потому боксинга здесь нет. Х>>эээ, ребят, вы таки определитесь как оно работает MK>То, что структура лежит в хипе, не означает что она отбоксирована. Может хоть немного сделаешь вид, что понимаешь о чем пишешь?
погоди ерепенится, прочтя твоё сообщение я понял что структура изначально таки лежит на стеке, но в момент вызова лямбды она копируется в поле лямбды, своё же сообщение я написал в ответ на сообщение samius'а, в котором написано что структуры, попадающие в scope лямбды никогда не лежат на стеке, так как всё-таки верно? если верно второе то ето вообще удивительно, получается что там где в C# вызывается лямбда стековых структур не может быть в принципе, а ето просто неимоверный оверхед.
Здравствуйте, gandjustas, Вы писали:
G>>>Как раз таки привычки субъективны. А потребность в высокоуровневых языках в большенстве задач очень объективна. ГВ>>Приехали. C++ — высокоуровневый язык. Или вы хотите поговорить о DSL? Ну давай, поговорим про DSL. G>С++ очень низкоуровневый по сравнению с современными языками.
У меня дежа-вю. Это уже было и совсем недавно.
G>>>Но при этом существует достаточно много программистов на С++ со своим субъективным мнением. ГВ>>Если мнения этих программистов хватает, чтобы решать поставленные задачи, значит, потребность в языках местами преувеличена, т.е., не всегда объективна. Сам понимаешь, материя "потребности" тонкая, весьма зависимая от "интеграла по субъективным суждениям". G>Ну ты страшный бред говоришь. Это примерно как думать что не нужны машины, потому что лошадей хватает решать задачи.
Дык. Были бы машины. Больше похоже на замену одних лошадей чуть-чуть более другими.
ГВ>>Не совсем так. Дело в том, что GC для C++ не должен решать задачи управления абсолютно всеми объектами и никто ничего такого и не предлагает. Но для каких-то отдельных моментов он вполне может оказаться приемлемым решением, лучшим, чем reference counting. Ключевое слово: "какие-то отдельные моменты". G>Ну а тепереь давай точнее. Как будет происходить разделение между управляемыми GC объектами и остальными? Какие это даст преимущества?
Тут надо подумать, быстро не отвечу. Преимущества, по идее, должны быть в меньшем количестве lock (неизбежен при подсчёте ссылок) и соответственно — в меньшем количестве сбросов кэша процессора. Ну и конечно — в решении проблемы с циклическими ссылками.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>погоди ерепенится, прочтя твоё сообщение я понял что структура изначально таки лежит на стеке, но в момент вызова лямбды она копируется в поле лямбды, своё же сообщение я написал в ответ на сообщение samius'а, в котором написано что структуры, попадающие в scope лямбды никогда не лежат на стеке, так как всё-таки верно? Замкнутые структуры размещаются в полях класса.
Х>если верно второе то ето вообще удивительно, получается что там где в C# вызывается лямбда стековых структур не может быть в принципе, а ето просто неимоверный оверхед.
Ты так шутишь или взаправду считаешь, что 30-40 байт — это НЕИМОВЕРНЫЙ ОВЕРХЕД!?!?!?
Здравствуйте, criosray, Вы писали:
ГВ>>Шутки-шутками, но если заглянуть в .NET GUI, то там прямо таки несколько активных топиков — про производительность. Однако! C>Давайте загляним в топики в разделе С++.
Даже не заглядывая можно сказать, что производительность — любимая фишка плюсовиков, обсуждается часто и со вкусом. Так что, удивляться нечему.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
ГВ>>Всё, что не C++ — неправильно. C>Да, понятно.
Странно. Разве я называл шарповые или, например, лисповые лямбды — "недолямбдами", а сам C# — "недоязыком"? Так что, что-то тебе померещилось не то. Ты меня с кем-то путаешь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
Х>>погоди ерепенится, прочтя твоё сообщение я понял что структура изначально таки лежит на стеке, но в момент вызова лямбды она копируется в поле лямбды, своё же сообщение я написал в ответ на сообщение samius'а, в котором написано что структуры, попадающие в scope лямбды никогда не лежат на стеке, так как всё-таки верно? MK>Замкнутые структуры размещаются в полях класса.
логично, но меня всё же более интересовал вопрос о том, будут ли ети структуры существовать на стеке если они замкнуты.
Х>>если верно второе то ето вообще удивительно, получается что там где в C# вызывается лямбда стековых структур не может быть в принципе, а ето просто неимоверный оверхед. MK>Ты так шутишь или взаправду считаешь, что 30-40 байт — это НЕИМОВЕРНЫЙ ОВЕРХЕД!?!?!?
оверхед не в памяти, оверхед в скорости аллокации/доступа стек vs heap
Здравствуйте, samius, Вы писали:
COF>>А вот в C# нет деструкторов и переопределения операторов присваивания, например. S>Очень много желающих добавить в дотнет что-то. Например, паттерн-матчинг. И очень мало желающих вставить в дотнет деструкторы и операторы присванивания. Они почему-то нужны только C++-никам.
Ну так, а потом получается, что программы с GC страдают от утечек памяти. Кому сказать — не поверят :) Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки :)
Здравствуйте, Хвост, Вы писали:
Х>оверхед не в памяти, оверхед в скорости аллокации/доступа стек vs heap ааааа... я понял, ты хипом вообще не пользуешься, всё только в стеке, и пишешь ты только на ассемблере, а то в С++ еще и классы бывают с виртуальными методами, а это, как и хип, непременно неимоверный оверхед!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>>>Стандартные аллокаторы в С++ требуют прохода по списку свободных блоков памяти при выделении\освобождении, эта операция имеет алгоритмическую сложность O(n). При интенсивных операциях выделения\освобождения работает очеень медленно. Х>>>для интенсивных операций существует пулы/арены G>>А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер? Х>даа, вся программа состоит из аллокаций в хипе, такую ещё поискать надо, а как же твои незабвенные 10% кода отнимают 90% ресурсов? или ето не распространяется на высоконагруженные сервера?
Не путай. 10% кода выполняются 90% времени в вычислтеьных задачах.
При высоких нагрузках надо оптимально управлять ресурсами.
Х>ещё раз про замыкания, в c++ ты можешь скопировать весь контекст (синтаксис [=]) и ето будет идентично по семантике с некоторыми лиспами, которые тоже копируют контекст, а не ссылки. Так с чем ты не согласен? то что С++ позволяет программисту оптимально оперировать контекстом? и там где не нужно копирование воспользоваться ссылкой? да, в случае ссылок программист должен учитывать время их жизни, но ето в мире с++ есстесственно, и от етого очевидно лямбды не меняют своего называния.
Мда..
Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего.
Нет полноценных замыканий => нет полноценных лямбд. Твоя демагогия не интересует.
Х>>>во-вторых: лексическое замыкание есть, прочитай теперь ты 3 предыдущие страницы. G>>Нету. Можно сымитировать подобие лексических замыканий причем со значительными ограничениями. Х>ещё раз, где иммитация? в чём иммитация?
Читай выше и внимательнее.
Х>>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность G>>Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету. Х>я рад за тебя что у тебя нет проблемм с производительностью, а в коде над которым я работаю нет утечек памяти, и явные delete можно пересчитать по пальцам, и что?
И кто же память освобождает? shared_ptr, так они оверхед создают...
А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, samius, Вы писали:
COF>>>А вот в C# нет деструкторов и переопределения операторов присваивания, например. S>>Очень много желающих добавить в дотнет что-то. Например, паттерн-матчинг. И очень мало желающих вставить в дотнет деструкторы и операторы присванивания. Они почему-то нужны только C++-никам.
COF>Ну так, а потом получается, что программы с GC страдают от утечек памяти. Кому сказать — не поверят
Как связано отсутствие деструкторов и операторов присваивания в дотнете с утечками программ с GC?
COF>Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки
Что, программы на дотнете ни разу не ездят впринципе?
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>оверхед не в памяти, оверхед в скорости аллокации/доступа стек vs heap MK> ааааа... я понял, ты хипом вообще не пользуешься, всё только в стеке, и пишешь ты только на ассемблере, а то в С++ еще и классы бывают с виртуальными методами, а это, как и хип, непременно неимоверный оверхед!
к сожалению ты ничего не понял...
к тебе как к дотнетчику нескромный вопрос, чем занимаешься? вебом али ентерпрайзом? третьего то не дано
Здравствуйте, MxKazan, Вы писали:
Х>>погоди ерепенится, прочтя твоё сообщение я понял что структура изначально таки лежит на стеке, но в момент вызова лямбды она копируется в поле лямбды, своё же сообщение я написал в ответ на сообщение samius'а, в котором написано что структуры, попадающие в scope лямбды никогда не лежат на стеке, так как всё-таки верно? MK>Замкнутые структуры размещаются в полях класса.
А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, samius, Вы писали:
COF>>Ну так, а потом получается, что программы с GC страдают от утечек памяти. Кому сказать — не поверят :) S>Как связано отсутствие деструкторов и операторов присваивания в дотнете с утечками программ с GC?
Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. На самом деле, это очевидно. Или наша цель догнать и перегнать хаскель, в том числе и по производительности, а ресурсы уж как-нибудь сами собой освободятся? :)
COF>>Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки :) S>Что, программы на дотнете ни разу не ездят впринципе?
Здравствуйте, samius, Вы писали:
COF>>В конце-концов, ну не было в C++ лямбд — ну и черт с ними, вполне можно без них прожить. Что народ к ним привязался? S>А кто спорит? Можно. Можно прожить и без рекурсии, и даже без виртуальных методов.
Да что там лямбды. Десяток страниц назад кто-то доказывал что всю программу можно написать используя один стек.
Даешь офис на стеке
Здравствуйте, Хвост, Вы писали:
Х>>>если верно второе то ето вообще удивительно, получается что там где в C# вызывается лямбда стековых структур не может быть в принципе, а ето просто неимоверный оверхед. MK>>Ты так шутишь или взаправду считаешь, что 30-40 байт — это НЕИМОВЕРНЫЙ ОВЕРХЕД!?!?!? Х>оверхед не в памяти, оверхед в скорости аллокации/доступа стек vs heap
Ну и расскажи нам о скорости аллокации стек vs managed heap
Здравствуйте, gandjustas, Вы писали:
G>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего.
Да ёлки ж зелёные! Значения (синоним в данном контексте: копия переменной) плюсовыми лямбдами замыкаются с лёгкостью неимоверной. А дальше — хоть выводи функцию из скопа, хоть прихлопывай.
G>Нет полноценных замыканий => нет полноценных лямбд. Твоя демагогия не интересует.
Не, ну это уже просто феерично.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды?
Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
Здравствуйте, COFF, Вы писали:
COF>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. На самом деле, это очевидно. Или наша цель догнать и перегнать хаскель, в том числе и по производительности, а ресурсы уж как-нибудь сами собой освободятся?
Что значит "осмысленные"?
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, samius, Вы писали:
COF>>>Ну так, а потом получается, что программы с GC страдают от утечек памяти. Кому сказать — не поверят S>>Как связано отсутствие деструкторов и операторов присваивания в дотнете с утечками программ с GC?
COF>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти.
Осмысленное в твоем понимании — ручное?
COF>>>Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки S>>Что, программы на дотнете ни разу не ездят впринципе? COF>Медленно и печально
От чего такая уверенность?
Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать)
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды? MK>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
Примерно то же самое, кстати, должен делать и компилятор C++. Лямбда тоже преобразуется в класс с единственным методом (не считая конструктора копии, кажется) — "operator()(сигнатура, выведенная из параметров лямбды)".
По сути вопроса — понятно. Не знаешь, значит — не знаешь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
Это очередной ответ из серии "я ни черта не понимаю о чем там в ветках про .Net, но есть пачка слов, к которым можно прицепиться". Уже утомили.
Здравствуйте, MxKazan, Вы писали:
MK>Это очередной ответ из серии "я ни черта не понимаю о чем там в ветках про .Net, но есть пачка слов, к которым можно прицепиться". Уже утомили.
Ага, сейчас ты мне расскажешь про IDisposable :) Плавали, знаем..
Здравствуйте, gandjustas, Вы писали:
Х>>запомнил? G>Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую)
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
COF>>>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. G>>Осмысленное в твоем понимании — ручное?
COF>Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
А ты на C# писал чтонить сложнее heelo world?
А с асинхронным вводом-выводом работал?
Здравствуйте, COFF, Вы писали:
COF>Ага, сейчас ты мне расскажешь про IDisposable Плавали, знаем..
IDisposable сделан для unmanaged-ресурсов, чтобы за вашим, недоступным для GC, багажом следить.
В полностью managed библиотеках он практически не нужен. WPF тому пример.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды? MK>>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
ГВ>По сути вопроса — понятно. Не знаешь, значит — не знаешь.
Я не знаю только, делает ли компилятор в каких-либо случаях замыкание на стек. А те лямбды, которые я смотрел в Рефлекторе, реализованы именно так, как описано.
Здравствуйте, MxKazan, Вы писали:
COF>>Ага, сейчас ты мне расскажешь про IDisposable :) Плавали, знаем.. MK>IDisposable сделан для unmanaged-ресурсов, чтобы за вашим, недоступным для GC, багажом следить. MK>В полностью managed библиотеках он практически не нужен. WPF тому пример.
Хм, из ссылки выше я скорее заключил бы обратное :) Потом, времена когда вся система и все приложения будут работать под одной виртуальной машиной с одним GC пока не наступили, тогда может это и не нужно будет, а пока доступ ко внешним по отношению к данному GC ресурсам — это обычная рутинная задача для любого приложения.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика". G>Не, такие программы на С++ просто не появляются.
Во, талантище!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Хм, из ссылки выше я скорее заключил бы обратное Потом, времена когда вся система и все приложения будут работать под одной виртуальной машиной с одним GC пока не наступили, тогда может это и не нужно будет, а пока доступ ко внешним по отношению к данному GC ресурсам — это обычная рутинная задача для любого приложения.
Да ты не один такой. Вы тут многие свои оригинальные выводы делаете. Всё от того, что на .Net никто не пишет и смотрит на обсуждение с позиции "к чему бы придраться". Если бы ты почитал внимательно, то увидел бы, что спор идет против втаскивания наследия (unmanaged)WinForms в WPF. Мне еще не разу не понадобился IDisposable, хотя уже 7 месяцев работаю над приложением на WPF, и контролы писал и шаблоны ваял и много много еще чего.
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
G>>А с асинхронным вводом-выводом работал? COF>А причем тут это?
При том.
Асинхронный ввод-вывод ломает "линейную" структуры программы, это очень сильно сказывается на том как управлять ресурсами.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
COF>>>>>Такое впечатление, что в ситуации "вам шашечки или ехать", дотнетчики уверенно выбирают шашечки S>>>>Что, программы на дотнете ни разу не ездят впринципе? COF>>>Медленно и печально G>>От чего такая уверенность? G>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) Х>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает
20 тысяч векторных примитивов с прозрачностью?
Здравствуйте, Хвост, Вы писали:
Х>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает
Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса?
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает MK>Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса?
не пользовательского интерфейса, а скорее упомянутые gandjustas'ом "20 тысяч векторных примитивов с прозрачностью", но при етом ессно каждый етот примитив отзывчив на действия пользователя.
Здравствуйте, gandjustas, Вы писали:
G>>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) Х>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает G>20 тысяч векторных примитивов с прозрачностью?
круто, да?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали: MK>>Здравствуйте, Хвост, Вы писали: Х>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает MK>>Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса? Х>не пользовательского интерфейса, а скорее упомянутые gandjustas'ом "20 тысяч векторных примитивов с прозрачностью", но при етом ессно каждый етот примитив отзывчив на действия пользователя.
Ну а че, мож какие подробности? Что рисует эти примитивы, как "отзывчивость" реализуется? На каком компе ты этот "полет" наблюдаешь?
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, MxKazan, Вы писали: MK>>>Здравствуйте, Хвост, Вы писали: Х>>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает MK>>>Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса? Х>>не пользовательского интерфейса, а скорее упомянутые gandjustas'ом "20 тысяч векторных примитивов с прозрачностью", но при етом ессно каждый етот примитив отзывчив на действия пользователя. MK>Ну а че, мож какие подробности? Что рисует эти примитивы, как "отзывчивость" реализуется? На каком компе ты этот "полет" наблюдаешь?
военная тайна: рендерер — OpenGL (ето если прозрачность нужна, без хардварной акселлерации прозрачность тоже "летает", но так низенько-низенько ), отзывчивость реализуется тем что реально объект, ответственный за отзывчивость создаётся только в момент начального действия пользователя (тыкнул мышкой в примитив/нажал хоткей/выбрал менюшку), а так по сути 99.99% того что видно на екране — просто картинка. Вроде ничего хитрого.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, gandjustas, Вы писали:
G>>>>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) Х>>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает G>>>20 тысяч векторных примитивов с прозрачностью? Х>>круто, да? G>Слабо верится.
т.е. тебе и в современные 3д игры слабо верится, да? а там ведь покруче будет.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, Хвост, Вы писали:
Х>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает MK>>Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса? Х>не пользовательского интерфейса, а скорее упомянутые gandjustas'ом "20 тысяч векторных примитивов с прозрачностью", но при етом ессно каждый етот примитив отзывчив на действия пользователя.
GDI? DirectX? OpenGL? Боюсь, что это не заслуги C++. Да и не вопрос повторить на шарпе. (WPF покурит пожалуй).
Каждый примитив отзывчив? А зачем при этом перерисовывать остальные 20 тысяч? чтобы было чем занять процессор?
Писал GIS на первом шарпе. Миллионы объектов, в каждом тысячи точек. Но вот чтобы перерисовать 20 тысяч за 25 сек, задачи не вставало. Обходились одним/двумя/группой выделенных с буферизацией картинки остальных.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, MxKazan, Вы писали:
MK>>>Здравствуйте, Хвост, Вы писали:
Х>>>>тут я уже упомянул что работаю над GIS, так вот, конечно не 10 тысяч объектов, а 20 тысяч, ну и не 1-4 секунды а 25 раз в секунду (чтобы глазу было приятно), похоже ты прав, ето пожалуй не едет, ето пожалуй летает MK>>>Чего 25 раз в секунду? Пересоздаешь 25 раз в секунду 20 тысяч объектов пользовательского интерфейса? Х>>не пользовательского интерфейса, а скорее упомянутые gandjustas'ом "20 тысяч векторных примитивов с прозрачностью", но при етом ессно каждый етот примитив отзывчив на действия пользователя. S>GDI? DirectX? OpenGL? Боюсь, что это не заслуги C++. Да и не вопрос повторить на шарпе. (WPF покурит пожалуй).
S>Каждый примитив отзывчив? А зачем при этом перерисовывать остальные 20 тысяч? чтобы было чем занять процессор?
а как ты реализуешь плавный скролл/зум?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Каждый примитив отзывчив? А зачем при этом перерисовывать остальные 20 тысяч? чтобы было чем занять процессор? Х>а как ты реализуешь плавный скролл/зум?
Заморозкой рендеригна на время скролл-а. Но тот GIS был чисто GDI-шным.
Правда потом (уже на втором шарпе) приходилось прикручивать к ESRI ArcMap 8 рельеф местности на DirectX-е. Вот при скроллинге рельеф был, а карта дорисовывалась после.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>военная тайна: рендерер — OpenGL S>Что тут недостижимого для C#?
тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую, тут даже такая вещь как проверка индекса на допустимый диапазон при обращению к массиву даёт проседание в 30%, куда здесь C# тулить?
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, samius, Вы писали:
S>>>Каждый примитив отзывчив? А зачем при этом перерисовывать остальные 20 тысяч? чтобы было чем занять процессор? Х>>а как ты реализуешь плавный скролл/зум? S>Заморозкой рендеригна на время скролл-а. Но тот GIS был чисто GDI-шным.
ну собственно так почти у всех сделано, хотя у нас нет заморозки даже в GDI режиме, правда и прозрачности нет.
Здравствуйте, Хвост, Вы писали:
MK>>Ну а че, мож какие подробности? Что рисует эти примитивы, как "отзывчивость" реализуется? На каком компе ты этот "полет" наблюдаешь? Х>военная тайна: рендерер — OpenGL (ето если прозрачность нужна, без хардварной акселлерации прозрачность тоже "летает", но так низенько-низенько ), отзывчивость реализуется тем что реально объект, ответственный за отзывчивость создаётся только в момент начального действия пользователя (тыкнул мышкой в примитив/нажал хоткей/выбрал менюшку), а так по сути 99.99% того что видно на екране — просто картинка. Вроде ничего хитрого.
Так я и думал. Чего ж ты теплое с мягким сравниваешь? WPF не конкурент рисованию ручками на уровне "линию туда, кружочек сюда" по части скорости, как и рисование "линию туда, кружочек сюда" не конкурент WPF по части фич, таких как биндинг. Микрософт, кстати, сама не позиционирует WPF как библиотеку для приложений, требующих столь сложной графики. И люди в здравом уме это понимают.
Здравствуйте, Хвост, Вы писали:
Х>тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую, тут даже такая вещь как проверка индекса на допустимый диапазон при обращению к массиву даёт проседание в 30%, куда здесь C# тулить?
Ой да ладно. Ты пробовал или снова "боксинг"?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, Хвост, Вы писали:
Х>>>военная тайна: рендерер — OpenGL S>>Что тут недостижимого для C#? Х>тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую
Координатная система тоже 25 раз в секунду меняется?
X>тут даже такая вещь как проверка индекса на допустимый диапазон при обращению к массиву даёт проседание в 30%, куда здесь C# тулить?
Да, кудауж тут C#-у. Он даже по массивам не умеет ходить
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, samius, Вы писали:
S>>>Здравствуйте, Хвост, Вы писали:
Х>>>>военная тайна: рендерер — OpenGL S>>>Что тут недостижимого для C#? Х>>тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую S>Координатная система тоже 25 раз в секунду меняется?
не понял что имелось ввиду. Координаты подавляющего большинства примитивов хранятся всегда в неизменном виде, и их при каждом скролле или зуме необходимо пересчитывать в екранные координаты.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, samius, Вы писали:
S>>>Координатная система тоже 25 раз в секунду меняется? Х>>не понял что имелось ввиду. Координаты подавляющего большинства примитивов хранятся всегда в неизменном виде, и их при каждом скролле или зуме необходимо пересчитывать в екранные координаты. S>Вообще OpenGL и сам умеет пересчитывать координаты, правда только афинные и почти афинные преобразования, те что можно описать матрицей. S>Знаю, что хранятся другие координаты, например, геодезические. Но, их ведь можно преобразовать единожды при чтении в "почти экранные", т.е. в такие координаты, которые легко преобразуются как GDI так и OpenGL-ем. Естественно, все операции с координатами следует проводит с оригинальными координатами, а "почти экранные" хороши для рендеринга. Тогда преобразование координат (кроме первоначального) полностью ляжет на железо.
абсолютно верно, но ето к сожалению шило на мыло, потому как видимых елементов на екране на порядок/порядки меньше чем есть на самом деле, а для возможности акселлерации прийдётся их трансформировать все, а не только видимые, в случае с GDI ето просто смертельно. Что немаловажно, постоянные трансформации вносят ошибки, поетому оказалось проще и еффективней реализовать схему которая есть.
Здравствуйте, samius, Вы писали:
S>На самом деле, мы уже выбились из темы и перешли к деталям реализации GIS-ов.
так ето здорово во флейме и так в основном пустопорожний разговор, так что ето только в плюс. S>Но я отвечу.
S>Порядки не важны, т.к. есть набор видимых элементов, который обновляется в зависимости от позиции и масштаба вьюхи. Есть эффективные алгоритмы пространственного индексирования объектов, которыми можно пользоваться для того, чтобы читать только те объекты, которые требуется отображать. Потому ни трансформировать все объекты ни читать их в память для отрисовки не обязательно. Те что прочитаны — трансформируются один раз софтом в промежуточную систему координат, все остальные разы железом.
но ведь при скролле/зуме, когда во вьюху попадают новые области, необходимо их заново трансформировать в промежуточную форму, поетому с таким же успехом можно трансформировать сразу в екранную.
S>Постоянные трансформации не могут вносить ошибки если эти трансформации не туда-обратно. Всегда есть правильные (родные координаты объекта) и все остальные, полученые из них. Вся логика типа кадастра работает с родными координатами, либо непосредственно полученными из родных. S>А отрисовке — пофик на точность. Там на пиксель набежит больше любой погрешности.
ну собственно я про точность отрисовки и говорил, например последовательный зум-аут/зум ин на одну и ту же величину и мы видим уже не то что в начале, или например такой вау-эффект как перелёт из одной точки в другую (как в гуглёрсе) уже не выглядит как последовательное умножение матрицы трансформации на какую-то статичную другую, т.к. накапливаются ошибки. В принципе все ети неточности несложно обходятся, но дело в том что незачем, т.к. на данный момент все трансформации в софте.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, samius, Вы писали:
S>>>Порядки не важны, т.к. есть набор видимых элементов, который обновляется в зависимости от позиции и масштаба вьюхи. Есть эффективные алгоритмы пространственного индексирования объектов, которыми можно пользоваться для того, чтобы читать только те объекты, которые требуется отображать. Потому ни трансформировать все объекты ни читать их в память для отрисовки не обязательно. Те что прочитаны — трансформируются один раз софтом в промежуточную систему координат, все остальные разы железом. Х>>но ведь при скролле/зуме, когда во вьюху попадают новые области, необходимо их заново трансформировать в промежуточную форму, поетому с таким же успехом можно трансформировать сразу в екранную. S>Зло. Вьюх может быть несколько (+обзорная, например) с разными экранными координатами. При активной работе с зумом или изменением размеров окна перерисовывать объекты требуется часто, потому софтовый пересчет каждый раз из геодезии в экранные дорог. А из геодезии в промежуточные псевдо-экранные можно считать только однажны.
ну ещё раз, их либо пересчитывать в псевдо-екранные нужно при каждом сдвиге/масштабировании карты (ето если у нас есть псевдоекранные координаты только видимой области) либо пересчитать все координаты (т.е. и те что вне зоны видимости) во внеекранные заранее, тогда можно пользовать аксселлерированые преобразования, но ето как я уже писал шило на мыло.
S>>>Постоянные трансформации не могут вносить ошибки если эти трансформации не туда-обратно. Всегда есть правильные (родные координаты объекта) и все остальные, полученые из них. Вся логика типа кадастра работает с родными координатами, либо непосредственно полученными из родных. S>>>А отрисовке — пофик на точность. Там на пиксель набежит больше любой погрешности. Х>>ну собственно я про точность отрисовки и говорил, например последовательный зум-аут/зум ин на одну и ту же величину и мы видим уже не то что в начале S>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке.
дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку.
X>>или например такой вау-эффект как перелёт из одной точки в другую (как в гуглёрсе) уже не выглядит как последовательное умножение матрицы трансформации на какую-то статичную другую, т.к. накапливаются ошибки. S>Как или конкретно как в гуглёрсе? AFAIK там рисуются не примитивы во время таких эффектов. Во всяком случае не десятками тысяч.
ну я имею ввиду скорее манеру полёта а не сам внешний вид
S>Но повторить худо-бедно такой пролет на векторных данных можно. Естественно, будет зависеть от обилия данных и способа проекции (либо проекция текстуры, либо плоский рендеринг по спроектированным с шарика на плоскость координатам). С шарика на плоскость тоже можно схалтурить и поручить железу.
да, можно, если учесть неточности железки и соответственно с этим написать алгоритм пролёта.
X>>В принципе все ети неточности несложно обходятся, но дело в том что незачем, т.к. на данный момент все трансформации в софте. S>Софтовые трансформации тоже можно сократить введением промежуточной системы координат. Даже на шарике.
про проблемы с промежуточную систему координат вроде написал
S>Так что запас по производительности есть и значительный. Потому не вижу неподъемных для C# задачь.
В принципе задачу можно реализовать и на C#, но куча визуальных ништяков отомрёт.
Здравствуйте, Хвост, Вы писали:
Х>задумайся почему всё ето так, пойми и осознай, что производительность — ето ресурс, и будет им во веки веков, и процессор, который быстрее в два раза другого, стоит в 3 раза дороже, и юзер выберет программу которая может выполнять три функции параллельно а не две.
Да прям. На тот же Flash и JS (до V8 и подобных) посмотри. Оба тормозиловы жуткие, куда уж там Java до них. И ничо.
Здравствуйте, Геннадий Васильев, Вы писали: ГВ>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции?
Нет, нельзя. А главное — зачем? ГВ>Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды?
Нет, никакого копирования нет. Т, что выглядит локальными переменными, становится полями структуры. Все обращения в коде метода к этим локальным переменным превращаются в обращения к полям.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Геннадий Васильев, Вы писали: ГВ>>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? S>Нет, нельзя. А главное — зачем?
Логически — незачем. С точки зрения быстродействия может дать некоторый выигрыш, поскольку данные не будут лишний раз копироваться.
ГВ>>Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды? S>Нет, никакого копирования нет. Т, что выглядит локальными переменными, становится полями структуры. Все обращения в коде метода к этим локальным переменным превращаются в обращения к полям.
Стоп, тогда я тебя не понял. Значит, физически, данные в структуре, размещённой в стеке и в объекте-лямбде — одни и те же? Или нет? Мы сейчас обсуждаем ситуацию, когда данные представляют собой структуру (не объект). Для упрощения положим, что лямбда не выходит за пределы скопа, где объявлена замыкаемая структура, то есть время жизни лямбда-объекта гарантированно превышает время жизни замыкаемой структуры и компилятору об этом известно.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>...то есть время жизни лямбда-объекта гарантированно превышает время жизни замыкаемой структуры и компилятору об этом известно.
Наоборот, разумеется — время жизни лямбды гарантированно меньше времени жизни структуры.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Sinclair, Вы писали:
S>К счастью, стоимость размещения в хипе в управляемой среде ненамного выше стоимости размещения в стеке.
Заметно, если вспомнить foreach по перечислителю-структуре и по перечислителю-классу. Но что-то я не замечал, что бы большинство занимались ручной реализацией перечислителей на структурах. Т.е. в большинстве случаев приемлемо (и лямбда с замыканием на хипе и перечислитель на интерфейсе), а если профайлер скажет что беда, недолго переписать низкоуровневыми средствами критичный кусок.
S>Для того, чтобы написать программу, в которой будет заметен эффект от того, что лямбда размещена не в стеке, нужно очень-очень постараться. А мы тем временем продолжаем надеяться на то, что за то время, которое тебе потребуется для написания этой программы, к CLR таки прикрутят escape analysis. А в отличие от нативного кода, MSIL всех приложений автоматически выиграет от этого будущего улучшения без явной перекомпиляции и передеплоймента приложений.
Да не, можно найти тысячу ситуаций (искувственных и натуральных), где разница в способе размещения замыкания будет заметна. Взять хотя бы тот же расчет координат в GIS-ах. Да, точно! В таких нагруженных случаях пользоваться лямбдой вообще неуместно, потому говорить о разнице между размещением замыкания лямбды на стеке и хипе как-бы неуместно. Боюсь что больше будет заметна разница лямбд на делегатах (в C#) и лямбд на виртуальных функциях (Nemerle и F#).
Здравствуйте, samius, Вы писали:
S>Заметно, если вспомнить foreach по перечислителю-структуре и по перечислителю-классу.
Это никак не связано с размещением. Разница в скорости сводится к возможности инлайнинга: для структур компилятор и JIT знают точный тип аргумента, в отличие от паттерна, постренного на абстрактном IEnumerable<T>. С лямбдами такой разницы не будет — попробуй на досуге сравнить скорострельность "автогенеренной" лямбды с ручным замыканием, выполненным поверх структуры в стеке.
S> Но что-то я не замечал, что бы большинство занимались ручной реализацией перечислителей на структурах. Т.е. в большинстве случаев приемлемо (и лямбда с замыканием на хипе и перечислитель на интерфейсе), а если профайлер скажет что беда, недолго переписать низкоуровневыми средствами критичный кусок.
Это верно.
S>Да не, можно найти тысячу ситуаций (искувственных и натуральных), где разница в способе размещения замыкания будет заметна. Взять хотя бы тот же расчет координат в GIS-ах. Да, точно! В таких нагруженных случаях пользоваться лямбдой вообще неуместно, потому говорить о разнице между размещением замыкания лямбды на стеке и хипе как-бы неуместно. Боюсь что больше будет заметна разница лямбд на делегатах (в C#) и лямбд на виртуальных функциях (Nemerle и F#).
Я пока не в курсе, нужны ли вообще лямбды в расчётах координат в GIS. Хотя, если вспомнить про то, что лямбды умеют сворачиваться не только в делегаты, но и в Expression Trees, то они могут напрочь порвать реализацию на С++ путём компиляции в шейдерные операции для выполнения в GPU
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, Хвост, Вы писали:
Х>>>тут недостижимого на C# то что отрисовка на акселлераторе занимает меньшую часть времени отрисовки кадра, основное время — трансформация примитивов из одной координатной системы в другую, тут даже такая вещь как проверка индекса на допустимый диапазон при обращению к массиву даёт проседание в 30%, куда здесь C# тулить? MK>>Ой да ладно. Ты пробовал или снова "боксинг"? Х>что да ладно? про индексы ето факт, если ты про C# то ессно не пробовал, потому как не взлетит очевидно.
Ну не надо так откровенно сливать.
Приведи тест где заметны эти 30%.
Как ты можешт рассуждать о производительности .NET, если не писал на нем ничего?
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>Заметно, если вспомнить foreach по перечислителю-структуре и по перечислителю-классу. S>Это никак не связано с размещением. Разница в скорости сводится к возможности инлайнинга: для структур компилятор и JIT знают точный тип аргумента, в отличие от паттерна, постренного на абстрактном IEnumerable<T>. С лямбдами такой разницы не будет — попробуй на досуге сравнить скорострельность "автогенеренной" лямбды с ручным замыканием, выполненным поверх структуры в стеке.
Попробую на досуге.
S>Я пока не в курсе, нужны ли вообще лямбды в расчётах координат в GIS. Хотя, если вспомнить про то, что лямбды умеют сворачиваться не только в делегаты, но и в Expression Trees, то они могут напрочь порвать реализацию на С++ путём компиляции в шейдерные операции для выполнения в GPU
Нужны или нет незнаю, но всунуть их насильно туда можно, но не нужно.
А идея с шейдерами мне понравилась. Но не ради порвать C++, а ради реализации полезных фич.
Апроксимировать проекцию набором треугольников, и внутри тотуголика использовать афинный мапинг.
Преимущества
1. Данные мапятся на плоскость треугольника единожды и кешируются.
2. все трансформации как апаратно так и совтово очень простые (афинные).
3. хорошо ляжет на апаратное ускорение.
Здравствуйте, Хвост, Вы писали:
S>>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке. Х>дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку.
Этот момент мне не совсем ясен, можно подробнее ? Ошибка в матрице по отношению к чему? какая именно ошибка ?
Трансформацию можно хранить не в матрице а как набор трансформаций Rotation(from radians) * translation( x,y) * scale(s)
Здравствуйте, minorlogic, Вы писали:
M>Мне бы сразу в голову пришла идея.
M>Апроксимировать проекцию набором треугольников, и внутри тотуголика использовать афинный мапинг.
M>Преимущества M>1. Данные мапятся на плоскость треугольника единожды и кешируются. M>2. все трансформации как апаратно так и совтово очень простые (афинные). M>3. хорошо ляжет на апаратное ускорение.
Но и эффект будет не тот, как в рендеригне без мапинга изображения. В GIS случаются немонотонные заливки, там важны толщины и структуры линий, значки (иконки). Все это поплывает при аффинном мапинге кэшированного изображения.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)? Х>пул потоков обычно нативный, причём здесь С++? зелёные треды очень хороши для серверов, ага))) хип за O(1) ? в С++ можно аллоцировать память в хипе вообще один раз и на всю жизнь, и обеспечить свой микроменеджмент, при етом рефакторинг кода сведётся фактически к find/replace.
Здравствуйте, minorlogic, Вы писали:
M>Здравствуйте, Хвост, Вы писали:
S>>>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке. Х>>дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку.
M>Этот момент мне не совсем ясен, можно подробнее ? Ошибка в матрице по отношению к чему? какая именно ошибка ?
Имеется ввиду, что если матрицу подвергнуть череде преобразований, так что последнее преобразование должно вернуть матрицу в исходное состояние (например, зум-аут и зум-ин на ту же величину), то мы получим матрицу, которая в точности не будет совпадать с исходной за счет погрешности вычислений. При повторении погрешность может убежать.
M>Трансформацию можно хранить не в матрице а как набор трансформаций Rotation(from radians) * translation( x,y) * scale(s)
Вот именно. Погрешность не накопится в случае, когда есть исходная матрица X (всегда одинаковая) и набор параметров (поворот, масштаб, сдвиг).
Здравствуйте, samius, Вы писали:
S>Здравствуйте, minorlogic, Вы писали:
M>>Мне бы сразу в голову пришла идея.
M>>Апроксимировать проекцию набором треугольников, и внутри тотуголика использовать афинный мапинг.
M>>Преимущества M>>1. Данные мапятся на плоскость треугольника единожды и кешируются. M>>2. все трансформации как апаратно так и совтово очень простые (афинные). M>>3. хорошо ляжет на апаратное ускорение.
S>Но и эффект будет не тот, как в рендеригне без мапинга изображения. В GIS случаются немонотонные заливки, там важны толщины и структуры линий, значки (иконки). Все это поплывает при аффинном мапинге кэшированного изображения.
Скорее всего ты неправильно меня понял.
M>>1. Данные мапятся на плоскость треугольника единожды и кешируются.
Имелось ввиду не кеширование растра , а кеширование спроецированных данных. GIS Data(Vector data(lat lon)) -> Projection Data(Vector data)
Projection Data — может быть и Equiretangular а может и на сферу.
А кешированеи отрендренной текстуры на треугольник это допольнительная фича, так сказать по требованию. Напрмиер при быстром показе мы может отрисовать закешированный растр и потом когда будет время отрендрить заново с лучшим качеством.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>ну ещё раз, их либо пересчитывать в псевдо-екранные нужно при каждом сдвиге/масштабировании карты (ето если у нас есть псевдоекранные координаты только видимой области) либо пересчитать все координаты (т.е. и те что вне зоны видимости) во внеекранные заранее, тогда можно пользовать аксселлерированые преобразования, но ето как я уже писал шило на мыло. S>Еще раз. Если мы в "плоском" режиме, не проецируя геометрию на шарик, либо проецируя на шарик текстуру, то псевдо-экранные координаты считаются один раз. Сдвиг и масштабирование не потребует полного пересчета, т.к. позволит домножить на матрицу, что можно отдать железу. Для того чтобы понять, лежит объект на экране или нет, пересчитвать его координаты в экранные нет нужды! Достаточно иметь рамку экрана в псевдоэкранных координатах и пространственный индекс в родных координатах объекта. S>В случае с шариком тоже поможет промежуточная система координат. Однако, она уже не будет аффинно преобразовываться в экранную, но экономия в расчетах все еще будет при повторе прорисовки объекта.
S>>>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке. Х>>дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку. S>А, вона ты о чем Так- конечно. Тут и зумать не надо. Потаскал карту мышкой в режиме пана и объекты разбежались кто-куда (набежала погрешность на сдвигах). S>Такой эффект решается запоминанием предыдущего положения и направления "наблюдателя" и применения коэффициентов к нему. Тогда при 1000 зумов или 1000 панах меняются туда-обратно не коэффициенты матрицы, а коэффициенты, которые требуется применить к предыдущему положению "наблюдателя", фактически к запомненной ранее матрице вида. Сразу про накопление ошибки в матрице на множестве итераций туда-обратно можно забыть.
S>>>Но повторить худо-бедно такой пролет на векторных данных можно. Естественно, будет зависеть от обилия данных и способа проекции (либо проекция текстуры, либо плоский рендеринг по спроектированным с шарика на плоскость координатам). С шарика на плоскость тоже можно схалтурить и поручить железу. Х>>да, можно, если учесть неточности железки и соответственно с этим написать алгоритм пролёта. S>Какие неточности железки? Пиксель туда-сюда?
S>>>Софтовые трансформации тоже можно сократить введением промежуточной системы координат. Даже на шарике. Х>>про проблемы с промежуточную систему координат вроде написал S>Нету там проблемы. Одна экономия в расчетах координат повторной прорисовки примитива при смене вида. Что на железе что на софте.
S>>>Так что запас по производительности есть и значительный. Потому не вижу неподъемных для C# задачь. Х>>В принципе задачу можно реализовать и на C#, но куча визуальных ништяков отомрёт. S>Например?
Здравствуйте, Хвост, Вы писали:
както неудачно нажал отправить, предыдущее сообщение можно удалить
Х>>>ну ещё раз, их либо пересчитывать в псевдо-екранные нужно при каждом сдвиге/масштабировании карты (ето если у нас есть псевдоекранные координаты только видимой области) либо пересчитать все координаты (т.е. и те что вне зоны видимости) во внеекранные заранее, тогда можно пользовать аксселлерированые преобразования, но ето как я уже писал шило на мыло. S>>Еще раз. Если мы в "плоском" режиме, не проецируя геометрию на шарик, либо проецируя на шарик текстуру, то псевдо-экранные координаты считаются один раз. Сдвиг и масштабирование не потребует полного пересчета, т.к. позволит домножить на матрицу, что можно отдать железу. Для того чтобы понять, лежит объект на экране или нет, пересчитвать его координаты в экранные нет нужды! Достаточно иметь рамку экрана в псевдоэкранных координатах и пространственный индекс в родных координатах объекта.
давай тезисами опишу проблемму
чтобы трансформировать на железе — нужно иметь псевдо-екранные координаты (ето ещё не проблемма)
для того чтобы работать со всей геометрией — нужно иметь её всю в псевдо-екранных координатах (тут проблемма — резко возросшее число геометрии для трансформации)
если не всю — а только видимую, то необходимо постоянно пересчитывать в псевдо-екранные координаты геометрию, появляющуюся во вьюхе при скролле/зуме (тут проблемма — какой тогда смысл в трансформациях на железе если нужно постоянно трансформировать в псевдо-екранные координаты новую видимую геометрию)
S>>>>А я говорил, что только промежуточные, а потом манипуляция матрицей. Потому 1000 раз зум-аут/зум-ин не повлияют на координаты. В любом случае координаты объекта при смене вида меняться не должны. Координаты примитива — пожалуйста. Объект неизменен при прорисовке. Х>>>дык объект то и неизменен, вид примитива и меняется, т.к. матрица трансформации при 1000 раз зум-аут/зум-ин накапливает ошибку. S>>А, вона ты о чем Так- конечно. Тут и зумать не надо. Потаскал карту мышкой в режиме пана и объекты разбежались кто-куда (набежала погрешность на сдвигах). S>>Такой эффект решается запоминанием предыдущего положения и направления "наблюдателя" и применения коэффициентов к нему. Тогда при 1000 зумов или 1000 панах меняются туда-обратно не коэффициенты матрицы, а коэффициенты, которые требуется применить к предыдущему положению "наблюдателя", фактически к запомненной ранее матрице вида. Сразу про накопление ошибки в матрице на множестве итераций туда-обратно можно забыть.
всё верно, просто код становится чуть менее тривиальным, но ето не проблемма.
S>>>>Но повторить худо-бедно такой пролет на векторных данных можно. Естественно, будет зависеть от обилия данных и способа проекции (либо проекция текстуры, либо плоский рендеринг по спроектированным с шарика на плоскость координатам). С шарика на плоскость тоже можно схалтурить и поручить железу. Х>>>да, можно, если учесть неточности железки и соответственно с этим написать алгоритм пролёта. S>>Какие неточности железки? Пиксель туда-сюда?
ну вообще-то не пиксель, а поболе, заметно глазу.
Здравствуйте, samius, Вы писали:
S>Теперь кажись понял. Но тут мы получаем дополнительную задачу разбиения примитивов по треугольникам с разными преобразованиями. Например, если взять полигон-контур России, то он размажется по многим треугольникам, аппроксимирующим эллипсойд. Сразу получим проблему стыков частей такой фигуры по границам аппроксимирующих треугольников. Без введения дополнительных точек не представляю как решать. S>Нужен gluTess, либо своя реализация теоретико-множественных операций над точками, ограниченных контурами полигонов. Решается. Да и порядочный GIS должен иметь такую штуку в арсенале.
+1, только хотел отметить про gluTess, что он настолько тормозной (даже для не-реалтайм триангуляции) что даже и пытаться не стоит, есть реализации на порядки быстрее.
Здравствуйте, CreatorCray, Вы писали:
G>>Твой наколенный непотокобезопасен. CC> CC>Жжошь! CC>Можно узнать с какого перепугу ты так решил?
ну как же, ведь всё что быстрее гц ето заведомо непотокобезопасно и вообще UB
кстати результат гц просто удручает, всего в полтора раза быстрее VC-шного CRT-аллокатора, и ето быстро??? абберация налицо
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, CreatorCray, Вы писали:
CC>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока.
G>Кстати с явным Free тоже бльшая попа. Все это придется оборачивать в очередные умные указатели чтобы не было утечек.
G>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий.
в полтора раза быстрее чем С++ ный CRT аллокатор ето не быстро, вот сделать быстро на C# нет вообще вариантов, возможно только через ансейф но ето настолько уныло в пользовании что даже обсуждать не стоит.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, CreatorCray, Вы писали:
CC>>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока.
G>>Кстати с явным Free тоже бльшая попа. Все это придется оборачивать в очередные умные указатели чтобы не было утечек.
G>>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий. Х>в полтора раза быстрее чем С++ ный CRT аллокатор ето не быстро, вот сделать быстро на C# нет вообще вариантов, возможно только через ансейф но ето настолько уныло в пользовании что даже обсуждать не стоит.
Здравствуйте, gandjustas, Вы писали:
G>>>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий. Х>>в полтора раза быстрее чем С++ ный CRT аллокатор ето не быстро, вот сделать быстро на C# нет вообще вариантов, возможно только через ансейф но ето настолько уныло в пользовании что даже обсуждать не стоит.
G>Что именно сделать быстро надо?
аллокации, ты что собственно мерил своим тестом?
G>Ты писал на C#?
был период, когда жизнь заставляла использовать ету замазку для мозга, да.
Здравствуйте, samius, Вы писали:
S>>Для того, чтобы написать программу, в которой будет заметен эффект от того, что лямбда размещена не в стеке, нужно очень-очень постараться. А мы тем временем продолжаем надеяться на то, что за то время, которое тебе потребуется для написания этой программы, к CLR таки прикрутят escape analysis. А в отличие от нативного кода, MSIL всех приложений автоматически выиграет от этого будущего улучшения без явной перекомпиляции и передеплоймента приложений. S>Да не, можно найти тысячу ситуаций (искувственных и натуральных), где разница в способе размещения замыкания будет заметна. Взять хотя бы тот же расчет координат в GIS-ах. Да, точно! В таких нагруженных случаях пользоваться лямбдой вообще неуместно, потому говорить о разнице между размещением замыкания лямбды на стеке и хипе как-бы неуместно. Боюсь что больше будет заметна разница лямбд на делегатах (в C#) и лямбд на виртуальных функциях (Nemerle и F#).
кстати вот лично у меня для трансформации используется функтор, который создаётся на стеке, но компиляторы С++ сейчас настолько умные что инлайнят всё и вся и оверхедов ноль, поетому в С++ я думаю лямбды в моём случае никак не повлияют на производительность, а вот с C# вопрос не однозначен.
Здравствуйте, criosray, Вы писали:
G>>>Ты писал на C#? Х>>был период, когда жизнь заставляла использовать ету замазку для мозга, да. C>Замазка Вам явно не помешала бы — чтоб поменьше сквозняков было.
вы по своему богатому опыту судите?
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>>>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий. Х>>>в полтора раза быстрее чем С++ ный CRT аллокатор ето не быстро, вот сделать быстро на C# нет вообще вариантов, возможно только через ансейф но ето настолько уныло в пользовании что даже обсуждать не стоит.
G>>Что именно сделать быстро надо? Х>аллокации, ты что собственно мерил своим тестом?
И как их с помощью ансейфа сделать быстро?
И как сделать универсальный аллокатор на С++, сравнимый по скорости с .NETовским?
G>>Ты писал на C#? Х>был период, когда жизнь заставляла использовать ету замазку для мозга, да.
То есть не писал.
Здравствуйте, gandjustas, Вы писали:
G>>>Что именно сделать быстро надо? Х>>аллокации, ты что собственно мерил своим тестом? G>И как их с помощью ансейфа сделать быстро?
Ну как, "мы наш, мы новый мир построим", HeapAlloc + ручное управление памятью, указатели, MyMemMgr.alloc() етц, только пользовать ето будет сложнее, смартпоинтеров то нет
G>И как сделать универсальный аллокатор на С++, сравнимый по скорости с .NETовским?
скажи мне что такое универсальный аллокатор, вот аллокатор by CreatorCray для меня достаточно универсален. можно взять tcmalloc, тоже быстрая и потокобезопасная вещь, универсальней что называется некуда, т.к. замена CRTшным malloc/free/realloc..
G>>>Ты писал на C#? Х>>был период, когда жизнь заставляла использовать ету замазку для мозга, да. G>То есть не писал.
в С++ лямбд не существует, ага.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
G>>>>Что именно сделать быстро надо? Х>>>аллокации, ты что собственно мерил своим тестом? G>>И как их с помощью ансейфа сделать быстро? Х>Ну как, "мы наш, мы новый мир построим", HeapAlloc + ручное управление памятью, указатели, MyMemMgr.alloc() етц, только пользовать ето будет сложнее, смартпоинтеров то нет
Ты прикалываешься или реально тупость говоришь?
1)HeapAlloc работает медленнее, чем GC
2)Даже если выделишь память с помощью unmanaged, то ты не сможешь создать .NET объект в ней.
3)Ты не сможешь хранить ссылки на managed объекты в таком блоке памяти.
В итого это не будет ни быстрее, ни надежнее. Если ты серьезно считаешь что таким вообще стоит заниматься в каком либо случае, то тебе надо срочно обратиться к доктору.
Здравствуйте, Хвост, Вы писали:
Х>давай тезисами опишу проблемму Х>чтобы трансформировать на железе — нужно иметь псевдо-екранные координаты (ето ещё не проблемма) Х>для того чтобы работать со всей геометрией — нужно иметь её всю в псевдо-екранных координатах (тут проблемма — резко возросшее число геометрии для трансформации)
Что значит работать со всей геометрией? Счет или рендеринг? Для рендеринга не нужна вся геометрия. Пусть хранится как есть, в геодезии али еще чем-там. Х>если не всю — а только видимую, то необходимо постоянно пересчитывать в псевдо-екранные координаты геометрию, появляющуюся во вьюхе при скролле/зуме
Не пересчитывать, а досчитывать. Разве это проблема? А без промежуточных координат требуется именно пересчитвать экранные координаты всех объектов каждый раз. Либо кэшировать экранные координаты, которые придется обновлять при смене вида. Тут опять встает вопрос "набегания погрешности". X> (тут проблемма — какой тогда смысл в трансформациях на железе если нужно постоянно трансформировать в псевдо-екранные координаты новую видимую геометрию)
Смысл делать на железе тот, что железо это все равно делает, хочешь ты того или нет. Там преобразование в конвейере. Только в одном случае, когда ты софтом преобразуешь, железо делает единичное преобразование вхолостую (AFAIK).
Теперь рассмотрим два случая: первый — при прорисовке каждого примитива полностью рассчитывается преобразование из системы координат хранения (допустим геодезия) в экранные. Так?
Второй случай — когда расчитываются промежуточные координаты один раз, а дальше при каждой прорисовке из промежуточных в экранные с помощью железа. Таким образом софт подсчитывает только промежуточные координаты один раз когда объект попадает в вид и не считает координаты для этого объекта до тех пор, пока объект кэшируется.
Х>>>>да, можно, если учесть неточности железки и соответственно с этим написать алгоритм пролёта. S>>>Какие неточности железки? Пиксель туда-сюда? Х>ну вообще-то не пиксель, а поболе, заметно глазу.
Что-то сомневаюсь, что железо на столько дает погрешность.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>давай тезисами опишу проблемму Х>>чтобы трансформировать на железе — нужно иметь псевдо-екранные координаты (ето ещё не проблемма) Х>>для того чтобы работать со всей геометрией — нужно иметь её всю в псевдо-екранных координатах (тут проблемма — резко возросшее число геометрии для трансформации) S>Что значит работать со всей геометрией? Счет или рендеринг? Для рендеринга не нужна вся геометрия. Пусть хранится как есть, в геодезии али еще чем-там. Х>>если не всю — а только видимую, то необходимо постоянно пересчитывать в псевдо-екранные координаты геометрию, появляющуюся во вьюхе при скролле/зуме S>Не пересчитывать, а досчитывать. Разве это проблема? А без промежуточных координат требуется именно пересчитвать экранные координаты всех объектов каждый раз. Либо кэшировать экранные координаты, которые придется обновлять при смене вида. Тут опять встает вопрос "набегания погрешности".
ну что значит досчитывать? вот я смотрю на екран, вижу объекты, нажал на другое место на обзорной вьюхе — у меня совсем другие объекты на екране, их прийдётся пересчитывать в псевдо-екранные, а ведь можно сразу в екранные. Если активно скроллить — зумить, то объекты на екране сменяют друг друга почти так же быстро как и при клике на обзорной вьюхе, тут "досчитывать" придётся по пол-екрана на скролл-зум.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, samius, Вы писали:
S>>Да не, можно найти тысячу ситуаций (искувственных и натуральных), где разница в способе размещения замыкания будет заметна. Взять хотя бы тот же расчет координат в GIS-ах. Да, точно! В таких нагруженных случаях пользоваться лямбдой вообще неуместно, потому говорить о разнице между размещением замыкания лямбды на стеке и хипе как-бы неуместно. Боюсь что больше будет заметна разница лямбд на делегатах (в C#) и лямбд на виртуальных функциях (Nemerle и F#). Х>кстати вот лично у меня для трансформации используется функтор, который создаётся на стеке, но компиляторы С++ сейчас настолько умные что инлайнят всё и вся и оверхедов ноль, поетому в С++ я думаю лямбды в моём случае никак не повлияют на производительность.
Про инлайнить все и вся — заявление слишком сильное. Все равно там куча условий. Сомневаюсь, что инлайнится метод трансформации координат из геодезии в экранные. Но если скажешь, что точно инлайнится — поверю наслово.
Будет ли лямбда C++ так же эффективна как вручную заинлайненный код — тоже не уверен.
X>, а вот с C# вопрос не однозначен.
Но необходимость лямбды в таких узких местах контроллируется программистом как и выбор аллокатора в C++.
Здравствуйте, Хвост, Вы писали:
Х>ну что значит досчитывать? вот я смотрю на екран, вижу объекты, нажал на другое место на обзорной вьюхе — у меня совсем другие объекты на екране, их прийдётся пересчитывать в псевдо-екранные, а ведь можно сразу в екранные. Если активно скроллить — зумить, то объекты на екране сменяют друг друга почти так же быстро как и при клике на обзорной вьюхе, тут "досчитывать" придётся по пол-екрана на скролл-зум.
Одно дело считать каждый раз из геодезии в экранные. Другое — считать каждый раз из геодезии в недоэкранные (это меньше, чем в полностью экранные) а остальное сделает железо. Если активно зуммить, то большой шанс, что можно сделать реюз предрассчитанных псевдоэкранных координат просто изменением матрицы преобразования.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Хвост, Вы писали:
Х>>Здравствуйте, samius, Вы писали:
S>>>Да не, можно найти тысячу ситуаций (искувственных и натуральных), где разница в способе размещения замыкания будет заметна. Взять хотя бы тот же расчет координат в GIS-ах. Да, точно! В таких нагруженных случаях пользоваться лямбдой вообще неуместно, потому говорить о разнице между размещением замыкания лямбды на стеке и хипе как-бы неуместно. Боюсь что больше будет заметна разница лямбд на делегатах (в C#) и лямбд на виртуальных функциях (Nemerle и F#). Х>>кстати вот лично у меня для трансформации используется функтор, который создаётся на стеке, но компиляторы С++ сейчас настолько умные что инлайнят всё и вся и оверхедов ноль, поетому в С++ я думаю лямбды в моём случае никак не повлияют на производительность. S>Про инлайнить все и вся — заявление слишком сильное. Все равно там куча условий. Сомневаюсь, что инлайнится метод трансформации координат из геодезии в экранные. Но если скажешь, что точно инлайнится — поверю наслово.
не, не из геодезии, в памяти лежат данные в виде, похожем на твои "псевдо-екранные", точнее что-то вроде промежуточных между екранными и геодезией, которые быстро конвертятся как в екранные так и в геодезию, поетому функтор на самом деле маленький, строк 10-15, из них половина — собственно вычисления.
Здравствуйте, gandjustas, Вы писали:
G>Приведи парочку компиляторов С++ промышленного качества, в которых аллокация по кардинально другом алгоритму делается.
При чём тут компиляторы? Управление памятью — это библиотеки.
CC>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>Значит уже забыл. Пулы интересуют еще меньше, так как они требуют подгонки размеров блоков и пулов. G>Как аллокатор общего назначения использовать смысла нету.
Что за вздор?!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
В СССР книга вышла в 1990 г. 1986-й — это финское издание.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Тут надо подумать, быстро не отвечу. Преимущества, по идее, должны быть в меньшем количестве lock (неизбежен при подсчёте ссылок) и соответственно — в меньшем количестве сбросов кэша процессора. Ну и конечно — в решении проблемы с циклическими ссылками.
На практике GC в С++ оказываются куда менее эффективными чем даже подсчет ссылок. Преимущество только одно. Нет проблем с зацикливанием.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>Ну как, "мы наш, мы новый мир построим", HeapAlloc + ручное управление памятью, указатели, MyMemMgr.alloc() етц, только пользовать ето будет сложнее, смартпоинтеров то нет G>>Ты прикалываешься или реально тупость говоришь? G>>1)HeapAlloc работает медленнее, чем GC G>>2)Даже если выделишь память с помощью unmanaged, то ты не сможешь создать .NET объект в ней. G>>3)Ты не сможешь хранить ссылки на managed объекты в таком блоке памяти. Х>я разве где-то утверждал обратное? а то что будет нелегко (пункты 2, 3) так етож C#, он такой)
G>>В итого это не будет ни быстрее, ни надежнее. Если ты серьезно считаешь что таким вообще стоит заниматься в каком либо случае, то тебе надо срочно обратиться к доктору. Х>менежмент руками будет быстрее, надёжнее или нет
Сначала докажи это. В общем случае быстрее у тебя точно не выйдет. Можно в локальных случаях сделать пулы, но абсолютно тоже самое достуно и с GC.
Х>ето больше радиус кривизны рук решает.
Радиус кривизны рук определяет склонность к изобретению велосипедов.
Х>я считаю что таким действительно не стоит заниматься, C# для етого не предназначен, он высокоуровненвый и медленный, хочешь высокоуровневый и быстрый — бери С++.
Можешь конкретно показать чем он медленный?
Только ссылки на говнокод не надо.
Я показал что аллокатор в С++ медленно работает, покажи что-нить такое для C#
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>>см. Э. Ховёнен, Й. Сеппянен, c, М.: 1986
ГВ>В СССР книга вышла в 1990 г. 1986-й — это финское издание.
Короче, вот реальная история CL.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Лексические замыкания в CL появились из Схемы. И было это в 70-е.
Источник?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Эти фины описывали черти-что сбоку бантик.
Вот более полная цитата из приведённой тобой ссылки:
In April 1981, after a DARPA-sponsored meeting concerning the splintered Lisp community, Symbolics, the SPICE project, the NIL project, and the S-1 Lisp project joined together to define Common Lisp. Initially spearheaded by White and Gabriel, the driving force behind this grassroots effort was provided by Fahlman, Daniel Weinreb, David Moon, Steele, and Gabriel. Common Lisp was designed as a description of a family of languages. The primary influences on Common Lisp were Lisp Machine Lisp, MacLisp, NIL, S-1 Lisp, Spice Lisp, and Scheme. Common Lisp: The Language is a description of that design. Its semantics were intentionally underspecified in places where it was felt that a tight specification would overly constrain Common Lisp research and use.
In 1986 X3J13 was formed as a technical working group to produce a draft for an ANSI Common Lisp standard. Because of the acceptance of Common Lisp, the goals of this group differed from those of the original designers. These new goals included stricter standardization for portability, an object-oriented programming system, a condition system, iteration facilities, and a way to handle large character sets. To accommodate those goals, a new language specification, this document, was developed.
Как видишь, горячим финским парням было что описывать в 1986-м.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>То есть в 86-ом была только только сформирована группа по работе над CL. Учитывая, что на книгу нужно было потратить хотя бы пол года, я никак не могут понять что же описывали эти горячие финские парни, если в MIT и CMU только сели за составление стандарта.
Судя по всему, было уже какое-то устоявшееся соглашение. См. цитату, которую я привёл в сообщении рядом.
VD>А уж фраза: VD>
VD> Основой изложения нами выбран диалект Коммон Лисп, ставший "де-факто" промышленным стандартом языка Лисп. В книге представлены все важнейшие языковые формы и свойства конструкций Коммон Лиспа, а также типы функций и данных.
VD>вообще выглядит как издевка. Может это текст из предисловия на русском языке написанный в 1990-м?
Нет, это цитата из авторского введения.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
In April 1981, after a DARPA-sponsored meeting concerning the splintered Lisp community, Symbolics, the SPICE project, the NIL project, and the S-1 Lisp project joined together to define Common Lisp. Initially spearheaded by White and Gabriel, the driving force behind this grassroots effort was provided by Fahlman, Daniel Weinreb, David Moon, Steele, and Gabriel. Common Lisp was designed as a description of a family of languages. The primary influences on Common Lisp were Lisp Machine Lisp, MacLisp, NIL, S-1 Lisp, Spice Lisp, and Scheme. Common Lisp: The Language is a description of that design. Its semantics were intentionally underspecified in places where it was felt that a tight specification would overly constrain Common Lisp research and use.
ГВ>In 1986 X3J13 was formed as a technical working group to produce a draft for an ANSI Common Lisp standard. Because of the acceptance of Common Lisp, the goals of this group differed from those of the original designers. These new goals included stricter standardization for portability, an object-oriented programming system, a condition system, iteration facilities, and a way to handle large character sets. To accommodate those goals, a new language specification, this document, was developed.
ГВ>Как видишь, горячим финским парням было что описывать в 1986-м.
Как раз не вижу. Это все равно, что описывать С++ в 1979-ом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Источник?
Отбой. Нашёл, на что ты ссылался:
The major contributions of Scheme were lexical scoping, lexical closures, first-class continuations, and simplified syntax (no separation of value cells and function cells). Some of these contributions made a large impact on the design of Common Lisp.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Отбой. Нашёл, на что ты ссылался:
ГВ>
The major contributions of Scheme were lexical scoping, lexical closures, first-class continuations, and simplified syntax (no separation of value cells and function cells). Some of these contributions made a large impact on the design of Common Lisp.
В общем, бессмысленный исторический экскурс.
Даже если какие-то там фины умудрились написать книжку про промежуточную версию CL в которой и правда замыкания не были реализованы до конца — это никак не говорит в пользу того, что это правильный подход.
Сейчас ты не найдешь ни одной реализации CL где были бы неполноценные замыкания. Решение принятое в С++ (точнее пока не принятое) как раз свидетельствует о курсе его авторов — плевать на концептуальную целостность и удобство, если это может повредить скорости. Лучше все будет работать с тучей оговорок и вызовет тучу проблем у программистов, но не будет влиять на производительность.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
ГВ>>Как видишь, горячим финским парням было что описывать в 1986-м. VD>Как раз не вижу. Это все равно, что описывать С++ в 1979-ом.
Бедняга Страуструп, он и не знает, что ARM в первом издании (тоже 1986, как и Мир Лиспа) описывала несуществующий язык.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Lloyd, Вы писали:
ГВ>>Может быть. Языков без спецификаций не бывает. L>Из чего с необходимостью следует, что Nemerle не язык.
У Nemerle есть ещё один недостаток, не позволяющий считать его языком — полное отсутствие стандарта ANSI.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Как видишь, горячим финским парням было что описывать в 1986-м. VD>>Как раз не вижу. Это все равно, что описывать С++ в 1979-ом. ГВ>Бедняга Страуструп, он и не знает, что ARM в первом издании (тоже 1986, как и Мир Лиспа) описывала несуществующий язык.
Ой, опять я поторопился: ARM вышла в 90-м (всё равно — до появления C++ ).
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, VladD2, Вы писали:
VD>Даже если какие-то там фины умудрились написать книжку [...]
Я решил немного покопаться на предмет персоналий авторов. Нашлась страничка, посвящённая Эро Хювенену, там есть библиография. С Юко Сеппяненом вышло сложнее — мелькает на разных симпозиумах по искусственному интеллекту, да кое-что в ACM (искать по автору Jouko J. Seppänen, считанные публикации за 1970-1982 г). Оба, как я понял, из Технологического университета Хельсинки.
Ну разве это серьёзные лисперы? Да это ж курам на смех! Мальчонки, погулять вышли.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Х>>>какие оверхеды? концепция с++: не плати за то что не используешь, G>>Да ну, а O(n) при выделении и освобождении памяти? Х>здесь поподробней пожалуйста, что имеется ввиду?
Подробнее — в Красной Книжке приснопамятного Александреску, глава 4. И в Зелёной Книжке Рихтера, глава 20.
Здравствуйте, gandjustas, Вы писали:
CC>>>>Ну так какого ты ляда утверждаешь что "Стандартные аллокаторы в С++ требуют прохода блаблабла"? G>>>Еще раз: все известные мне реализации так работают. CC>>Мы о С++ либо об известных тебе реализациях? G>Думаешь я мало компиляторов видел?
Ты с темы не съезжай.
G>>>Твой наколенный непотокобезопасен. CC>>Можно узнать с какого перепугу ты так решил? CC>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>Значит уже забыл. Пулы интересуют еще меньше, так как они требуют подгонки размеров блоков и пулов.
Ясно. Как работают пулы ты тоже не в курсе.
Известно ли тебе что HeapAlloc в LFH режиме тоже на пулах?
G>Как аллокатор общего назначения использовать смысла нету.
Расскажи это разработчикам Hoard, TBB и того же Windows Heap
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
CC>>Там Per-thread pool с lock-free deferred алгоритмом на случай освобождения памяти из не-родного-потока. G>Кстати с явным Free тоже бльшая попа. Все это придется оборачивать в очередные умные указатели чтобы не было утечек.
А вот ты никак не можешь прожить без того, чтоб за тобой кто нить не прибирал твои выделения.
Никакой попы там нет. Работает простой жизненный принцип: убирай за собой. Это нормально.
G>Заметь что код на C#, такой как в тесте, не требует никаких усилий чтобы работать быстро. Чтобы работал быстро аналогичный код на С++ требуется немало усилий.
Каких усилий?
Все потери на твоем С++ тесте исключительно в системной функции HeapAlloc.
Это многопоточный аллокатор общего назначения. Синхронизация в нем через критическую секцию, что медленно.
Пул в моем аллокаторе постольку поскольку, меня больше интересовало насколько будет быстрее если убрать тормоза критической секции.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>1)HeapAlloc работает медленнее, чем GC
HeapAlloc это Windows Heap а не С++
С++ CRT от MS использует HeapAlloc. Полагаю, так им было проще: раньше то они свой аллокатор пытались писать.
С# runtime от MS использует свой GC.
Вы, господа, сравниваете два решения от МС.
По своей сути С++ позволяет реализовать какой угодно аллокатор.
Сравнение в таком случае С++ аллокатора (который может быть вообще любым) с конкретной реализацией GC не имеет смысла по определению.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>>>Думаешь я мало компиляторов видел? CC>>Ты с темы не съезжай. G>Это ты не съезжай. Кивать на стандарт в случае С++ не стоит. Его мало кто реализует.
Паня-атна.
CC>>Ясно. Как работают пулы ты тоже не в курсе. CC>>Известно ли тебе что HeapAlloc в LFH режиме тоже на пулах? G>Еще раз: меня это вообще не интересует.
Аха.
G>>>Как аллокатор общего назначения использовать смысла нету. CC>>Расскажи это разработчикам Hoard, TBB и того же Windows Heap G>А это тут причем? Ты будешь на задумываясь использовать свой аллокатор в продакш коде?
А почему нет? Я его интереса ради стресс тестами гонял в многопоточном режиме на 4хядернике.
G>Кстати, получилось что GC порвал в 5 раз виндовый аллокатор, который на пулах, так?
Ох блин. Как же трудно иногда объяснять элементарные вещи человеку с синдромом бакалавра.
В HeapAlloc самые большие тормоза дает Critical Section.
HeapAlloc имеет режим под названием Low fragmentation heap. Реализован на пулах и дает прирост скорости аллокации в некоторых случаях (у меня был ~2х для std::map. Отдельного тестирования не проводил, так что за вообще все случаи говорить не буду). По умолчанию выключен.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Не смеши. Если это нормально, то почему сейчас такое засилие "умных указателей"? Как раз для того чтобы програамист не думал что и когда ему надо убирать.
Засилье? Где?
Я его в С++ проектах не наблюдаю.
У нас они в основном там, где проект был портирован на С++ с managed языков, чтоб не надо было сильно много переделывать.
G>Ты до сих пор не понял что создание таких аллокаторов — нетривиальная задача. Далеко не каждый программист сможет справиться.
Не можешь написать свой — пользуй готовые. Тот же Hoard например. Если реально надо.
G> В тоже время GC работает достаточно быстро, а программисту при этом даже не требуется заботиться об освобождении памяти.
Для некоторых случаев GC-памперс, который "даже не требуется заботиться об освобождении" может стать проблемой.
Особенно если программист недостаточной квалификации.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
G>> В тоже время GC работает достаточно быстро, а программисту при этом даже не требуется заботиться об освобождении памяти. CC>Для некоторых случаев GC-памперс, который "даже не требуется заботиться об освобождении" может стать проблемой. CC>Особенно если программист недостаточной квалификации.
Если программист недостаточной квалификации, то само использование unmanaged становится большой проблемой (видел такое на Delphi), не говоря уже о С++ с его примудростями.
Здравствуйте, CreatorCray, Вы писали:
G>>>>Как аллокатор общего назначения использовать смысла нету. CC>>>Расскажи это разработчикам Hoard, TBB и того же Windows Heap G>>А это тут причем? Ты будешь на задумываясь использовать свой аллокатор в продакш коде? CC>А почему нет? Я его интереса ради стресс тестами гонял в многопоточном режиме на 4хядернике.
Ну и что?
Я "ради интереса" и GC писал на C++, но в реальном проекте не стал бы его использовать.
G>>Кстати, получилось что GC порвал в 5 раз виндовый аллокатор, который на пулах, так? CC>Ох блин. Как же трудно иногда объяснять элементарные вещи человеку с синдромом бакалавра. CC>В HeapAlloc самые большие тормоза дает Critical Section.
Да ты че?
Конечно критическая секция дает тормоза. Кто сказал что параллельность бесплатно дается?
Здравствуйте, gandjustas, Вы писали:
G>Если программист недостаточной квалификации, то само использование unmanaged становится большой проблемой (видел такое на Delphi), не говоря уже о С++ с его примудростями.
Managed от идиотов все равно не спасает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
CC>>А почему нет? Я его интереса ради стресс тестами гонял в многопоточном режиме на 4хядернике. G>Я "ради интереса" и GC писал на C++, но в реальном проекте не стал бы его использовать.
Ну, если получилось что то хорошее, работоспособное и способное принести пользу проекту то почему бы и не использовать?
G>>>Кстати, получилось что GC порвал в 5 раз виндовый аллокатор, который на пулах, так? CC>>Ох блин. Как же трудно иногда объяснять элементарные вещи человеку с синдромом бакалавра. CC>>В HeapAlloc самые большие тормоза дает Critical Section. G>Конечно критическая секция дает тормоза. Кто сказал что параллельность бесплатно дается?
Она не бесплатная, да. Но она вообще то обеспечивается дешевле, чем тупо натыкать critical section.
Тебе знаком термин lock-free? А per-thread аллокация?
Есть еще тут мега-чел Remark, он тебе много может рассказать.
У меня в ThreadPoolAlloc вообще получается что нет никакой необходимости в синхронизации, пока не начнешь освобождать данные, выделенные в другом потоке. Да и то вся синхронизация будет заключаться в lock-free добавлении освобождаемой памяти в deferred очередь, которую освободит родной поток.
Ну и плюс всякие мелочи типа разруливание ситуаций когда поток память навыделял и завершился, а освобождать ее будет кто то другой.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
CC>>>А почему нет? Я его интереса ради стресс тестами гонял в многопоточном режиме на 4хядернике. G>>Я "ради интереса" и GC писал на C++, но в реальном проекте не стал бы его использовать. CC>Ну, если получилось что то хорошее, работоспособное и способное принести пользу проекту то почему бы и не использовать?
Во-первых я тогда не работал на С++
Во-вторых не получилось ничего работоспособного, грубо говоря работало в некоторых случаях.
G>>>>Кстати, получилось что GC порвал в 5 раз виндовый аллокатор, который на пулах, так? CC>>>Ох блин. Как же трудно иногда объяснять элементарные вещи человеку с синдромом бакалавра. CC>>>В HeapAlloc самые большие тормоза дает Critical Section. G>>Конечно критическая секция дает тормоза. Кто сказал что параллельность бесплатно дается? CC>Она не бесплатная, да. Но она вообще то обеспечивается дешевле, чем тупо натыкать critical section.
Не всегда. При работе со списком свободных блоков например, без критической секции вряд ли что-то получится.
CC>Тебе знаком термин lock-free? А per-thread аллокация?
Конечно ускорения надо разделять данные между потоками и\или использовать атомные операции.
Первое сложнее в реализации и таит подводные камни, второе далеко не всегда доступно (в C++ например не доступно при выделении памяти).
CC>Есть еще тут мега-чел Remark, он тебе много может рассказать.
Я его уже перечитал.
CC>У меня в ThreadPoolAlloc вообще получается что нет никакой необходимости в синхронизации, пока не начнешь освобождать данные, выделенные в другом потоке. Да и то вся синхронизация будет заключаться в lock-free добавлении освобождаемой памяти в deferred очередь, которую освободит родной поток. CC>Ну и плюс всякие мелочи типа разруливание ситуаций когда поток память навыделял и завершился, а освобождать ее будет кто то другой.
Ну это и есть подоводные камни.
Кроме того deferred очередь ужасно будет работать при использовании пула потоков.
Здравствуйте, gandjustas, Вы писали:
G>>>Конечно критическая секция дает тормоза. Кто сказал что параллельность бесплатно дается? CC>>Она не бесплатная, да. Но она вообще то обеспечивается дешевле, чем тупо натыкать critical section. G>Не всегда. При работе со списком свободных блоков например, без критической секции вряд ли что-то получится.
Ну, если его реализовывать как ты его описываешь, с проходом O(n) по нему то да.
G>надо разделять данные между потоками и\или использовать атомные операции. G>второе далеко не всегда доступно (в C++ например не доступно при выделении памяти).
Ты про что вообще?
CC>>Есть еще тут мега-чел Remark, он тебе много может рассказать. G>Я его уже перечитал.
Осталось понять те идеи о которых он пишет.
G>Кроме того deferred очередь ужасно будет работать при использовании пула потоков.
Почему?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
G>>надо разделять данные между потоками и\или использовать атомные операции. G>>второе далеко не всегда доступно (в C++ например не доступно при выделении памяти). CC>Ты про что вообще?
В .NET насколько я понимаю выделение памяти реализовано как interlocked add указателя.
G>>Кроме того deferred очередь ужасно будет работать при использовании пула потоков. CC>Почему?
Если память выделяется в одном потоке, а освобождается в другом, то реальное освобождение может произойти очень нескоро, а прогнозировать такое развите событий с пулом потоков сложно.
CC>По своей сути С++ позволяет реализовать какой угодно аллокатор. CC>Сравнение в таком случае С++ аллокатора (который может быть вообще любым) с конкретной реализацией GC не имеет смысла по определению.
Как на C++ реализуется перемещающий менеджер памяти? Скажем, как подменить глобальные new и delete своим менеджером памяти, чтобы он мог по запросу проводить дефрагментацию своего пула?
Если есть поддержка языка и среды, то всё понятно, мы просто копируем объекты в памяти (их размеры и положение заведомо известны). Причём если на них есть ссылки, то мы эти ссылки перезаписываем, так как у CLR есть информация о том, что является ссылкой, а что нет.
Здравствуйте, Qbit86, Вы писали:
CC>>По своей сути С++ позволяет реализовать какой угодно аллокатор. CC>>Сравнение в таком случае С++ аллокатора (который может быть вообще любым) с конкретной реализацией GC не имеет смысла по определению.
Q>Как на C++ реализуется перемещающий менеджер памяти?
Можно.
Но с заменой указателей на обёртки и вводом ограничений на использование сырых указателей.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, CreatorCray, Вы писали:
G>>>надо разделять данные между потоками и\или использовать атомные операции. G>>>второе далеко не всегда доступно (в C++ например не доступно при выделении памяти). CC>>Ты про что вообще? G>В .NET насколько я понимаю выделение памяти реализовано как interlocked add указателя.
Понятнее не стало.
Что именно ты имел в виду под "второе далеко не всегда доступно (в C++ например не доступно при выделении памяти)."?
Аллокацию в С++ через инкремент указателя сделать можно. Вот только с деаллокацией придется погеморроиться.
Не надо тупо копировать решения их других платформ с их особенностями.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>В .NET насколько я понимаю выделение памяти реализовано как interlocked add указателя.
Насколько я понимаю, interlocked add работает только для одноядерной машины. И то я не уверен... Тут надо курить семантику освобождения. На многоядерной машине и intelocked не нужен. Просто add. Ну и проверка на достижение границы 256Kb куска.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Qbit86, Вы писали:
CC>>>По своей сути С++ позволяет реализовать какой угодно аллокатор. CC>>>Сравнение в таком случае С++ аллокатора (который может быть вообще любым) с конкретной реализацией GC не имеет смысла по определению.
Q>>Как на C++ реализуется перемещающий менеджер памяти? CC>Можно. CC>Но с заменой указателей на обёртки и вводом ограничений на использование сырых указателей.
Здравствуйте, Qbit86, Вы писали:
Q>>>Как на C++ реализуется перемещающий менеджер памяти? CC>>Можно. Но с заменой указателей на обёртки... Q>Я правильно понимаю, что:
По большей части правильно, хотя кое что implementation specific.
Неправильно только одно: зачем на С++ реализовывать такой аллокатор?
Пользы от него будет меньше чем неудобств.
Более того, зачем его реализовывать как глобальный?
К примеру стоит прикручивать нечто подобное только для алгоритмов, у которых фрагментация памяти является побочным эффектом.
Еще раз говорю: не надо тупо копировать идеи и подходы из других платформ.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, samius, Вы писали:
CC>>Всё совсем наоборот. S> S>Ну тогда уж просвети, кому нужно наоборот, если S>
В многопроцессорной системе поколение 0 управляемой кучи разделено на несколько арен памяти — по одной на каждый поток. (С) Рихтер. CLR via C#
S>Нафига там interlocked?
S>Ох блин, знатоки-теоретики
Ага.
Вот и расскажи мне, знаток-теоретик, какой нафиг интерлокед может быть в таком случае на однояйцевой машине, когда одновременно выполняется только 1 поток.
С чем оно интерлокит то?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали: G>>Читать больше надо. От константности отказались как раз в силу сложности обеспечения честной константности. Х>а теперь расскажи мне, в чём сложность обеспечения четной константности, если даже C++ ето отлавливает на етапе компиляции? если в с++ запретить касты, разрушающие константность то окромя прямой работы с памятью возможностей изменить константный объект нет, почему же весь такой сейфанутый C# не одолел модификатор const?
Также компании Microsoft очень сложно предусмотреть в CLR возможность проверки неизменности констант-объектов или констант-параметров. CLR пришлось бы при каждой операции записи проверять, не выполняется ли запись в объект-константу, а это сильно снизит эффективность работы программы. Есте ственно, что обнаружение нарушения должно приводить к генерации исключения. Более того, поддержка констант создает дополнительные сложности для разработчиков. В частности, при наследовании неизменяемого типа, производные типы должны соблюдать это ограничение. Кроме того, неизменяемый тип, скорее всего, должен состоять из полей, которые тоже представляют собой неизменяемые типы.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, samius, Вы писали:
S>>Ох блин, знатоки-теоретики CC>Ага. CC>Вот и расскажи мне, знаток-теоретик, какой нафиг интерлокед может быть в таком случае на однояйцевой машине, когда одновременно выполняется только 1 поток. CC>С чем оно интерлокит то?
Я ж написал, что не уверен в случае одноядерной машины. Но что в многоядерной его точно нет. А ты сказал, что все наоборот. Вот и рассказывай нафига интерлокед на многоядерной машине.
Здравствуйте, samius, Вы писали:
S>Я ж написал, что не уверен в случае одноядерной машины. Но что в многоядерной его точно нет. А ты сказал, что все наоборот. Вот и рассказывай нафига интерлокед на многоядерной машине.
Да потому, что интерлокед как таковой только для многоядерной и нужен.
Безотносительно к принципам организации менеджера памяти в .NET
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, Qbit86, Вы писали:
CC>>>По своей сути С++ позволяет реализовать какой угодно аллокатор. CC>>>Сравнение в таком случае С++ аллокатора (который может быть вообще любым) с конкретной реализацией GC не имеет смысла по определению.
Q>>Как на C++ реализуется перемещающий менеджер памяти? CC>Можно. CC>Но с заменой указателей на обёртки и вводом ограничений на использование сырых указателей.
Правильно, надо написать CLR или JRE, они ведь на C++.
Только еще придется переписать код стандартной библиотеки, чтобы она работала с новым менеджером памяи и новыми примитавами.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, CreatorCray, Вы писали:
G>>>>надо разделять данные между потоками и\или использовать атомные операции. G>>>>второе далеко не всегда доступно (в C++ например не доступно при выделении памяти). CC>>>Ты про что вообще? G>>В .NET насколько я понимаю выделение памяти реализовано как interlocked add указателя. CC>Понятнее не стало. CC>Что именно ты имел в виду под "второе далеко не всегда доступно (в C++ например не доступно при выделении памяти)."? CC>Аллокацию в С++ через инкремент указателя сделать можно. Вот только с деаллокацией придется погеморроиться.
Не просто погеморроиться, а сильно погеморроиться.
CC>Не надо тупо копировать решения их других платформ с их особенностями.
А никто их копировать не собирается.
Здравствуйте, Qbit86, Вы писали:
CC>>Неправильно только одно: зачем на С++ реализовывать такой аллокатор? Q>Речь шла не об «зачем», а об «какой угодно» и «вообще любой».
Ну так не надо передирать идею. Есть проблема — надо придумать решение.
Готовое решение с другой платформы передирать глупо — платформы слишком разные.
Вот я про что: что делать на С++ точно такой же по алгоритму аллокатор как в .NET просто глупо.
CC>>Неправильно только одно: зачем на С++ реализовывать такой аллокатор? Q>Чтобы ускорить аллокацию. В такой модели менеджер будет катастрофически быстро выделять память всегда в конце пула, а не искать в цепочках чанков дыры подходящего размера от освобождённых ранее объектов.
Странный подход. Есть алгоритмы аллокации которым не надо ничего искать.
Надо использовать их, а не тупо пытаться адаптировать технологию с другой платформы.
CC>>Еще раз говорю: не надо тупо копировать идеи и подходы из других платформ. Q>...в платформы, крайне плохо для того предназначенные.
Ты хочешь скопировать готовое решение проблемы, реализованное под конкретную платформу.
А надо разработать алгоритм, который на данной платформе будет решать такую же проблему.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Правильно, надо написать CLR или JRE, они ведь на C++. G>Только еще придется переписать код стандартной библиотеки, чтобы она работала с новым менеджером памяи и новыми примитавами.
Ну это ж вам до зубовного скрежета хочется именно глобальный перемещающий менеджер.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, VladD2, Вы писали:
VD>И вообще, твои слова банальная демонстрация некомпетентности. Лисп изначально имел сборщик мусора и стало быть делать урезанные в нем не имело никакого смысла.
При чем тут "урезание"? До сих пор в разных реализациях Лиспа и даже интерпретаторов Схемы используются разные подходы к "механике" замыканий, от этого и есть основная несовместимость на уровне исходников.
Здравствуйте, vdimas, Вы писали:
V>При чем тут "урезание"? До сих пор в разных реализациях Лиспа и даже интерпретаторов Схемы используются разные подходы к "механике" замыканий, от этого и есть основная несовместимость на уровне исходников.
Для CL все прописано в стандарте. Схема же язык практически чисто функциональный, для нее данный аспект не важен.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, vdimas, Вы писали:
V>>При чем тут "урезание"? До сих пор в разных реализациях Лиспа и даже интерпретаторов Схемы используются разные подходы к "механике" замыканий, от этого и есть основная несовместимость на уровне исходников.
VD>Для CL все прописано в стандарте. Схема же язык практически чисто функциональный, для нее данный аспект не важен.
На CL мир клином не сошелся, например нет его реализаций под управляемые платформы типа Java или .Net. Далее, в различных реализациях Схемы есть возможность изменять значения переменных, поэтому способ реализации замыканий играет роль (сейчас в ходу сразу три стандарта Схемы, с 4-го по 6-й). В общем, тут спорить не о чем, я когда-то изучил десятки исходников лисп и схем, и обнаружил, что способов реализации как замыканий, так и контекста исполнения (разновидность "замыкания" текущего потока) множество.
Бардак, согласись, но если в Схеме хоть идет все более глубокое стандартизирование, не привязанное к конкретной реализации, то Лисп страшно далек от подобного. Собственно, CL своими библиотеками и расширениями оказал плохую службу этому направлению, продлив жизнь своего диалекта Лиспа. Посмотрев чуть выше, нет никаких причин использовать Лисп при наличии Схемы, тем более, что после 6-го стандарта ожидается приличная пауза м/у их выходами, т.е. будет достаточно времени для "вымывания" из обращения предыдущих двух.
Здравствуйте, vdimas, Вы писали:
V>На CL мир клином не сошелся, например нет его реализаций под управляемые платформы типа Java или .Net. Далее, в различных реализациях Схемы есть возможность изменять значения переменных, поэтому способ реализации замыканий играет роль (сейчас в ходу сразу три стандарта Схемы, с 4-го по 6-й). В общем, тут спорить не о чем, я когда-то изучил десятки исходников лисп и схем, и обнаружил, что способов реализации как замыканий, так и контекста исполнения (разновидность "замыкания" текущего потока) множество.
Спорить с тем, что есть можество разных реализаций языка которому 50 лет я не буду. К не буду спорить о том, что если в языке есть императивное присвоение и замыкания, то полноценным замыканием будет только то, что позволяет изменять захваченые переменные из замыкания.
V>Бардак, согласись, но если в Схеме хоть идет все более глубокое стандартизирование, не привязанное к конкретной реализации, то Лисп страшно далек от подобного. Собственно, CL своими библиотеками и расширениями оказал плохую службу этому направлению, продлив жизнь своего диалекта Лиспа. Посмотрев чуть выше, нет никаких причин использовать Лисп при наличии Схемы, тем более, что после 6-го стандарта ожидается приличная пауза м/у их выходами, т.е. будет достаточно времени для "вымывания" из обращения предыдущих двух.
Интересное мнение, но к делу не относящееся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>При наличии возможностей изменять значения переменных byvalue и есть "единственно-правильный" вид замыканий.
Мне тоже кажется, что, во всяком случае, "от рождения" замыкания должны были быть именно такими. Потом просто обобщили подход на разные способы использования.
V>А вообще, там приемов несколько — например есть реализации лиспов/схем, где после присвоения нового значения переменной создается новая одноименная переменная, которой оперирует текущий контекст исполнения, т.е. даже используя механизм byname как более "легковесный", получается поведения как при byvalue.
Интересно, хотя я такой именно реализации, кажется, не встречал. Наверное, смотрел плохо.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
NBN>>>Я когда пишу на С++ — просто выделяю память, и не занимаюсь её освобожденим — пока в этом нет необходимости.
C>А необходимость возникает только тогда, когда продакшн билд начинает течь, как дырявое решето?
Здравствуйте, vdimas, Вы писали:
C>>Вы вообще понимаете о чем говорите? Что такое модульное тестирование? Что значит "тестировать код, а не сборки"? Это, простите, бред. C>>Модульное тестирование подразумевает: а) тестирование состояния объектов, б) тестирование операбельности объектов. Препроцессингом ничто из перечисленного протестировать не возможно.
V>Похоже, ты не понял основной посыл насчет тестирования исходников в С++ в противовес тому, что и как тестируется с помощью моков.
Не понял. Что Вы тестируете? Исходники? На орфорграфию, чтоли?
V>>>что в свою очередь легко делается через инклюды и прочий развитый препроцессинг. В общем, подход к юнит-тестированию совсем другой и нет смысла тратить время на неприменимый и безбенифитный (для С++) способ юнит тестирования, предназначенный для совсем других условий.
C>>Почему он вдруг стал безбенефитным? Чем С++ такой особенный?
V>Моковский подход и не был для С++ никогда бенефитным. Вложения труда не окупятся, поэтому там немного по-другому.
Э-э, Вы серьезно верите в эту чушь (менее громкого слова придумать не могу...)?
Ну хорошо, расскажите тогда что в С++ "немного по другому", что программам на С++ нет пользы от автоматического тестирования. Внимательно Вас слушаю.
C>>Модульное тестирование программ на С++ как минимум не менее полезное, чем модульное тестирование программ на С#, Java, Python, и т.д.
V>А это ты кому и о чем? Просто лозунги?
Какие еще лозунги?
ГВ>>>>>С другой стороны, в самом по себе паттерне IoC ничего запредельного нет, мне сейчас любопытно поиграться в тех ограничениях, которые ты предложил. C>>>>Запредельное? Патерн IoC в управляемых языках реализуется на базовом уровне за минут 40-50 максимум неопытными студентами.
V>>>Рефлексия она и в африке рефлексия. Развитый подобный фреймворк под нейтив — это разве что COM и пляски вокруг typelib-ов и prog ID. C>>А COM тут при чем вообще?
V>При том, что популярные IoC контейнеры для .Net до компиляции в глаза не видели оперируемые интерфейсы и конструкторы реализующих их классов. Такие шутки делаются лишь через метаинформацию, пример которой для нейтива есть typelib из COM, так же как и ср-ва для построения проксей для OLE-совместимых сигнатур.
Да будет Вам известно, что IoC оперирует не только интерфейсами, но и классами.
COM это совсем другое и к чему Вы его упомянули мне по прежнему не ясно.
V>>>ActiveX site — как раз своего рода "конфигурируемый" в рантайм IoC-контейнер, правда в ограниченном множестве интерфейсов. C>>Я очень надеюсь, что Вы пошутили...
V>Не надейся.
Н-да. Ну ладно, поспотрим что Вы еще напишите. Это становится забавно.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, vdimas, Вы писали:
C>>>Вы вообще понимаете о чем говорите? Что такое модульное тестирование? Что значит "тестировать код, а не сборки"? Это, простите, бред. C>>>Модульное тестирование подразумевает: а) тестирование состояния объектов, б) тестирование операбельности объектов. Препроцессингом ничто из перечисленного протестировать не возможно.
V>>Похоже, ты не понял основной посыл насчет тестирования исходников в С++ в противовес тому, что и как тестируется с помощью моков. C>Не понял. Что Вы тестируете? Исходники? На орфорграфию, чтоли?
Имеется ввиду что для тестирования в C++ применяется не такой подход, как в языках с метаданными.
Обычно применяется создание отдельный программных модулей, которые инклюдят файлы с тестируемым кодом, подсовывают им тестовые данные и делают необходимые проверки.
V>>При том, что популярные IoC контейнеры для .Net до компиляции в глаза не видели оперируемые интерфейсы и конструкторы реализующих их классов. Такие шутки делаются лишь через метаинформацию, пример которой для нейтива есть typelib из COM, так же как и ср-ва для построения проксей для OLE-совместимых сигнатур.
C>Да будет Вам известно, что IoC оперирует не только интерфейсами, но и классами. C>COM это совсем другое и к чему Вы его упомянули мне по прежнему не ясно.
COM использует метаинформацию, аналогично .NET в плане концепции. Например я где-то видел как раз тестовый фреймворк для native с помощью com. И test-runner был, похожий на NUnit.
V>>>>ActiveX site — как раз своего рода "конфигурируемый" в рантайм IoC-контейнер, правда в ограниченном множестве интерфейсов. C>>>Я очень надеюсь, что Вы пошутили... V>>Не надейся. C>Н-да. Ну ладно, поспотрим что Вы еще напишите. Это становится забавно.
Насчет IoC-контейнера явно пошутил, нету в COM возможности декларативно описывать зависимости классов.
Зато как Service Locator COM и так отлично работает.
Здравствуйте, Pepel, Вы писали:
P>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
V> N>Может легче сначала пойти на С#, а потом перейти на С++ или сразу искать вакансии С++
V> То, что делается на C++, на C# в принципе нельзя реализовать.
Здравствуйте, Pepel, Вы писали:
P>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
Вы все правильно написали, но с точностью до наоборот.
NBN> NBN>> Языки то да. А костыли для шарпа не везде есть и не везде подходят. NBN> NBN>> См. те же игры, ембеддед/мобилы/покеты и кроссплатформенное программрование.
NBN> M>Во всем этом есть .NET и, следовательно, C#.
NBN> Гы.гы.гы. Либо не везде, либо реальное использование сопровождается множеством оговорок NBN> Как следствие — С++ монополист и надолго им останется.
Мы говорим про монополию или про утверждение
То, что делается на C++, на C# в принципе нельзя реализовать.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, criosray, Вы писали:
C>>Откройте для себя .NET CF и Mono.
NBN>И то и другое неполный отстой, даже близко не являющимся решением реальных проблем.
Понятно... еще один неграмотный тролль. Вы даже сформулировать не сможете в чем заключается неполнота.
NBN>С++ тут монополист, это факт. Твои минусы это не испраят
Да-да, именно по тому у меня из 10 приложений на мобилке почти половина на .NET CF.
Здравствуйте, vdimas, Вы писали:
V>Таким образом, в подавляющем большинстве случаев на С++ в юнит-тестах тестируется по-сути исходный код, скомпиллированный в тестовый бинарник с некими тестовыми эмуляторами и прочей хернью. Учитывая, что в С++ имеется помимо полиморфизма на виртуальных ф-иях еще и "шаблонный полиморфизм", то скомпиллированный тестовый бинарный вариант некоего класса может иметь вообще мало общего с им же в целевой сборке.
Параметрический полиморфизм?
Ну этим же можно пользоваться в C#. Т.е. я пишу обобщенный алгоритм (допустим поиск в графе), отлаживаю его на графе с вершинами типа int или string, потом применяю к другим сущностям.
Здравствуйте, NikeByNike, Вы писали:
NBN>>>В принципе тоже — например: быстрое, кроссплатформенное и полнофункциональное приложение на C#.
C>>Mono
NBN>Ни один из пунктов не решает.
Здравствуйте, NikeByNike, Вы писали:
NBN>>>И то и другое неполный отстой, даже близко не являющимся решением реальных проблем.
C>>Понятно... еще один неграмотный тролль. Вы даже сформулировать не сможете в чем заключается неполнота.
NBN>Ты со своей религией продолжай минусики расставлять, авось полегчает
NBN>>>С++ тут монополист, это факт. Твои минусы это не испраят
C>>Да-да, именно по тому у меня из 10 приложений на мобилке почти половина на .NET CF.
NBN>Ага, из тех что написали китайцы из ОЕМов?
Значит по сути Вам больше сказать нечего (впрочем, по сути от Вас ничего и не было услышано).
Здравствуйте, criosray, Вы писали:
NBN>>С++ тут монополист, это факт. Твои минусы это не испраят C>Да-да, именно по тому у меня из 10 приложений на мобилке почти половина на .NET CF.
"Почти" — это сколько именно? 4, 6, 8?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Геннадий Васильев, Вы писали:
V>>>Вопрос стоит вовсе не так, и я дважды пытался поправить постановку вопроса. Видя твою невнимательность, мне крайне неохота что-либо объяснять, ибо опять может уйти в космос... Тем не менее, для истории: C>>Ну вот и хорошо. Значит польза все-таки есть. Хорошо, что Вы это осознали. Ну а то, что способы тестирования различаются в виду убогости С++ и native кода — это и так понятно было.
ГВ>Мда... С такими апологетами .Net в противниках не нуждается...
А с чем не согласны? Там где, в дотнет тратишь минуту на написание теста в пять строк кода, на С++ надо городить огород с "инклюдами в специальных библиотеках", что займет уж явно ни один час.
Практика показывает, что если на написание теста времени уходит больше, чем на написание кода, то тест написан не будет. Что мы, собственно, и наблюдаем в случае С++ проектов — убогость на лицо.
Здравствуйте, criosray, Вы писали:
NBN>>Ни один из пунктов не решает.
C>Кто сказал?
Я сказал. Тормозной, забагованный, сложный в инсталляции продукт, имеющий проблемы с фишками разных платформ и принципиально не существующий на некоторых из них — это не наш путь
Здравствуйте, criosray, Вы писали:
C>Значит по сути Вам больше сказать нечего (впрочем, по сути от Вас ничего и не было услышано).
По сути — в топах продаж шарповых продуктов нет. В перечисленных мною нишах шарп нежизнеспособен, а я перечислил только интересные мне нишы, есть и другие.
C>Ок. Разговор закончен.
Здравствуйте, Геннадий Васильев, Вы писали:
NBN>>>С++ тут монополист, это факт. Твои минусы это не испраят C>>Да-да, именно по тому у меня из 10 приложений на мобилке почти половина на .NET CF.
ГВ>"Почти" — это сколько именно? 4, 6, 8?
Здравствуйте, NikeByNike, Вы писали:
C>>Значит по сути Вам больше сказать нечего (впрочем, по сути от Вас ничего и не было услышано).
NBN>По сути — в топах продаж шарповых продуктов нет. В перечисленных мною нишах шарп нежизнеспособен, а я перечислил только интересные мне нишы, есть и другие.
"Нижнеспособен", но живет и набирает популярность семимильными шагами.
Здравствуйте, criosray, Вы писали:
V>>>>Вопрос стоит вовсе не так, и я дважды пытался поправить постановку вопроса. Видя твою невнимательность, мне крайне неохота что-либо объяснять, ибо опять может уйти в космос... Тем не менее, для истории: C>>>Ну вот и хорошо. Значит польза все-таки есть. Хорошо, что Вы это осознали. Ну а то, что способы тестирования различаются в виду убогости С++ и native кода — это и так понятно было.
ГВ>>Мда... С такими апологетами .Net в противниках не нуждается...
C>А с чем не согласны?
А тут нельзя согласиться или не согласиться. Ты сам придумал и сам сделал какие-то выводы. С чем я тут могу соглашаться или не соглашаться?
C>Там где, в дотнет тратишь минуту на написание теста в пять строк кода, на С++ надо городить огород с "инклюдами в специальных библиотеках", что займет уж явно ни один час.
Ну, завелся патефон...
C>Практика показывает, что если на написание теста времени уходит больше, чем на написание кода, то тест написан не будет. Что мы, собственно, и наблюдаем в случае С++ проектов — убогость на лицо.
Угу, угу — пластинка виниловая, потёртая и трещит.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, criosray, Вы писали:
C>И Вам сказать по сути нечего? К чему этот пустой трёп?
Тебе по сути vdimas всё сказал.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, NikeByNike, Вы писали:
NBN>Например, на том же RSDN вопросы по покетам задают восновном в контестке CF. Однако вопросы задают восновном нубы (создают статистику), а профи пишут на С++ (реальность).
C>В том, что для С# никогда не будет "десятков компиляторов и платформ" — язык будет продолжать развиваться во много раз быстрее С++ до тех пор, пока будет куда развиваться, а путей развития для него все еще — море.
Давно таких горячих и выспренных не видел. Это нормально по-студенчеству, главное не сильно переживай, когда с разбегу начнешь налетать на детские болезни программистов и прочие грабли.
Здравствуйте, vdimas, Вы писали:
C>>В том, что для С# никогда не будет "десятков компиляторов и платформ" — язык будет продолжать развиваться во много раз быстрее С++ до тех пор, пока будет куда развиваться, а путей развития для него все еще — море.
V>Давно таких горячих и выспренных не видел. Это нормально по-студенчеству, главное не сильно переживай, когда с разбегу начнешь налетать на детские болезни программистов и прочие грабли.
На детские болезни программистов и прочие грабли я налетал примерно 11 лет тому назад, когда работал С/С++ программистом. Так что Ваш комментарий, молодой человек, несколько "мимо тазика".
Здравствуйте, samius, Вы писали:
S>Здравствуйте, Sorantis, Вы писали:
S>>А вы тут Си, СиШарпы.. Аж смешно S>Ну PHP-то до С и Java недорос еще.
А ему это надо?
Здравствуйте, Sorantis, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>Здравствуйте, Sorantis, Вы писали:
S>>>А вы тут Си, СиШарпы.. Аж смешно S>>Ну PHP-то до С и Java недорос еще. S>А ему это надо?
Тут показано как C# и C++ сливают PHP по популярности.
Не надо сравнивать апельсины с яблоками. В контексте С++ и СиШарпа ваша ссылка никакой значимости не имеет.
Очевидно, что Джава и всеми (и мною тоже) нелюбимый ПХП обскакали, скажем, по популярности как С++ так и СиШарп.
Здравствуйте, vdimas, Вы писали:
V>>>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
C>>Пример классического ламеризма. Может стоило бы для начала что-то узнать о предмете обсуждения? Например, что версия CLR все еще 2.0.х, а не 3.0
V>Насколько я понял, ты просто не в курсе какие тут шли обсуждения сразу после выхода второго фреймворка. Порой заносило даже весьма уважаемых мною коллег (уажаемых за то, что их обычно не заносит). А ламеризм — это когда читают оппонента, и при этом десятое сообщение подряд совершенно не втыкают, о чем речь... Речь о том, что мы все унутренне готовились к несколько другому развитию событий, а оно вишь как вышло — застряли малость.
V>И вот это твое замечание насчет версий фреймворков... неожиданный ход, прямо скажем. V>Я только не понял, какую мою мысль должен был опровергнуть твой выпад, не пояснишь нам, убогим?
Вы даже не знаете разницы между фреймворком и CLR. Продолжайте писать в таком же духе — это становится очень забавно.
Ламеризм это когда человек делает много громких заявлений, имея очень слабое представление о предмете обсуждения. То, что мы и наблюдаем в Вашем случае.
Здравствуйте, vdimas, Вы писали:
VD>>С++ же используется в последнее время больше частью для создания высокотиражных продуктов где стоимость разработки не так важна
V>Правда твоя, он теперь преимущетсвенно используется для разработки высококачественного софта, и в каждую дырку его теперь не суют, что не может не радовать.
Не надо перевирать мои слова. Я о высоком качестве, как и вообще о качестве, не говорил.
VD>>так как окупается количеством продаж (т.е. — игры, ОС, офисные приложения), а меньшее потребление компьютерных ресурсов может увеличить объем продаж.
V>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
Я ничего не забывал. Я не ставил себе задачей перечислить все мелкие подниши. Кодеки можно смело отнести к системному софту (в купе с дровами). "мультимедиа" — это что-то очень абстрактное. Ну, а риалтайм тут не в кассу. Он и на Руби более чем возможен.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>С какой это радости система типов более мощная? ИМХО, гораздо более простая, в плане параметрических типов (мощная она по сравнению с Nemerle разве что). Или ты считаешь, что если пользовательские типы ограничить только до алгебраических, то система типов от этого мощнее становится? Она становится проще гораздо и ограниченнее.
Иди разберись, что такое система типов. Потом поговорим. Nemerle же использует систему типов .net, которая принципиально не допускает вычислений (как Хаскель и С++). Только Nemerle это и не нужно. У него есть своя система метапрограммирования работающая во время компиляции.
VD>>2. Есть куда более мощные синтаксические препроцессоры (например, Nemerle и Лисп) которые по возможностям и удобству рвут С++ как тузик грелку. К примеру, я воспроизвел linq из спецификации C# написав два макроса. С++ такое сделать не может в приципе.
V>И? 99.99% языков такое сделать не могут в принципе, ибо давать дорабатывать компилятор простым программистам — это спорное занятие. Не зря на Лиспе и Форте не так уж много людей лабали.
Ну, вот С++ к этим процентам и относится. Хотя процент несколько завышен. Почти любой скриптовый язык обладает не хилыми возможностями МП.
V>С# 5/6/7 тоже мочь не будет однозначно, эта фишка "не на каждый день", в массы его вряд ли выпустят.
Ага. Обезьяны с дубинами не доросли. Даш им оружие по мощнее и они себе что-нить отстрелят .
V>Дженерики слабее на порядок примерно, не знаю, откуда ты берешь свое "лучше"?
Ты уж разберись. Или у Nemerle более мощная система типов (а за одно и у C#, так как она у них единая, практически), или "Дженерики слабее на порядок".
Подсказка. МП и система типов не обзяательно должны быть связаны.
V> Банально хрен обобщишь алгоритм на float и на double, а тебе от этого лучше.
О, как. А мужики то и не знали. Хочешь я тебя научу обобщать алгоритмы на любом языке поддерживающем лямбды и/или generic-интерфейсы?
V> Реально и с размахом эти дженерики используются только по одному назначению — улучшить статическую типизацию, дабы меньше было динамической или тупого боксинга на ровном месте — офигенная, однако, у нас разновидность полиморфизма-то.
О, как? Еще одно противоречие. Ты уж определись или дженерики не позволяют обобщать алгоритмы, или они могут улучшить статическую типизацию. Это как бы два друг-другу протеворечащих заявления.
V>У меня за эти годы сложилось четкое убеждение, что дженерики — это способ обходить перечисленные недостатки платформы .Net, не более того.
У тебя за эти годы сложилось много каши в голове .
VD>>А уж параметрический полиморфизм в современных ФЯ сделан несравнимо лучше шаблонов С++.
V>Голословие. Если по возможностям — то так же или хуже (где есть явная специализация — то примерно так же, где нет — хуже). "Лучше" разве что по минималистическому синтаксису всего одного языка. Дык по этому критерию и Немерле — убожество еще то.
Тебе конечно виднее. Когда в руках молоток, то все вокруг кажется гвоздями.
VD>>Просто использование шаблонов выходит за рамки параметрического полиморфизма и входят в область метапрограммирования. Но в этой области безоговорочно царят макросы. И убогим возможностям С++ тут делать не чего.
V>Ты то отсылаешь к Хаскелю и ОКамлу, то называешь языки без макросов убогими (значит и их тоже). А ведь системе типов Немерле даже до Хаскельной как до луны раком. В общем, более чем сумбурно.
Ты кашку из головки вынь и попытайся систематизировать знания. Тогда поймешь, что система типов и система МП — это разные вещи. И можно спокойно иметь слабую систему типов и сильную систему МП (как в Лиспе, например), или наоборот сильную систему типов и слабую МП (Хаскель).
VD>>Если же серьезно говорить о метапрограммировании, то С++ тут откровенный лузер, если сравнивать его с такими языками, реализованными поверх дотнета, как Nemerle и Lisp. Вот где МП доведено до высшего пилотажа. Причем оно исходно предусмотрено в языка, а не достигается использованием побочных эффектов системы типов.
V>Не надо из МП делать священную корову, иногда и просто попрограммировать надо. У вас в том большом реальном проекте доля МП так себе, прямо скажем. А все остальные многие и многие тыщщи строк делать на Лиспе — увольте и в пример больше не приводите.
Как говорится "слив зачитан".
V>И что касается макросов, то Лисп тут проигрывает даже Форту, по удобству пользования этой фичей... Так что, отличное вышло у тебя пюре, надо сказать.
Гы-гы. Расскажи это лиспарям.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
V>>Я только не понял, какую мою мысль должен был опровергнуть твой выпад, не пояснишь нам, убогим?
C>Вы даже не знаете разницы между фреймворком и CLR.
Так пояснишь или нет?
Заодно и последнее.
C>Ламеризм это когда человек делает много громких заявлений, имея очень слабое представление о предмете обсуждения. То, что мы и наблюдаем в Вашем случае.
Для 11 лет практики маловато конкретики, ближе к телу.
Здравствуйте, VladD2, Вы писали:
VD>Не надо перевирать мои слова. Я о высоком качестве, как и вообще о качестве, не говорил.
Да ладно, красиво же было сказано, я не удержался.
VD>Я ничего не забывал. Я не ставил себе задачей перечислить все мелкие подниши. Кодеки можно смело отнести к системному софту (в купе с дровами). "мультимедиа" — это что-то очень абстрактное. Ну, а риалтайм тут не в кассу. Он и на Руби более чем возможен.
Может и возможен, но тот же VoIP сервак потянет на порядок меньше клиентов.
-----------
А вообще, не находишь странным спустя лет 5 примерно, пройтись по тем же темам?
У меня, например, вообще любимого языка нет. Использую активно С# и С++, но к обоим достаточно претензий. И к Немерле тоже, разумеется.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, VladD2, Вы писали:
VD>>Не надо перевирать мои слова. Я о высоком качестве, как и вообще о качестве, не говорил.
V>Да ладно, красиво же было сказано, я не удержался.
Перевиравшие слов — это красиво.
Скажи, ты действительно не понимаешь, что подмена понятий и несвязанные выводы — это средство получать лживые выводы? Или ты намеренно пытаешься добиться лжи?
V>Может и возможен, но тот же VoIP сервак потянет на порядок меньше клиентов.
Слово "риалтамй", которое ты тут не к месту упомянул, не имеет никакого отношения к производительности.
Кстати, само заявление тоже высосано из пальца.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>Иди разберись, что такое система типов. Потом поговорим. Nemerle же использует систему типов .net, которая принципиально не допускает вычислений (как Хаскель и С++). Только Nemerle это и не нужно. У него есть своя система метапрограммирования работающая во время компиляции.
Во первых да, параметризацию Хаскеля, так же как и шаблоны С++ в бинарную сборку не запихаешь (отчего Хаскеля и нет на .Net), ну дык кто мешает распространять так же как шаблонные библиотеки на С++ — в исходниках?
Во вторых, я дал реплику относительно твоего заявлени о "мощности" системы типов Хаскеля относительно С++. Хотел бы увидеть эту мощность, помимо встроенных алгебраических типов.
V>>С# 5/6/7 тоже мочь не будет однозначно, эта фишка "не на каждый день", в массы его вряд ли выпустят.
VD>Ага. Обезьяны с дубинами не доросли. Даш им оружие по мощнее и они себе что-нить отстрелят .
Да вполне нормальный ситуейшн и изменений в обозримом будущем не предвидится. На таких лего-компиляторах как Немерле надо делать системы по разработке DSL, а не целевой потенциально-важный код. В общем, я — за разграничение ответственности.
V>>Дженерики слабее на порядок примерно, не знаю, откуда ты берешь свое "лучше"?
VD>Ты уж разберись. Или у Nemerle более мощная система типов (а за одно и у C#, так как она у них единая, практически), или "Дженерики слабее на порядок".
Нет, система типов не мощная. Мощный вывод типов, но это не одно и то же.
VD>Подсказка. МП и система типов не обзяательно должны быть связаны.
Блин, это должна была быть моя подсказка. Влад, я понимаю, что совершенно некогда читать каждого попавшегося тебе vdimas-а, но разговор слепого с глухим как минимум утомляет.
V>> Банально хрен обобщишь алгоритм на float и на double, а тебе от этого лучше.
VD>О, как. А мужики то и не знали. Хочешь я тебя научу обобщать алгоритмы на любом языке поддерживающем лямбды и/или generic-интерфейсы?
Нашел обобщение. Сорри, суходрочка это, а не обобщение.
V>> Реально и с размахом эти дженерики используются только по одному назначению — улучшить статическую типизацию, дабы меньше было динамической или тупого боксинга на ровном месте — офигенная, однако, у нас разновидность полиморфизма-то.
VD>О, как? Еще одно противоречие. Ты уж определись или дженерики не позволяют обобщать алгоритмы, или они могут улучшить статическую типизацию. Это как бы два друг-другу протеворечащих заявления.
С чего бы они противоречили друг-другу? Возможность внутри алгоритма покласть объект в типизированное хранилище — не бог весть какое обобщение. Переопределённые операторы и вообще все статические члены — не доступны. А значит прощай статически реализуемые траитсы и бихейворы, статические эффективные фабричные методы и иже с ними. Т.е. я даже ни о каком МП не говорю, только о параметрическом полиморфизме, которого практически нет в генериках.
VD>>>А уж параметрический полиморфизм в современных ФЯ сделан несравнимо лучше шаблонов С++.
V>>Голословие. Если по возможностям — то так же или хуже (где есть явная специализация — то примерно так же, где нет — хуже). "Лучше" разве что по минималистическому синтаксису всего одного языка. Дык по этому критерию и Немерле — убожество еще то.
VD>Тебе конечно виднее. Когда в руках молоток, то все вокруг кажется гвоздями.
Ну ты ведь все-равно поинта про параметрический полиморфизм не понял, так? Понимаешь, в генериках мы можем вызывать методы типа-параметра либо унаследованные им от Object, либо доставшиеся от типов/интерфейсов-ограничений. А это не совсем параметрический полиморфизм, это самый что ни на есть обычный, через vtable или как его. Сравни с явным инстанциированием классов типов в том же Хаскеле. Почему выше абзацем сказал "практически" — из-за value-type.
VD>>>Просто использование шаблонов выходит за рамки параметрического полиморфизма и входят в область метапрограммирования. Но в этой области безоговорочно царят макросы. И убогим возможностям С++ тут делать не чего.
V>>Ты то отсылаешь к Хаскелю и ОКамлу, то называешь языки без макросов убогими (значит и их тоже). А ведь системе типов Немерле даже до Хаскельной как до луны раком. В общем, более чем сумбурно.
VD>Ты кашку из головки вынь и попытайся систематизировать знания. Тогда поймешь, что система типов и система МП — это разные вещи. И можно спокойно иметь слабую систему типов и сильную систему МП (как в Лиспе, например), или наоборот сильную систему типов и слабую МП (Хаскель).
Вот только здесь с тобой и соглашусь. Мне в С++ крайне не нравится синтаксическая легкость конструкции C-style приведения типа, которая и может стать причиной той самой неверной реинтерпретации памяти. Вот только одну эту возможность убери (static_cast и const_cast тоже) — и будет практически другой язык с другой репутацией. А всё остальное в С++ — это классика статической строгой типизации и даже кое-какие МП-зачатки, чем не в состоянии похвастаться многие другие статически строго-типизированные языки.
VD>Скажи, ты действительно не понимаешь, что подмена понятий и несвязанные выводы — это средство получать лживые выводы?
Щас, если пару раз прочту, а то с первого раза как-то не очень...
А если по-делу, я ведь не поверю, что дотнетчики-одиночки делают лучший софт, чем крупные конторы на С++. Так что гоуту собственный пост, ты сам все сказал.
VD>Или ты намеренно пытаешься добиться лжи?
Или ты задал очередной дурацкий вопрос.
V>>Может и возможен, но тот же VoIP сервак потянет на порядок меньше клиентов.
VD>Слово "риалтамй", которое ты тут не к месту упомянул, не имеет никакого отношения к производительности.
Это у сферических коней и бравых форумных парней не имеет. В конкретных цифрах, если производительность не дает вкладываться в отведённые временные рамки, то отношение получишь непосредственное. И в VoIP, если не в курсе, с задержками довольно-таки строго.
VD>Кстати, само заявление тоже высосано из пальца.
Насчет порядка на Ruby? Тебе на заметку — простейший шумоподавитель на .Net работает в 3 раза медленнее, чем на С++, микшер конференции на C# — в 3-5 раз медленнее, чем на С++. Не думаю, что я сильно ошибся относительно Ruby.
Здравствуйте, vdimas, Вы писали:
V>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
Ну да, всего-то научились инлайнить вызовы со структурами, а также ускорили работу GC, несмотря на то что версия CLR не поменялась.
С учетом этих ускорений код на .NET, который проигрывал плюсовому в 1,5-2 раза стал выигрывать у плюсовго по скорости.
И это даже бех перекомпиляции программ.
Здравствуйте, vdimas, Вы писали:
V>Насчет порядка на Ruby? Тебе на заметку — простейший шумоподавитель на .Net работает в 3 раза медленнее, чем на С++, микшер конференции на C# — в 3-5 раз медленнее, чем на С++. Не думаю, что я сильно ошибся относительно Ruby.
1)Ну приведи код на C++ и C#, дающий такой результат. Хотя сомневаюсь что будет C++, будет тупо С, обернутый в класс и никаких шаблонов, STL, полиморфизма.
2)Ты писал о real-time, оно вообще говоря с производителностью не связано.
Здравствуйте, gandjustas, Вы писали:
S>>>Моки и заглушки — разные вещи, использующиеся в разных сценариях тестирования.
V>>Садись, два. V>>Роутеры и маршрутизаторы с этой же точки зрения тоже разные вещи, использующиеся в разных местах сети.
G>http://www.martinfowler.com/articles/mocksArentStubs.html — курить до просветления. G>Как провсетление наступит можно выложить сюда реализацию моков на С++
Здравствуйте, gandjustas, Вы писали:
G>Из этого утверждения следует:
Снова нарушения логики.
G>1)Профи не задают вопросов
Этого не утверждалось. Профи как сами умеют искать информацию (человек должен иметь склонность к этому, чтобы стать профи), так и знают более лучшие способы эту информацию найти.
G>2)Все профи раньше писали на CF.
Никаких предпосылок для данного утверждения, оно очевидно ложно.
G>3)Пишуших софт на CF несоизмеримо больше, так как далеко не каждый нуб становится профи, а сами по себе профи не появляются
Ну дык, каждый тупой школьник со своим тетрисом. Только они погоды не делают.
Здравствуйте, Anton Batenev, Вы писали:
c>> Откройте для себя .NET CF и Mono.
AB>Вот тут все про моно да про моно. Но хоть бы кто-нибудь показал мастер-класс на оном, а то складывается впечатление, что его защитники видели его только на картинках, а те, кто его пользовал, молчат, дабы не было стыдно.
Здравствуйте, gandjustas, Вы писали:
G>А shared_ptr — дополнительный оверхед к распределению памяти в куче.
Откройте для себя intrusive_ptr. Я, если честно, недоумеваю — чего так к shared_ptr прицепились ? Если объект наш собственный shared_ptr нафиг не упал, счётчик ссылок прекрасно встраивается. Вот если объект чужой и/или его модификация невозможна...
Здравствуйте, BulatZiganshin, Вы писали:
BZ>я не знаю насчёт net, но в ахскеле и по слузам в яве тоже двухпоколенный сборщик мусора. так он делает малую сборку через каждые 256кб выделенной памяти и никому это не мешает. так что ваозможно тут проблема только в прокладке
Имеем 3 вызова: 3х256кб == 3/4 от 1мб. Да пусть даже всего 256кб на простенький xmlrpc запрос с двумя параметрами... А не зажрались ли вы, батенька ?
Работа конкретно xmlrpc.net в данном случае это: сериализация двух параметров + имя метода в формат пакета XML-RPC, передача на сервер по HTTP/1.1, получение ответа и его десериализация в объектную модель.
Здравствуйте, gandjustas, Вы писали:
G>Самообман — думать что C++ всегда быстрее.
Можно пример программы на .NET, которую невозможно будет обогнать программой на С++ ? Желательно не скатываться на I/O, т.к. в этом случае будем мерять скорость работы сервисов ОС, и отставание .NET станет менее заметным. Под программой на С++ понимаем любой код, компилирующийся современным С++ компилятором, и дающий аналогичный результат работы.
P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить.
Здравствуйте, IID, Вы писали:
IID>JIT связан по рукам и ногам временными ограничениям. У С++ компилятора свободы (времени) гораздо больше.
И что? Из этого твоего заявления только следует, что JIT круче
IID>Насколько я понимаю, кода никто не приведёт, и можно засчитывать слив ?
Эээ неее, не надо всех под одну гребенку. Я про код ничего не говорил. Более того, ты вообще не найдешь ни одного моего поста, где бы я утверждал, что .Net быстрее С++. Я всего лишь поправил тебя, указав на очевидное.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, IID, Вы писали:
IID>>JIT связан по рукам и ногам временными ограничениям. У С++ компилятора свободы (времени) гораздо больше. MK>И что? Из этого твоего заявления только следует, что JIT круче
Круче, потому что тормознее ?
вот твоя цитата:
MK>И тебе подсказка: код на промежуточном языке компилируется при первом вызове, после чего скорость его исполнения в определенной степени перестаёт зависить от "выполнения некоторой С++ программы".
C++ код изначально компилируется. Так что непонятно, что "волшебного" даст "компиляция при первом вызове", особенно если не забывать про ограничения по времени на эту компиляцию. Рассматриваем пока в контексте одинакового железа для выполнения, не скатываясь к "потенциальным оптимизациям в будушем под свежее железо". На этот случай, например, есть GCC + LLVM. Но речь о другом.
IID>>Насколько я понимаю, кода никто не приведёт, и можно засчитывать слив ? MK>Эээ неее, не надо всех под одну гребенку. Я про код ничего не говорил. Более того, ты вообще не найдешь ни одного моего поста, где бы я утверждал, что .Net быстрее С++. Я всего лишь поправил тебя, указав на очевидное.
товарища gandjustas, в котором тот утверждал, что:
G>Самообман — думать что C++ всегда быстрее.
Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
Здравствуйте, IID, Вы писали:
MK>>Здравствуйте, IID, Вы писали:
IID>C++ код изначально компилируется. Так что непонятно, что "волшебного" даст "компиляция при первом вызове", особенно если не забывать про ограничения по времени на эту компиляцию. Рассматриваем пока в контексте одинакового железа для выполнения, не скатываясь к "потенциальным оптимизациям в будушем под свежее железо". На этот случай, например, есть GCC + LLVM. Но речь о другом.
речь о csc + JIT?
IID>Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
Товарищ уже ответил
Пример не приведу, ибо очень большо получится. Но основная суть в том, что в .NET можно генерировать код в рантайме.
Здравствуйте, gandjustas, Вы писали:
G>Пример не приведу, ибо очень большо получится. Но основная суть в том, что в .NET можно генерировать код в рантайме.
Неужели кратко продемонстрировать скоростные возможности языка никак не получается ? Если уж сильно хочется генерировать код в рантайме и чтобы не скатываться в сторону "я сейчас наворочу динамическую кодогенерацию, её в С++ нет, и никто со мной связываться не захочет" можно поступить очень просто: берём (фиксируем) один любой, наперёд заданный, результат этой самой генерации, и меряем скорость.
Здравствуйте, IID, Вы писали:
IID>Неужели кратко продемонстрировать скоростные возможности языка никак не получается ?
Дело не в языке, а скорее в платформе. IID>Если уж сильно хочется генерировать код в рантайме и чтобы не скатываться в сторону "я сейчас наворочу динамическую кодогенерацию, её в С++ нет, и никто со мной связываться не захочет" можно поступить очень просто: берём (фиксируем) один любой, наперёд заданный, результат этой самой генерации, и меряем скорость.
Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
Хочется сравнивать скорость в этом примере? Если да, то от Вас требуется предоставить решение на С++, потом договоримся о конфигурации тел и померяем скорость...
Здравствуйте, samius, Вы писали:
S>Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
Здравствуйте, hattab, Вы писали:
H>Здравствуйте, samius, Вы писали:
S>>Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
H>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
Ну так-то конечно, на худой конец можно на C++ нагенерить и выполнить код с помощью .net-а
Здравствуйте, samius, Вы писали:
S>>>Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
H>>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
S>Ну так-то конечно, на худой конец можно на C++ нагенерить и выполнить код с помощью .net-а
Это не к вопросу перформанса, это к вопросу о плюсах платформы
Здравствуйте, samius, Вы писали:
S>Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
Будем мерять скорость стороннего парсера ? Или от меня требуется написать свой собственный парсер ? очень смешно, попытка прикрыть слив надуманной сложностью.
Давай тогда я пример приведу, раз от тебя внятного и короткого семпла не добиться: будем мерять скорость md5. По 64 раунда стандартного алгоритма на блок. Сложностей это закодить нет никаких, не надо ни парсеры писать, ни предметную область изучать. Жду реализацию на .NET
Здравствуйте, gandjustas, Вы писали:
IID>>Если уж сильно хочется генерировать код в рантайме и чтобы не скатываться в сторону "я сейчас наворочу динамическую кодогенерацию, её в С++ нет, и никто со мной связываться не захочет" можно поступить очень просто: берём (фиксируем) один любой, наперёд заданный, результат этой самой генерации, и меряем скорость. G>Не надо жопой вилять. Как раз динамическая кодогенерация позволяет написать программу так чтобы она работала в общем случае быстрее нативной. G>Если взять один конкретный случай (набор входных данных), то смотри выше про ассемблер.
Я говорил не проконкретный набор входных данных, а про фиксацию алгоритма, скорость которого будем сравнивать. Ещё раз, для прапорщиков: раз ты утверждал что:
G>Самообман — думать что C++ всегда быстрее.
так потрудись привести пример, подтверждающий твои слова. Если бы ты сказал что-то вроде "наивно думать что на С++ всё реализуется с такой же лёгкостью/гибкостью как в .NET" — не было бы таких вопросов к тебе. Раз заикнулся о скорости — давай говорить предметно. Измеряя скорость конструкций языка, а не скорость подсистем ввода вывода/сторонних парсеров/спутников на орбите/etc.
Здравствуйте, samius, Вы писали:
S>Ты просил пример, где программа на C++ сольет в разы. Я привел. Пример, где сольет дотнет я не просил.
Ссылку с C# кодом подтрудись привести, в ворохе твоих сообщений сходу не нашёл. И учти, я не буду писать абсолютно идентичный вариант, если используется кодогенерация. Мне моё время дорого. Раз этого не хочешь сделать ты — я сам зафиксирую один (произвольный) вариант исполнения алгоритма. Не факт что он будет оптимальным для тебя.
S>Доказывать что md5 на С будет немного быстрее C# мне не надо.
НЕМНОГО ?!! Ты уверен что это действительно будет НЕМНОГО? (кстати, что такое НЕМНОГО? пара процентов ? или, может быть, разы ?)
Здравствуйте, IID, Вы писали:
IID>Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
Здравствуйте, IID, Вы писали:
IID>C++ код изначально компилируется. Так что непонятно, что "волшебного" даст "компиляция при первом вызове", особенно если не забывать про ограничения по времени на эту компиляцию. Рассматриваем пока в контексте одинакового железа для выполнения, не скатываясь к "потенциальным оптимизациям в будушем под свежее железо". На этот случай, например, есть GCC + LLVM. Но речь о другом.
Никакого волшебства. Просто если функция вызывается 1000 раз, компилироваться она будет только 1 раз, остальные 999 будет работать машинный код. Чтобы снова не было придирок: я не утверждаю, что эти 999 работают быстрее, чем аналогичный код на С++. А для особо волнующихся, есть NGen.
Здравствуйте, hattab, Вы писали:
S>>Я уже приводил в пример расчеты (пусть это будут пространственные запросы) по телам, ограниченными аналитически заданными поверхностями. На .net это возможно сделать через кодогенерацию. В C++ кодогенерация недоступна, следовательно использовать можно парсеры, интерпретаторы и т.п.
H>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
Скриптеры будут заведомо менее производительны. Даже такие продвинутые как Lua — даже они в разы медленнее машинного кода, генерируемого CLR. Это конечно не значит, что их производительности не будет хватать на многих задачах — уверен, что будет, но здесь многие переживают за невидимые такты и неслышимые байты оверхеда (юношеский максимализм — что поделаешь...).
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
IID>>>Если уж сильно хочется генерировать код в рантайме и чтобы не скатываться в сторону "я сейчас наворочу динамическую кодогенерацию, её в С++ нет, и никто со мной связываться не захочет" можно поступить очень просто: берём (фиксируем) один любой, наперёд заданный, результат этой самой генерации, и меряем скорость. G>>Не надо жопой вилять. Как раз динамическая кодогенерация позволяет написать программу так чтобы она работала в общем случае быстрее нативной. G>>Если взять один конкретный случай (набор входных данных), то смотри выше про ассемблер.
IID>Я говорил не проконкретный набор входных данных, а про фиксацию алгоритма, скорость которого будем сравнивать. Ещё раз, для прапорщиков: раз ты утверждал что:
IID>
G>>Самообман — думать что C++ всегда быстрее.
IID>так потрудись привести пример, подтверждающий твои слова. Если бы ты сказал что-то вроде "наивно думать что на С++ всё реализуется с такой же лёгкостью/гибкостью как в .NET" — не было бы таких вопросов к тебе. Раз заикнулся о скорости — давай говорить предметно. Измеряя скорость конструкций языка, а не скорость подсистем ввода вывода/сторонних парсеров/спутников на орбите/etc.
А причем тут скорость конструкций языка? тебе это помогает обманывать себя?
Думаешь скорость реальных программ зависит от какой-то мифической "скорости конструкций языка"?
Как же тогда померить скорость lisp, там из конструкций языка только скобки?
Здравствуйте, gandjustas, Вы писали:
G>А причем тут скорость конструкций языка? тебе это помогает обманывать себя? G>Думаешь скорость реальных программ зависит от какой-то мифической "скорости конструкций языка"?
G>Как же тогда померить скорость lisp, там из конструкций языка только скобки?
примера-подтверждения так и нет. Скоростной MD5 на C# я тоже не увидел. Слив засчитываем.
IID> так потрудись привести пример, подтверждающий твои слова. Если бы ты сказал что-то вроде "наивно думать что на С++ всё реализуется с такой же лёгкостью/гибкостью как в .NET" — не было бы таких вопросов к тебе. Раз заикнулся о скорости — давай говорить предметно. Измеряя скорость конструкций языка, а не скорость подсистем ввода вывода/сторонних парсеров/спутников на орбите/etc.
Это все синтетика. Как можно сравнивать if с if'ом?
Вон, в «декларативном программировании» привели пример считывания файлов таки. Ленивый Хаскель всех порвал.
Здравствуйте, criosray, Вы писали:
H>>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
C>Скриптеры будут заведомо менее производительны. Даже такие продвинутые как Lua — даже они в разы медленнее машинного кода, генерируемого CLR. Это конечно не значит, что их производительности не будет хватать на многих задачах — уверен, что будет, но здесь многие переживают за невидимые такты и неслышимые байты оверхеда (юношеский максимализм — что поделаешь...).
Здравствуйте, hattab, Вы писали:
H>>>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
C>>Скриптеры будут заведомо менее производительны. Даже такие продвинутые как Lua — даже они в разы медленнее машинного кода, генерируемого CLR. Это конечно не значит, что их производительности не будет хватать на многих задачах — уверен, что будет, но здесь многие переживают за невидимые такты и неслышимые байты оверхеда (юношеский максимализм — что поделаешь...).
H>Читай внимательнее.
G>>>ЗЫ. Я уже писал в этой теме тест, который меряет выделение памяти стандартным аллокатором. .NET выигрывает.
H>>Ты так часто это повторяешь, что скоро и сам поверишь...
G>Зачем мне верить, у меня результаты тестов есть.
G>Это вот плюсистам надо верить что их код всегда быстрее.
Они верят, не сомневайтесь.
Как человек, не видивший ничего кроме крупинки Вселенной, считает себя самым разумным существом во Вселенной.
Здравствуйте, gandjustas, Вы писали:
G>>>ЗЫ. Я уже писал в этой теме тест, который меряет выделение памяти стандартным аллокатором. .NET выигрывает.
H>>Ты так часто это повторяешь, что скоро и сам поверишь...
G>Зачем мне верить, у меня результаты тестов есть.
У тебя тест не правильный Померял непонятно что у MSVC++ и экстраполируешь на весь С++... Померяй у Borland C++ Builder'а вышедшего после 2005 года, и увидишь, что Борландовое непонятно что, порвет, и MSVC++, и .NET (впрочем, я давал результаты на FastMM)
Здравствуйте, criosray, Вы писали:
H>>>>Просто пример в тему: для нативной Delphi есть скриптеры с компиляцией в x86, есть компиляторы формул (похоже тема вообще популярная), есть в конце-концов бесплатные компиляторы командной строки . Не думаю, что у C++ с этим хуже.
C>>>Скриптеры будут заведомо менее производительны. Даже такие продвинутые как Lua — даже они в разы медленнее машинного кода, генерируемого CLR. Это конечно не значит, что их производительности не будет хватать на многих задачах — уверен, что будет, но здесь многие переживают за невидимые такты и неслышимые байты оверхеда (юношеский максимализм — что поделаешь...).
H>>Читай внимательнее.
C>Примеры?
V>>Насчет порядка на Ruby? Тебе на заметку — простейший шумоподавитель на .Net работает в 3 раза медленнее, чем на С++, микшер конференции на C# — в 3-5 раз медленнее, чем на С++. Не думаю, что я сильно ошибся относительно Ruby.
G>1)Ну приведи код на C++ и C#, дающий такой результат. Хотя сомневаюсь что будет C++, будет тупо С, обернутый в класс и никаких шаблонов, STL, полиморфизма.
Там и на C# варианте никаких генериков в этом месте, полиморфизма и System.Collection.Generic. Что сказать-то хотел?
Код не приведу, качественный аудио-микшинг конференций — это одна из заметных составляющих стоимости сервера конференций, ибо остальное — практически фигня полная.
G>2)Ты писал о real-time, оно вообще говоря с производителностью не связано.
Обожаю сеансы банальностей на rsdn. Если его никто не связал, то оно и не связано. А если связали вполне конкретными требованиями прямо в ТЗ, то ты только что напрасно потряс воздух.
Не увидел где там string.Replace, но тем не менее код (как тестовая платформа) мне по душе. Только модифицируйте его до компилябельного состояния.
S>Далее рисуем на растре плоскость Z = 0 в квадрате -1<x<2; -1.5<y<1.5 S>Должно получиться что-то типа болта, вкрученного в стену.
с каким шагом изменяется пара (x,y) ? Давайте так: законченный код на С#, генерирующий некоторый массив значений. По идентичности массивов можно судить о эквивалентности C# <=> C++ реализаций.
S>Непременное условие — возможность изменения описания поверхностей в рантайме.
Это пока опустим, для простоты. Фактически, мы зафиксировали один из вариантов описания поверхностей, теперь посмотрим на скорость рендеринга по нему. Если очень хочется — можно померять две реализации, с вынесом констант в некоторую структуру "настроек".
S>>>Доказывать что md5 на С будет немного быстрее C# мне не надо. S>Уверен, что разница будет не такая, как между выполнением кода и интерпретацией
Не такая, но и не в несколько процентов, как уверяют одепты .NET Для интереса можно и этим "померяться".
Здравствуйте, Mamut, Вы писали:
IID>> так потрудись привести пример, подтверждающий твои слова. Если бы ты сказал что-то вроде "наивно думать что на С++ всё реализуется с такой же лёгкостью/гибкостью как в .NET" — не было бы таких вопросов к тебе. Раз заикнулся о скорости — давай говорить предметно. Измеряя скорость конструкций языка, а не скорость подсистем ввода вывода/сторонних парсеров/спутников на орбите/etc.
M>Это все синтетика.
Все тесты по сути синтетика.
M>Как можно сравнивать if с if'ом?
Не передёргивай Имелось ввиду измерение скорости самодостаточного алгоритма, который есс-но, описан этими самыми конструкциями. Алгоритма, а не сторонних библиотек/парсеров/сервисов ОС/и т.д.
M>Вон, в «декларативном программировании» привели пример считывания файлов таки. Ленивый Хаскель всех порвал.
Понятно, что ничего не делать можно за бесконечно малое время.
Здравствуйте, criosray, Вы писали:
C>Здравствуйте, IID, Вы писали:
IID>>Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
C>Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
IID>>>Т.е. товарищ всеръез считает, что можно написать на .NET программу, которая окажется быстрее чем С++. Мой же поинт в том, что С++ всё-таки быстрее (уж во всяком случае точно не медленнее).
C>>Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
IID>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
Здравствуйте, MxKazan, Вы писали:
MK>Никакого волшебства. Просто если функция вызывается 1000 раз, компилироваться она будет только 1 раз, остальные 999 будет работать машинный код. Чтобы снова не было придирок: я не утверждаю, что эти 999 работают быстрее, чем аналогичный код на С++. А для особо волнующихся, есть NGen.
Diclaimer: я нисколько не считаю .NET/C# тормозным языком. Более того, я готов признать что на типичных задачах тормоза будут некритичными, потребление памяти — вещь в себе, не всегда это значимое ограничение. Я даже готов признать что .NET уделает неряшливый С++ вариант. Но вот с тем что некоторая .NET код может оказаться априори быстрее любого аналогичного кода на С++ (на одинаковом железе, ага) я поверить не могу. И пытаюсь получить от автора данного мнения подтверждение.
Здравствуйте, criosray, Вы писали:
C>>>Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
IID>>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
C>А я о чем говорил?
Из конкретики — о увеличичении скорости написания кода (могу согласиться). Остальное — вода, зависящая от кучи факторов. Совершенно непонятно, почему код С++ лишается возможности быть качественным, иметь продуманный дизайн, хорошие алгоритмы. Тоже и по профилированию. Возможно при этом для С++ варианта придётся потратить больше (усилий, времени, etc.). С другой стороны это может быть резонно в свете полученных бенефитов (потребление памяти, перфоманс, предсказуемость скорости работы.). Короче опять прописные истины, банальные, обсосанные по сто раз кряду.
Напомню, вопрос всё-таки стоит так, что С++ вариант не всегда окажется быстрее. Я уже кучу постов бьюсь, пытаясь получить "волшебный" .NET код, для которого не окажется более быстрого С++ варианта.
C>>>>Можно написать. У каждой проблемы существует множество решений. Более экспрессивные средства и инструменты дотнет позволяют писать код на много быстрее, уделяя больше времени качеству кода, продуманности дизайна и выбора алгоритмов, ну и наконец быстро профилировать, выявлять узкие места и ликвидировать их.
IID>>>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
C>>А я о чем говорил?
IID>Из конкретики — о увеличичении скорости написания кода (могу согласиться). Остальное — вода, зависящая от кучи факторов. Совершенно непонятно, почему код С++ лишается возможности быть качественным, иметь продуманный дизайн, хорошие алгоритмы. Тоже и по профилированию. Возможно при этом для С++ варианта придётся потратить больше (усилий, времени, etc.).
Именно о том и речь. Время, как известно, вовсе не безграничный ресурс.
Здравствуйте, criosray, Вы писали:
ГВ>>Это зависит от того, что в данной конфигурации полагается модулем, а что — интеграцией. Поскольку структура любой сложной программы иерархическая, то модуль на одном уровне — это сборная конструкция на другом.
C>Нет, не зависит. RTFM, как говорится.
Мдее, это какой-то пуленепробиваемый ппц...
Вопрос на засыпку: ты пользуешься классами, скажем, .Net фреймворка в своих тестах? Вернее так, есть ли у тебя хоть один юнит-тест, где ты ими пользуешься?
Я-то ответ знаю, но вижу непонимание тобой сути происходящих вещей.
ГВ>>И неужто будет проще, чем аналогичная заглушка? Это если учесть, то заглушка реализуется в естественном синтаксисе, а мок — перехватом вызовов. Второе будет почти гарантированно сложнее.
C>С этой глупостью я даже спорить не стану.
Это от неумения организовывать тестирование в отсутствии ср-в поддержки или в случае, когда их возможностей не хватает.
C>Можете продолжать бояться. Как все-таки доберетесь до RTFM`а, то поймете, что я был прав.
C>Если Ваш код на столько сложный и запутанный, что Вы не можете написать серию простых тестов для него, значит Ваш код — плохой. Вот Вам и пища для размышлений.
Ну напиши серию простых тестов для многоконтурной АСУ на базе ПИД.
Не все же пишут сайты с магазинами.
Здравствуйте, criosray, Вы писали:
C>А с чего Вы решили, что он "некомпилябельный"?
вообще-то я спрашивал не вас, а автора поста. Вот конкретные вопросы:
— что такое body ?
— в с каким шагом изменяется пара (x,y) вдоль интервалов ?
И, чтобы не было разногласий, я хочу чтобы результат можно было легко проверить: генерируем цвета в массив. Сравниваем массивы.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, samius, Вы писали:
IID>Не увидел где там string.Replace, но тем не менее код (как тестовая платформа) мне по душе. Только модифицируйте его до компилябельного состояния.
Это не код, это способ задания поверхностей в рамках некоторого DSL. string.Replace как раз модифицирует его до компилябельного состояния. Предлагаю не заморачиваться на конкретном синтаксисе, а сделать любой удобный, но с тем чтобы на нем можно было описать аналогичный набор поверхностей.
IID>с каким шагом изменяется пара (x,y) ? Давайте так: законченный код на С#, генерирующий некоторый массив значений. По идентичности массивов можно судить о эквивалентности C# <=> C++ реализаций.
Шаг вычисляется из размеров окна программы, хотя можно его зафиксировать в целях сравнения, идентичность массивов не нужна, достаточно похожесть картинок на глаз. Это же не продукт, а пруф концепт 2002-го года из которого можно еще выжать скорость оптимизацией под инлайнинг.
А вот код пока я не дам. Да там и нет ничего интересного, позор один. string.Replace преобразует описание поверхностей в исходник, потом исходник компилится и создается экземпляр класса, реализующего некоторый интерфейс, с помощью которого можно спрашивать цвет указанной точки пространства.
S>>Непременное условие — возможность изменения описания поверхностей в рантайме.
IID>Это пока опустим, для простоты. Фактически, мы зафиксировали один из вариантов описания поверхностей, теперь посмотрим на скорость рендеринга по нему. Если очень хочется — можно померять две реализации, с вынесом констант в некоторую структуру "настроек".
Можно и опустить, главное чтобы описание поверхностей было "текстовым", например ресурсом или внешним файлом.
Реально собрался интерпретировать?
IID>Не такая, но и не в несколько процентов, как уверяют одепты .NET Для интереса можно и этим "померяться".
не интересно.
Здравствуйте, IID, Вы писали:
IID> IID>> так потрудись привести пример, подтверждающий твои слова. Если бы ты сказал что-то вроде "наивно думать что на С++ всё реализуется с такой же лёгкостью/гибкостью как в .NET" — не было бы таких вопросов к тебе. Раз заикнулся о скорости — давай говорить предметно. Измеряя скорость конструкций языка, а не скорость подсистем ввода вывода/сторонних парсеров/спутников на орбите/etc.
IID> M>Это все синтетика.
IID> Все тесты по сути синтетика.
Можно предложить решение реальной задачи. Например, WideFinder
IID> M>Как можно сравнивать if с if'ом?
IID> Не передёргивай Имелось ввиду измерение скорости самодостаточного алгоритма, который есс-но, описан этими самыми конструкциями. Алгоритма, а не сторонних библиотек/парсеров/сервисов ОС/и т.д.
Это какой-то сферовакуумный конь получается
IID> M>Вон, в «декларативном программировании» привели пример считывания файлов таки. Ленивый Хаскель всех порвал.
IID> Понятно, что ничего не делать можно за бесконечно малое время.
Я ошибся, там сравнивались алгоритмы внутри хаскеля, а не в сравнении с С++
Здравствуйте, samius, Вы писали:
IID>>Не увидел где там string.Replace, но тем не менее код (как тестовая платформа) мне по душе. Только модифицируйте его до компилябельного состояния. S>Это не код, это способ задания поверхностей в рамках некоторого DSL. string.Replace как раз модифицирует его до компилябельного состояния. Предлагаю не заморачиваться на конкретном синтаксисе, а сделать любой удобный, но с тем чтобы на нем можно было описать аналогичный набор поверхностей.
Компилябельность мне нужна для себя. Чтобы я мог на своём железе собрать оба варианта и померять скорость. Ибо твоё железо явно от моего отличается, и замеры по отдельности бессмысленны. Поэтому, чтобы не заморачиваться с рисованием картинок и предлагаю писать в массив. А шаг установить одинаковых для обоих вариантов.
Здравствуйте, IID, Вы писали:
IID>Философствование насчёт практики — это выше по треду, когда коробочные продукты просили .NETовские показать. И пришли к выводу что практика это всё-таки С++. (VladD2 даже ввёл атрибут "тиражируемый" для С++ софта). Хотя у каждого "практика" может иметь собственный смысл.
IID>В любом случае, мне рассуждения в таком ключе не интересны. Было желание увидеть "волшебный" .NET код, обгоняющий C++. А в итоге скатились на банальщину. И ещё раз подтвердили тот факт что С++ таки уделывает .NET по скорости.
Да, в идеальном мире, где время, человеко-часы, персональный скилл программистов — величины безграничные, а платформа только одна.
К сожалению (для вас), мы живем в вовсе не таком идеальном мире.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
G>>Если не рассматривать способ получения этого кода, то такие рассуждения не нужны. G>>Это сродни тому что на ассемблере можно написать программу которая будет быстрее любой программы на любом языке.
IID>Именно! Поэтому изначальная фраза, про то что С++ не может оказаться быстрее — глупость.
А кто такое говорил?
IID> Иными словами C++ всегда может работать НЕ МЕДЛЕНЕЕ дотнета.
Не всегда, за счет динамической кодогенерации прога на .NET может работать быстрее аналогичной прогри на C++.
А вообще второе твое утверждение не эквивалентно первому, изучай логику.
IID>Любопытно другое — на С++ можно написать код, который как не пыжься, на дотнете с одинаковой производительностью не повторить. (md5 например)
Только это будет не C++, а голый С. Все фичи, которые тут обсасываются сторонниками С++ идут лесом.
G>>Тольео практика этот тезис не подтверждает.
IID>Философствование насчёт практики — это выше по треду, когда коробочные продукты просили .NETовские показать. И пришли к выводу что практика это всё-таки С++. (VladD2 даже ввёл атрибут "тиражируемый" для С++ софта). Хотя у каждого "практика" может иметь собственный смысл.
Почитай еще раз тему, очень много объяснений почему тиражируемый софт на С++ делается. IID>В любом случае, мне рассуждения в таком ключе не интересны. Было желание увидеть "волшебный" .NET код, обгоняющий C++. А в итоге скатились на банальщину. И ещё раз подтвердили тот факт что С++ таки уделывает .NET по скорости.
Здравствуйте, IID, Вы писали:
IID>Компилябельность мне нужна для себя. Чтобы я мог на своём железе собрать оба варианта и померять скорость. Ибо твоё железо явно от моего отличается, и замеры по отдельности бессмысленны. Поэтому, чтобы не заморачиваться с рисованием картинок и предлагаю писать в массив. А шаг установить одинаковых для обоих вариантов.
Компилябельность конкретного синтаксиса есть (после Replace-а). А вот чтобы в массив загнать — придется малость подкрутить. Что не обещаю сделать сегодня.
Если не секрет, что собрался сравнивать? Интерпретацию?
Здравствуйте, IID, Вы писали:
IID>Ну вот давай возьмём некоторый конкретный выхлоп этой кодогенерации, перепишем на С++, и удивимся, что он работает быстрее.
Здравствуйте, samius, Вы писали:
S>Если не секрет, что собрался сравнивать? Интерпретацию?
Нет конечно C++ вариант соберу Intel C++ Compiler 11.0.072, померяю скорость. Результаты, ключи компиляции и EXE выложу куда-нибудь. C# буду собирать VS2008 (вроде бы SP1, но не уверен). Ключи компиляции, версия CLR/языка, любые другие особенности сборки — как ты сам скажешь. Результаты тоже опубликую.
Здравствуйте, criosray, Вы писали:
C>Откройте документацию по xUnit.NET, откройте документацию по RhinoMocks и почитайте. Заниматься восполнением пробелов в Вашем образовании не намерен
Т.е. обсуждать на форуме эти возможности ты не в состоянии? Так я и думал.
V>>Не надоело рефлексировать и показывать в очередной раз свой поверхностный взгляд? Все твои вызовы мокков ради ассертов, собственно и сделаны. И хоть они теперь не в фас, а в профиль — они были и есть цель любого автоматического теста (не обязательно юнит...) C>"Все твои вызовы мокков ради ассертов, собственно и сделаны" — это напоминает генератор цепей Маркова. Взять два умных слова, и связать их между собой связующими. Получается билеберда, но звучит вроде как умно для стороннего человека.
Не смотря на выделенное ключевое слово, ты не понял, о чем речь. Хоть честно признался, что для тебя это билеберда.
C>Так вот, ликбез: мокинг выполняется с целью изолировать тестируемый объект от внешних зависимостей.
Странно, а я думал, что лет 40 до этого эту ф-ию выполняли заглушки... Или они нужны были для "чего-то другого"?
Блин, ты как только проснулся, что-то увидел, проникся и стал "вещать"... В отрыве от предыстории и сравнения различных способов достичь аналогичных целей ты будешь оставаться в своей роли проповедника хари кришны. А если будешь готов поговорить более предметно, надеюсь поймешь, что за деревьями потерял лес.
C>Что означает, что ожидается, что будет вызван databaseManager.BeginTransaction(), а потом в любом порядке будут вызваны Withdraw и Deposit.
И что сказать хотел? Ты ведь примитивизм какой-то приводишь... Который, кстати на АОП куда как прикольней выглядит, и не требует проверки на 4 после 2*2.
C>Ассерты и моки не цель. Это средство и ключевой механизм реализации юнит тестов.
Опять ошибка, это ср-во автоматизации тестирования в первую очередь. Интеграционному и регрессионному тестированию так же помогают и заглушки и изоляция и весь суповой набор и используются те же ср-ва автоматизации, наподобии xUnit.
C>При чем тесты ни коим образом не захламляют код. Все тесты находятся в отдельной сборке, которая "видит" (и только она одна) внутренности тестируемых сборок.
Это более чем не принципиально. Мы вот делим тестирующие сборки на "пояса безопасности", так удобнее (знаешь что это?). В общем, по-прежнему разговор ни о чем.
V>>Любую динамическую среду/заглушки, которые генерят переменный по насыщенности траффик или сообщения с разной задержкой и произвольным наполнением. Фишка в том, что реальных задержек-то и нет, текущее время эмулируется, но тестирующая последовательность слишком длинная, чтобы записывать её ручками, она генерируется программой. А таких последовательностей/программ у меня — мама не горюй.
C>Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests. При чем ничего невозможного в реализации этого нет — описанное реализуется элементарно в .NET.
Ты наверно плохо прочитал описанное Мною, тестируется работоспособность ровно одного юнита.
Ты попался в ту же ловушку, как и большинство, ратующих за строгую изоляцию юнит-тестов от интеграционных, не понимая сути вещей. Ответь здесь
насчет использования классов фреймворка в процессе юнит-тестирования. Гена тебе разжевал и практически в рот положил то, что должен был понять сам давно, но ты отмахнулся и поскакал дальше.
V>>Далее, обмен сложными структурами данных заглушки и тестируемого объекта, у объекта приличное пространство состояний, на что заглушка должна грамотно реагировать, т.е. приличная иногда логика на if-ах и case-ах. C>Элементарно средствами RhinoMocks.
Во-первых, мне гораздо больше по душе TypeMock, по сравнению с которым рино курит, во вторых даже на нем это не элементарно.
V>>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое.
C>Демагогия.
C>Выглядит преотлично. На много лучше, чем то, что у вас есть (а точнее нет) в unmanaged C++. lambda выражения и fluent interface дают прекрасную читабельность.
Как раз в С++ можно поинтересней синтаксис придумать для такого примера, и даже на проперти не через тектовый токен сослаться (что сакс)... Проблема-то там не в этом, а в бинарной совместимости. Тут уже написал по этой теме (последние 3 абзаца): http://www.rsdn.ru/Forum/message/3395444.1.aspx
V>>А теперь смотри что получается: автомоками удобно пользоваться для оформления относительно несложных тестов, где внешние условия и реакцию на них вполне можно описать декларативно и синтаксис все еще не будет раздражать. C>Модульные или unit тесты ОБЯЗАНЫ быть несложными. В этом их СУТЬ.
Беда-беда... Ты же сам где-то правильно говорил, что есть модульные тесты, а теперь несешь отсебятину. Тесты должны быть в первую очередь адекватны задаче и коду, а сложные/несложные — разговор в пользу бедных. Ты еще начни тут вещать, что "код тоже всегда простой", сразу можно будет пожизненно в сайтостроители оформлять.
V>>Ах да, чуть не забыл... разумеется без них практически никак, если у кого-то был неудержимый понос на Ынтерфейсы в период дизайна. Собственно для них в первую очередь оно и есть. C>Нет, не для них. Вам не надоело ламерствовать?
Развлекаюсь, пока мне интересно. Например, ты опять нихрена не понял. Когда упоминают тучи интерфейсов, то имеют ввиду сильную связанность дизайна. А теперь прочитай твои собственные обрывки, где ты говорил для чего, по-твоему, нужны моки. И кто теперь ламер?
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, samius, Вы писали:
S>>Если не секрет, что собрался сравнивать? Интерпретацию?
IID>Нет конечно C++ вариант соберу Intel C++ Compiler 11.0.072, померяю скорость. Результаты, ключи компиляции и EXE выложу куда-нибудь. C# буду собирать VS2008 (вроде бы SP1, но не уверен). Ключи компиляции, версия CLR/языка, любые другие особенности сборки — как ты сам скажешь. Результаты тоже опубликую.
Здравствуйте, samius, Вы писали:
S>Здравствуйте, IID, Вы писали:
IID>>Здравствуйте, samius, Вы писали:
S>>>Если не секрет, что собрался сравнивать? Интерпретацию?
IID>>Нет конечно C++ вариант соберу Intel C++ Compiler 11.0.072, померяю скорость. Результаты, ключи компиляции и EXE выложу куда-нибудь. C# буду собирать VS2008 (вроде бы SP1, но не уверен). Ключи компиляции, версия CLR/языка, любые другие особенности сборки — как ты сам скажешь. Результаты тоже опубликую.
S>Это не решение задачи.
С точки зрения оценки производительности — нормально. Если я буду рендерить картинку сгенерированным .NET кодом час, а плюсовым — пару минут этого более чем достаточно. Как приду домой — замеряю.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, samius, Вы писали:
S>>Это не решение задачи.
IID>С точки зрения оценки производительности — нормально. Если я буду рендерить картинку сгенерированным .NET кодом час, а плюсовым — пару минут этого более чем достаточно. Как приду домой — замеряю.
Задача не в том чтобы картинку срендерить, а в том, чтобы предоставить интерактивный рендерер/считалку, который позволяет изменять описание поверхностей в рантайме.
То что ты соберешь под Intel C++ Compiler 11.0.072, меня не волнует, пока ты не включить его в свою программу.
G>Ну тупи. "Не всегда быстрее" = "иногда медленее". Сам себе что-то придумываешь, а потом непонятно кому доказываешь.
Примера этого "иногда медленее" я так и не увидел, между прочим.
G>В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
Ой как хорошо. Т.к. мы рассуждаем о .NET-е, то ОЧЕНЬ хочется посмотреть на такую .NET программу, для которой реализация на C++ окажется не самой быстрой. И не заваливайся в сторону "всё другие языки vs C++", мы готоврим только о .NET vs C++.
g> В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
Кстати, а есть таки примеры, где это так? Вроде, где-то в КСВ приводили примеры, я сейчас не найду
g> В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
Кстати, а есть таки примеры, где это так? Вроде, где-то в КСВ приводили примеры, я сейчас не найду
G>>Ну тупи. "Не всегда быстрее" = "иногда медленее". Сам себе что-то придумываешь, а потом непонятно кому доказываешь. IID>Примера этого "иногда медленее" я так и не увидел, между прочим.
Я привел пример в этой теме. Чистая синтетика, о которой ты так мечтаешь.
G>>В итоге по-русски можно написать "сществуют программы, для которых реализация на С++ окажется не самой быстрой", что совсем по-русски звучит как "иногда программы на С++ медленее", а не то что ты придумал.
IID>Ой как хорошо. Т.к. мы рассуждаем о .NET-е, то ОЧЕНЬ хочется посмотреть на такую .NET программу, для которой реализация на C++ окажется не самой быстрой. И не заваливайся в сторону "всё другие языки vs C++", мы готоврим только о .NET vs C++.
Здравствуйте, IID, Вы писали:
IID>Из конкретики — о увеличичении скорости написания кода (могу согласиться). Остальное — вода, зависящая от кучи факторов. Совершенно непонятно, почему код С++ лишается возможности быть качественным, иметь продуманный дизайн, хорошие алгоритмы. арианта.
Он не лишается. Просто добиться того же качества значительно дороже.
Собственно ассемблер дает еще больший простор для оптимизаций и потенциально на нем можно написать более быстрый софт. Но это еще дорожа (причем очень существенно). Посему даже такие богатые компании как MS и IBM не пользуются им.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, vdimas, Вы писали:
V>Я уже не первый раз вижу это мнение, но не могу понять мотивы, может объяснишь? Наилучшие по оптимизации компиляторы — это С++, и они умеют коомпилировать С-код. Вот смысл мне не пользоваться возможностями более высокоуровневого языка, если у мня все-равно будет использован компилятор, который прекрасно компилит оба языка. Смотри: в чистом С ссылочный тип не строго типизирован, нет инлайна, нет инициализации по месту, недоступна ОО-декомпозиция (а в этом миксере участвует около десятка классов, и кое-какая шаблонность есть, правда без претензий на МП) и т.д и т.п. Поэтому поинт не понятен совершенно, по мне С++ в стиле "С с классами" все равно гораздо мощнее С. Я бы советовал ровно наоборот, там где можно, вместо С использовать С++.
Если меня память не подводит, он утверждал что применение шаблонов тормозит скорость выполнения
Здравствуйте, Anton Batenev, Вы писали:
AB>Вот тут все про моно да про моно. Но хоть бы кто-нибудь показал мастер-класс на оном, а то складывается впечатление, что его защитники видели его только на картинках, а те, кто его пользовал, молчат, дабы не было стыдно.
Что ты хочешь увидеть?
Компилятор Nemerle параллельно живет под двумя рантаймами: Mono и .Net. Можешь загрузить и скомпилировать. Это подойдет для "просмотра"?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Собственно ассемблер дает еще больший простор для оптимизаций и потенциально на нем можно написать более быстрый софт. Но это еще дорожа (причем очень существенно). Посему даже такие богатые компании как MS и IBM не пользуются им.
Ассемблер сейчас дает меньший простор, кроме нескольких узких случаев, и даже для них удобнее править выхлоп сишного компилятора.
К тому же ассемблер средство другого класса, трудоемкость разработки на нем (даже учитывая чудеса макроассемблеров) на порядок ниже чем на C++. Шарп и С++ по трудоемкости разработки в одном классе.
Здравствуйте, VladD2, Вы писали:
VD> Что ты хочешь увидеть?
Мастер-класс, я же написал
VD> Компилятор Nemerle параллельно живет под двумя рантаймами: Mono и .Net. Можешь загрузить и скомпилировать. Это подойдет для "просмотра"?
Nemerle — это тот же моно, только в профиль. Но, почему-то, развивать с тобой дискуссию в этом направлении у меня нет никакого желания. Откланиваюсь заранее.
Здравствуйте, IID, Вы писали:
IID>Можно пример программы на .NET, которую невозможно будет обогнать программой на С++ ?
Вопрос в принципе не корректен, так как язык сам по себе не может быть быстрее или медленнее. Скажем Борлондовские компиляторы С++ в большинстве случаев порождают код более медленный чем MS .Net.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, gandjustas, Вы писали:
G>>Я имею ввиду не использование компилятора С, а неиспользование возможностей C++ — классов, шаблонов, динамической памяти и прочего. G>>Для числомолотилок оно и не нужно.
FR>Шаблоны и классы нужны, позволяют получить более шустрый код чем чистый си.
Здравствуйте, VladD2, Вы писали:
VD>Ну, а главное, что есть софт который в условиях ограниченных ресурсов вообще нельзя реализовать на С++ (костьми ляжешь).
Оно же верно и для шарпа, поэтому я на него так и не перешёл
Игры, кроссплатформенные приложения, некоторые виды миддлеваре
Здравствуйте, IID, Вы писали:
IID>P.S.: подсказка: сам CLR написан на C/С++, и скорость выполнения .NET кода это, в определённом смысле, скорость выполнения некоторой С++ программы. Которую всегда можно, как минимум, не замедлить.
Замечательная логика! Точнее ее полное отсутствие.
Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
Бред? Несомненно! Но это твой бред .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, IID, Вы писали:
IID>Отвечу в этом месте обоим: JIT связан по рукам и ногам временными ограничениям. У С++ компилятора свободы (времени) гораздо больше. Насколько я понимаю, кода никто не приведёт, и можно засчитывать слив ?
А чем связан NGEN? (погугли прежде чем отвечать).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Anton Batenev, Вы писали:
VD>> Компилятор Nemerle параллельно живет под двумя рантаймами: Mono и .Net. Можешь загрузить и скомпилировать. Это подойдет для "просмотра"? AB>Nemerle — это тот же моно, только в профиль. Но, почему-то, развивать с тобой дискуссию в этом направлении у меня нет никакого желания. Откланиваюсь заранее.
Не, ну это как-то не хорошо с твоей стороны. Получается ты просто игнорируешь реальные примеры. Зачем тогда спрашивать
Здравствуйте, VladD2, Вы писали:
VD>Но вот тебе забавный пример в тему: VD>http://tirania.org/blog/archive/2008/Nov-03.html
VD>Ну, а главное, что есть софт который в условиях ограниченных ресурсов вообще нельзя реализовать на С++ (костьми ляжешь).
Неубедительно учитывая горячую любовь игроделов к интеловскому компилятору, который подобные вещи хорошо векторизует, плюс не менее горячую любовь к интрисикам тех игроделов которые не любят интеловский компилятор
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, gandjustas, Вы писали:
FR>>>Шаблоны и классы нужны, позволяют получить более шустрый код чем чистый си. G>>Пример? FR>std::sort vs qsort
Как шаблоны как compile-time кодогенерация действительно хорошо работает. Я там образом оптимизировал библиотеку для нейронных сетей на крусовую.
В принципе runtime кодогенерация позволяет даже больше, но с большими усилиями.
А классы каким образом позволяют получить более быстрый код, на примере числомолотилки типа md5?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, IID, Вы писали:
IID>>Не уводите тему в сторону. Мы сейчас рассуждаем только о скорости получившегося кода.
VD>А тебе о скорости получаемых приложений. Она определяется не только, да и не столько скоростью выполняемого кода сколько качеством и скоростными характеристиками используемых алгоритмов.
Возьмём два абсолютно идентичных алгоритма. Что теперь у нас со скоростью ?
Здравствуйте, Anton Batenev, Вы писали:
VD>> Что ты хочешь увидеть?
AB>Мастер-класс, я же написал
Это типа попрограммировать на публике чтобы все рты по открывали?
VD>> Компилятор Nemerle параллельно живет под двумя рантаймами: Mono и .Net. Можешь загрузить и скомпилировать. Это подойдет для "просмотра"?
AB>Nemerle — это тот же моно, только в профиль. Но, почему-то, развивать с тобой дискуссию в этом направлении у меня нет никакого желания.
А что развивать-то? Ты сморизил чушь. К Моно он отношения не имеет... кроме того, что под ним может работать.
AB>Откланиваюсь заранее.
Да, давно пора. Слив, с твоей стороны, уже произошел. Что еще обсуждать?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, criosray, Вы писали:
C>Не тратьте время. Они все-равно будут верить только в то, во что хотят верить. Переубедить их сможет только жизнь.
А как же трофеи?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>Ассемблер сейчас дает меньший простор, кроме нескольких узких случаев, и даже для них удобнее править выхлоп сишного компилятора.
VD>Это чушь. По той же логике, что предъявляют фанаты С++ ассемблер как раз дает больше возможностей для оптимизаций. Например, самые новые инструкции можно заюзать и т.п. Когда там компиляторы до них подтянутся.
Логика таже только ступенька на порядок выше.
FR>>К тому же ассемблер средство другого класса, трудоемкость разработки на нем (даже учитывая чудеса макроассемблеров) на порядок ниже чем на C++.
VD>О том я и говорил. Именно трудоемкость. То есть приципиально повышения производительности добиться конечно можно, но если сравнить затраты и получаемый выхлоп мало кого это заинтересует.
FR>>Шарп и С++ по трудоемкости разработки в одном классе.
VD>Это чушь. Трудоемкость на С++ выше очень значительно. Разница не такая огромная как в сравнении С++ и ассемблера, но тоже очень велика. А если учесть, что есть языки сильно мощнее C#, то она уже становится очень значительной. При этом с точки зрения скорости, для большинства задач разница как раз не велика (если вообще есть).
Разница принципиальная между ассемблером и ЯВУ это порядок, внутри майнстримовых языков в лучшем случае разы.
VD>Посему если у тебя много бабла (проект высоко рентабельный), то С++ может быть подходящим, так как увеличение трудоемкости окупается конкретными преимуществами — меньшими требованиями к ресурсам компьютера, а значит расширением базы аудитории. Если же проект низкотиражный или вообще штучный, то разработка на С++ — это чистейшей воды идиотизм и бездарная трата ресурсов.
Зависит еще от размеров проекта, его сферы применения и квалификации исполнителей.
Здравствуйте, VladD2, Вы писали:
VD>Подлог! Это разные алгоритмы.
Да ладно меряли уже не раз, даже если писать шаблоный qsort один в один с сишным плюсовый все-равно выигрывает, за счет агрессивного инлайнинга.
VD>Кстати, на пример C vs. C++ можно можно спроецировать все сказанное о C++ vs. C#. Ведь на С всегда можно написать код не медленнее чем на С++. Проблема только в трудоемкости.
Можно, и кстати не мало пишут, но опять таки разница между C++ и Си тоже не так велика, хотя и больше чем между С++ и шарпом.
Здравствуйте, NikeByNike, Вы писали:
NBN>А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами.
Скажи это заказчикам.
FR>>Функторы в виде классов лучше инлайнятся чем свободные функции. Хотя современные компиляторы уже и одиночные функции инлайнить умеют, но функторы все-равно позволяют большую гибкость не теряя в скорости.
VD>Махровый бред! VD>Не потрудишься его обосновать?
Здравствуйте, samius, Вы писали:
NBN>>А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами. S>Скажи это заказчикам.
Нормальным заказчикам мелкие программерские дрязги вообще пофигу.
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, samius, Вы писали:
NBN>>>А уж разница в скорости разработки конечного продукта вообще становится малоактуальна по сравнению с другими факторами. S>>Скажи это заказчикам. NBN>Нормальным заказчикам мелкие программерские дрязги вообще пофигу.
я не про дрязги, а про скорость разработки.
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, VladD2, Вы писали:
FR>>>Неубедительно учитывая горячую любовь игроделов к интеловскому компилятору, который подобные вещи хорошо векторизует, плюс не менее горячую любовь к интрисикам тех игроделов которые не любят интеловский компилятор
VD>>Кстати, рассуждения о любви подкреплены какой-то статистикой или как всегда высасывание из пальца?
FR>Влад ты перестал пить коньяк и бить жену по утрам?
Что вопрос о статистике некорректен? Я же прошу ответить "да" или "нет". Я прошу ссылки на информацию о том какие игры (особенно топовых) скомпилированы с использованием каких компиляторов?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gandjustas, Вы писали:
G>Я имею ввиду не использование компилятора С, а неиспользование возможностей C++ — классов, шаблонов, динамической памяти и прочего. G>Для числомолотилок оно и не нужно.
Во-первых, ты так и не объяснил мотивы, во-вторых, без нормального инлайна любая числомолотилка отсосет. Вот возьми класс complex, не представляю себе код для него без переопределённых инлайн операций. Вызывать что-ли ф-ии типа complex_add_double(arg1, arg2)? Это будет уже не числомолотилка, а тормозилка.
Здравствуйте, gandjustas, Вы писали:
V>>Ты еще забыл кодеки, мультимедиа, реалтайм протоколы и т.д. И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ
G>Ну да, всего-то научились инлайнить вызовы со структурами, а также ускорили работу GC, несмотря на то что версия CLR не поменялась.
Угу, версия метаданых не изменилась, а на самом деле, и либы подшаманили нехило (и не только в приватной реализации, местами в публичных интерфейсах), и рантайм подкрутили. Согласен, GC стал более шустр, заметно что теперь он практически незаметен.
G>С учетом этих ускорений код на .NET, который проигрывал плюсовому в 1,5-2 раза стал выигрывать у плюсовго по скорости. G>И это даже бех перекомпиляции программ.
Это от сценариев зависит, там, где была нагрузка на GC, общая производительность действительно выросла. Лично я ожидал оптимизаций по доступу к массивам, тем более, что о возможностях подобной оптимизации JIT-компилятора тогда не говорил только ленивый, однако никаких изменений в этом плане не было, поэтому на числомолотилках C# продолжает сосать.
Это да сильно субъективно.
FR>>Разница принципиальная между ассемблером и ЯВУ это порядок, внутри майнстримовых языков в лучшем случае разы.
VD>Между С++ и теми же Немерле или Хаскель тот же порядок. Конечно если всеми тремя инструментами хорошо владеть.
В общем да приближается, хотя по моему все таки чуть меньше.
VD>С другой стороны это уже сближение позиций. Разница уже заключается только в оценке степени превосходства в уровне и отстования в скорости. Так?
Так оно всегда только в этом было.
Просто сейчас у меня нет старого пыла отстаивать С++ да и у тебя C# не в фаворитах
Ну и следует учесть что когда мы ругались C# (еще 1.x) был сильно слабее современного.
FR>>Зависит еще от размеров проекта, его сферы применения и квалификации исполнителей.
VD>От размеров конечно зависит. Чем больше проект, тем менее рентабельно реализовывать его на С++.
Угу, до опреденных размеров, у монстров уже язык мало что значит.
VD>От сферы не зависит. По крайней мере я эту зависимость не ощущаю. Квалификация вообще показатель отдельный. Сравнивать нужно только при условии, что квалификация идентична. Иначе к затратам нужно прибавлять затраты на обучение или формирование новой команды разработчиков.
От сферы сильно зависит, про драйверы и ядерные ректоры не будем, но коробочный софт что мелкий (шараварки) что крупный до сих пор выгоднее делать на нативных языках.
Квалификация для C++ более важна, так как порог вхождения достаточно высок.
Здравствуйте, VladD2, Вы писали:
FR>>Влад ты перестал пить коньяк и бить жену по утрам?
VD>Что вопрос о статистике некорректен? Я же прошу ответить "да" или "нет". Я прошу ссылки на информацию о том какие игры (особенно топовых) скомпилированы с использованием каких компиляторов?
Влад я уже несколько лет не занимаюсь играми, но на любом игродельческом форуме интеловский компилятор был одной из любимых и постоянных тем. Также как и любая оптимизация, использование интрисиков это вообще норма.
Здравствуйте, criosray, Вы писали:
ГВ>>Ух ты! А я-то думал, что мокинг нужен для отслеживания последовательности внешних вызовов. C>Неправильно думали. Мокинг нужен в первую очередь для изоляции тестируемого объекта. Чтоб сделать возможной эту изоляцию возможной необходимо симулировать поведение внешних зависимостей тестируемого объекта.
Mocks [...] objects pre-programmed with expectations which form a specification of the calls they are expected to receive.
Моки — запрограммированы на ожидание вызовов в соответствии с определённой спецификацией. (Буквально: формируют спецификацию своими ожиданиями)
Где сказано, что мок обязательно изолирует тестируемый объект от окружающих?
C>>>Ассерты это всего-лишь предикат, который по-определению всегда true.
C>>>Assert.Equals(10, someObj.SomeIntProperty); C>>>Assert.IsTrue(someObj.SomeBoolProperty); C>>>и т.д. и т.п.
ГВ>>А по-твоему, Expect — это не тот же самый Assert в профиль? Assert — утверждение, Expect — утверждение о некотором ожидаемом событии. Тот же Assert, только специализированный. C>К чему вопрос?
К тому, что Expect так или иначе должен превратиться в Assert. Сделает это кодогенератор или ещё что-то — не важно.
C>>>Ассерты и моки не цель. Это средство и ключевой механизм реализации юнит тестов. ГВ>>Любое автоматическое тестирование сводится к проверке последовательности утверждений. Иначе оно совсем не нужно. Дальше только вариации способов записи этих утверждений. C>Само собою. Весь этот спор о том, что на С++ нет даже близко сравнимых по удобству инструментов для тестирования.
Ну, если сводить "удобство тестирования" к автоматической генерации пустых объектов — соглашусь. А если не сводить, то тут очень сильно бабка надвое сказала.
ГВ>>vdimas прав в том смысле, что если логика достаточно сложная, то и полные тесты достаточно трудно записывать. Вот тебе простейший пример (псевдокод): C>И что тут сложного?
А я и не говорю, что это сложно. Я о сопоставлении сложности теста и тестируемого кода.
C> Элементраный тест (в условиях дотнет) с условно установленными моками.
Мммм... Дотнет его сам сгенерирует? Полностью? А за пивом он сгоняет?
[...]
ГВ>>То есть нужно проверить, что указанные сообщения ушли по заданным каналам, и только после определённого входного сообщения, и только в указанной последовательности, а потом ещё и желательно выдать осмысленное сообщение об ошибке.
C>Вы опять же путаете модульные тесты с интеграционными тестами. Модульные тесты не тестируют работу сети/жесткого диска/клавиатуры/мыши и т.д. Модульные тесты не тестируют взаимодействие подсистем. ит.д. и т.д. Короче, разберитесь в вопросе для начала, ок?
Даже если говорить о приведённом примере, то где здесь тестирование сети/жёсткого диска/...? Тестируется соответствие реального и предполагаемого протокола работы (form a specification, итить!). Или ты думаешь, что под sendMessage имеется в виду send в сокет?
А потом, модульным тестированием называется тестирование модулей. Что именно мы так называем — зависит от структуры программы. Запросто может быть тестирование модуля по имени "модуль сетевого интерфейса", который запросто может предполагать одновременный запуск тестов на нескольких машинах и в то же время другой модульный тест может проверять одну-единственную функцию. Если TDD предполагает, что это неправильное употребление термина "модульное тестирование", то тем хуже для самого TDD.
C>>>Еще один ликбез: описанное Вами не является модульными тестами. Это т.н. integration tests. ГВ>>Это зависит от того, что в данной конфигурации полагается модулем, а что — интеграцией. Поскольку структура любой сложной программы иерархическая, то модуль на одном уровне — это сборная конструкция на другом. C>Нет, не зависит. RTFM, как говорится.
Какой M нужно R?
ГВ>>И неужто будет проще, чем аналогичная заглушка? Это если учесть, то заглушка реализуется в естественном синтаксисе, а мок — перехватом вызовов. Второе будет почти гарантированно сложнее. C>С этой глупостью я даже спорить не стану.
Не спорь.
V>>>>В декларативном синтаксисе мокков это выглядит как удаление гландов через Ж, и чем осмысленнее логика — тем более глубокое погружение в эту Ж. А если процедура внешняя, то это лишняя тестирующая сущность и все такое. C>>>Демагогия. ГВ>>Боюсь, что реальность. Хотя я в курсе, разумеется, что самая надёжная основа своей позиции — искусное отрицание очевидного. C>Можете продолжать бояться. Как все-таки доберетесь до RTFM`а, то поймете, что я был прав.
О! Я прозрю истину. Ну дай же мне волшебный мануал! Я буду его R, R и ещё раз R.
ГВ>>Угу. А ещё программы должны быть простыми. Это и называется искать решение сложных проблем простыми средствами, сиречь — руководствоваться лозунгами.
C>Да, тестируемые участки кода должны быть простыми. В этом суть дизайна под названием Test Driven Development. Используя алгоритм write failing test -> write code -> until test succeed -> refactor ... добиваемся прекрасного качества кода с соблюдением всех правил современного программирования: DRY, SRP, и т.д. Если Ваш код на столько сложный и запутанный, что Вы не можете написать серию простых тестов для него, значит Ваш код — плохой. Вот Вам и пища для размышлений.
А если пользователь поставил задачу, которая не имеет простого решения? Значит, я не смогу написать простой тест и не смогу руководствоваться современными правилами программирования?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, FR, Вы писали:
FR>Влад я уже несколько лет не занимаюсь играми, но на любом игродельческом форуме интеловский компилятор был одной из любимых и постоянных тем. Также как и любая оптимизация, использование интрисиков это вообще норма.
Мне кажется надо отделять треп на форумах и реальное применение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hattab, Вы писали:
H>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами.
Уважаемый, ты точно правильно понимаешь значение слова компилятор?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, FR, Вы писали:
FR>>Влад я уже несколько лет не занимаюсь играми, но на любом игродельческом форуме интеловский компилятор был одной из любимых и постоянных тем. Также как и любая оптимизация, использование интрисиков это вообще норма.
VD>Мне кажется надо отделять треп на форумах и реальное применение.
Так я вполне разделяю, лень просто статистику искать, из этого трепа вполне ясно что Intel'овский широко используется игроделами, мы не использовали, но интрисики и тотальную оптимизацию применяли широко, так что и у нас не было бы массива double в std::vector
Здравствуйте, hattab, Вы писали:
VD>>Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
H>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами.
О! Еще один перл в коллекцию. Второй за сегодня. Спасибо!
Здравствуйте, vdimas, Вы писали:
G>>С учетом этих ускорений код на .NET, который проигрывал плюсовому в 1,5-2 раза стал выигрывать у плюсовго по скорости. G>>И это даже бех перекомпиляции программ.
V>Это от сценариев зависит, там, где была нагрузка на GC, общая производительность действительно выросла. Лично я ожидал оптимизаций по доступу к массивам, тем более, что о возможностях подобной оптимизации JIT-компилятора тогда не говорил только ленивый, однако никаких изменений в этом плане не было, поэтому на числомолотилках C# продолжает сосать.
Проснись, оптимизация дотупа к массивам давно сущесвует.
В цикле такого вида JIT выкидывает проверки границ
for(int i=0; i<array.Length; i++)
{
}
Если нужет произвольный быстрый доступ, то есть unsafe.
Что касает числомолотилок, то в самых тупых линейных случаях (как md5 например), при использовании uncheked, .NET будет проигрывать на проценты. Что в реальной программе погоды не сделает.
Кроме того такие случаи элементарно оптимизируются заменой на Сшный код или распараллеливаются (в .NET далется очень легко).
ЗЫ. Я ещ не упоминул такие оптимизации, которые делает mono. См Mono.Simd
Здравствуйте, samius, Вы писали:
VD>>>Из этой предпосылки можно сделать вывод, что если написать компилятор, скажем, С на Руби, то получаемые программы будут иметь "в определенном смысле" (не знаю что за этим скрывается) скорость Руби (т.е. будут тормозными).
H>>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами. S>Из чего сделано выделенное предположение?
Это не предположение, это этакая параллель... .NET core библиотеки-то насквозь C++'сные.
S>Что мешает компилятору на Руби выдавать под LLVM, или сразу в машинные инструкции?
Здравствуйте, VladD2, Вы писали:
H>>Ну, если исполняющей средой для таким образом скомпилированных приложений будет выступать Руби, то таки да, логично, что они будут тормозами.
VD>Уважаемый, ты точно правильно понимаешь значение слова компилятор?
Не сомневайся. Но вот о чем следует подумать, так это о том, что исполняющийся код будет работать не в вакууме. Или вы тут копья ломаете по поводу перформанса кода вида "x + y"?
Здравствуйте, hattab, Вы писали:
H>Это не предположение, это этакая параллель... .NET core библиотеки-то насквозь C++'сные.
Да, ну? А почему 99% из них декомпилируется Рефлектором?
S>>Что мешает компилятору на Руби выдавать под LLVM, или сразу в машинные инструкции?
H>Ничего не мешает.
Ну, так ты понял, что спорол чушь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, hattab, Вы писали:
H>Не сомневайся. Но вот о чем следует подумать, так это о том, что исполняющийся код будет работать не в вакууме.
Думаю понятие вакуума к коду вообще не применимо. Код будет исполняться процессором.
В остальном есть такие вещи как бутсрапинг. Слышал про такое?
H>Или вы тут копья ломаете по поводу перформанса кода вида "x + y"?
Да, в общем-то любой код состоит из ряда примитивных операций.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
H>>Это не предположение, это этакая параллель... .NET core библиотеки-то насквозь C++'сные.
VD>Да, ну? А почему 99% из них декомпилируется Рефлектором?
mscoree.dll — Microsoft .NET Runtime Execution Engine
mscorwks.dll — Microsoft .NET Runtime Common Language Runtime — WorkStation
normalization.dll — Microsoft Unicode Normalization
Вполне себе нативные, корковые библиотеки...
S>>>Что мешает компилятору на Руби выдавать под LLVM, или сразу в машинные инструкции?
H>>Ничего не мешает.
VD>Ну, так ты понял, что спорол чушь?
Здравствуйте, VladD2, Вы писали:
H>>Не сомневайся. Но вот о чем следует подумать, так это о том, что исполняющийся код будет работать не в вакууме.
VD>Думаю понятие вакуума к коду вообще не применимо. Код будет исполняться процессором.
Да. А еще он будет исполняться в окружении нативных модулей и с их участием.
VD>В остальном есть такие вещи как бутсрапинг. Слышал про такое?
Ага. Используется?
H>>Или вы тут копья ломаете по поводу перформанса кода вида "x + y"?
VD>Да, в общем-то любой код состоит из ряда примитивных операций.
Так вы тут эти примитивные операции чтоль обсуждаете?
Здравствуйте, Anton Batenev, Вы писали:
AB>Думаю, что их как раз есть. Они-то и плюются на моно. А вот защищают его те, кто на нем даже hello word не сотворил, ИМХО. Вот этим защитникам я сначала и предлагаю попробовать написать на нем что-то вменяемое и, если не произойдет промывания желудка, защищать его, так сказать, уже во всеоружии. Моя уверенность строится на том, что после C# я пытался подходить к этому снаряду под линуксом уже раз не помню сколько — с каждым разом Qt мне нравится все больше и больше по сравнению с ним.
Ну я учавствовал в паре довольно крупных проектов на моно, дальше что?
Здравствуйте, criosray, Вы писали:
C>Не тратьте время. Они все-равно будут верить только в то, во что хотят верить. Переубедить их сможет только жизнь.
NBN> VD>От уровня языка зависят и проектные решения NBN> Чушь.
Действительно чушь — что использовать. Готовый gen_server из поставки языка или написать свой аналог за 3-4 дня (Erlang) или искать специалиста, который аналог этого будет полгода лабать на С++
V>>Если предположить, что ты общался с запрограммированным искуственным интеллектом, то этим вопросом ты разрушил его электронный моск.
ГВ>Рассмотрю предложение на вакансию Тьюринг-тестера.
Похоже, ты смылся, поэтому поставлю точку сам.
C>>>Пример классического ламеризма. Может стоило бы для начала что-то узнать о предмете обсуждения? Например, что версия CLR все еще 2.0.х, а не 3.0
Да, версия стандарта 2.0.x (т.к. формат метаданных не поменялся), а название стандарта ты озвучил. Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание.
То, что ты совершенно не в курсе об постоянных обновлении рантайма и .Net сборок и о характере этих обновлений — это понятно, но поверь, абсолютно не смертельно. Что непонятно, так это твоя реакция: неужели настолько смертельным было то, что ты предположил? И что будешь делать сейчас? Посыпать голову пеплом?
C>Вы даже не знаете разницы между фреймворком и CLR. Продолжайте писать в таком же духе — это становится очень забавно.
Идиотская манера, надо сказать, выдумать нечто, приписать оппоненту и с треском разбить. В предыдущих сообщениях слово "CLR" я не употреблял и не собирался, т.к. речь шла об обещанных изменениях в рантайме, приуроченных к выходу некоего очередного фреймворка. В общем... потренируйся понимать прочитанное.
C>Ламеризм это когда человек делает много громких заявлений, имея очень слабое представление о предмете обсуждения. То, что мы и наблюдаем в Вашем случае.
Кто тут имеет слабое представление, понятно-то давно. Мне лишь непонятна эта тяга везде найти ламеров вокруг себя. Так все плохо?
Здравствуйте, vdimas, Вы писали:
V>Похоже, ты смылся, поэтому поставлю точку сам.
C>>>>Пример классического ламеризма. Может стоило бы для начала что-то узнать о предмете обсуждения? Например, что версия CLR все еще 2.0.х, а не 3.0
V>Да, версия стандарта 2.0.x (т.к. формат метаданных не поменялся), а название стандарта ты озвучил. Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание.
Вам не надоело самого себя "опускать"? В который раз доказали, что Вы банально не понимаете разницы между фреймворком и CLR.
Ликбез: версия CLR не менялась со времен дотнет 2.0 — v2.0.50727.
Жду публичного признания своей неправоты, уважаемый.
Здравствуйте, NikeByNike, Вы писали:
NBN>Суммарная скорость разработки крайне мало зависит от выбранного высокоуровневого языка.
И зачем тогда на 1С пишут? (возможностей то мало, но и их хватает большинству хватает)
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, vdimas, Вы писали:
V>Да, версия стандарта 2.0.x (т.к. формат метаданных не поменялся), а название стандарта ты озвучил. Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание.
Ну т.е. в принципе, при наличии двух сервис-паков, Photoshop CS2 можно смело назвать Photoshop CS4???
AB> * А пока что я вижу фаната-Влада, который носится с Nemerle как с писаной торбой; AB> * Я вижу сайт RSDN, который в течении полутора (или уже больше?) месяцев периодически или ложится или выдает HTTP-500 или тормозит безбожно; AB> * Я вижу насквозь сишный юниксойдный nginx, который поставили для латания брешей, с которыми не справляется IIS и начинка, и который бог знает сколько пытались настроить (хоть спасибо за сжатие — всего каких-то 740 килобайт сишного кода решили проблему, которую так долго не могли решить на IIS и Co); AB> * Я вижу лежащий уже с несколько недель поиск, который мало того, что лежит, так еще находится на стороннем ресурсе; AB> * Я вижу AndrewVK, который отдувается за всю команду и боится трогать код сайта от греха подальше (и в чем-то я его понимаю); AB> * Я вижу в форумах сообщения о том, что "безопасный" код сайта боятся открывать потому что в нем много дыр; AB> * Я вижу неработающие ссылки, которые отваливаются по таймауту и некому и нечему (и нечем, судя по всему) просматривать логи; AB> * Я не вижу Янус... впрочем, это уже другая история.
Здравствуйте, gandjustas, Вы писали:
G>Ты о чем? Исходники md5 отлично собираются голым C компилятором.
Сишная имплементация MD5 собирается сишным компилятором.
С++сная не собирается
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, criosray, Вы писали:
C>А необходимость возникает только тогда, когда продакшн билд начинает течь, как дырявое решето?
И часто такое у вас?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, gandjustas, Вы писали:
G>>Ты о чем? Исходники md5 отлично собираются голым C компилятором. CC>Сишная имплементация MD5 собирается сишным компилятором. CC>С++сная не собирается
Отсюда брал — http://www.md5hashing.com/c++/
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>В общем ладно, может тут и моя вина, что не описал контекст, поэтому не понимаю твоего сопротивления очевидным, на мой взгляд, вещам.
V>В общем, сервер конференций, видео, VoIP и вся лабуда типа шаринга приложений и прочие примочки.
Все правильно, такой набор писать на дотнете — нужно быть на редкость упертым. Дотнет для таких вещей просто не предназначен.
Может быть оно конечно и можно выжать из дотнета требуемую производительность (это не утверждение), но стоить это будет дороже, чем разработка на C++.
Естественно, в таком контексте выбор очевиден. По крайней мере для высоконагруженных сервисов.
Здравствуйте, criosray, Вы писали:
C>В который раз доказали, что Вы банально не понимаете разницы между фреймворком и CLR.
Цитаты?
C>Ликбез: версия CLR не менялась со времен дотнет 2.0 — v2.0.50727.
Офигенный ликбез, судя по обширности представленного материала.
Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов.
В принципе, я тебе уже говорил, но мне не лень напомнить: перед выходом третьего фремворка тут шли обсуждения, какие будут изменения в рантайме (не в версии, а реализации, еще не допер разницу?). И некоторые из них были таки произведены: джиттер стал более агрессивно инлайнить, GC стал вовсе незаметен на глаз, но кое-что из обсуждаемого так и осталось без изменений, о чем я и упомянул... а ты развел такую вот непотребную бодягу.
C>Жду публичного признания своей неправоты, уважаемый.
Сформулируй для начала эту неправоту.
И раз ты так усердно цепляешься за версию CLR, то вот тебе домашнее задание: что есть версия CLR? Рекомендую выполнить его тщательно, дабы этот позор тугодумия не тянуть еще на кучу постов.
Здравствуйте, vdimas, Вы писали:
V>Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов.
Короче это. Не сошлись вы в том, что один понял 3.0 как версию CLR, другой говорил о CLR, который шел вместе с 3-м FW. Вот и всё, рабочие моменты Кстати, я пару раз на собеседованиях слышал, что некоторые так и не перешли на третий FW, потому что ждут полноценно нового рантайма.
Здравствуйте, samius, Вы писали:
S>Все правильно, такой набор писать на дотнете — нужно быть на редкость упертым. Дотнет для таких вещей просто не предназначен. S>Может быть оно конечно и можно выжать из дотнета требуемую производительность (это не утверждение), но стоить это будет дороже, чем разработка на C++.
А у нас вовсе не целиком на C#. Все высокоуровневые операции — на .Net (там же сценарии по установке связи, редиректу, общение с менеджером и БД и куча всякой подобной хни). А вот на пути агрессивного потока данных лежит нейтив, и я здесь лишь объяснял, почему именно так.
S>Естественно, в таком контексте выбор очевиден. По крайней мере для высоконагруженных сервисов.
А сервис весьма разнороден по характеристикам своих составляющих. Например, видео серваком не обрабатывается, а только пересылается из канала в канал, и скорость показа 8-16 кадров в сек, почему бы не сделать тупую диспетчеризацию потока видео на .Net? То же самое с кучей других апплетов, типа шаринга приложений, общей доски, чата, голосований и т.д. Я уже молчу о задачах аутентификации пользователей, шедуллинга конференций и прочего, прочего, прочего. На С++ всё это можно было бы, разумеется, но не нужно.
Поэтому, основа системы — на дотнет, и прилично рядом кода на нейтив С++. В общем, я не зря говорю, что с интеропом здесь вряд ли кто больше меня возился.
Здравствуйте, vdimas, Вы писали:
V>Поэтому, основа системы — на дотнет, и прилично рядом кода на нейтив С++. В общем, я не зря говорю, что с интеропом здесь вряд ли кто больше меня возился.
У нас соотношение managed/native порядка 250/1. Интеропа почти нет. На плюсах написан только самый агрессивный алгоритм из тех что выполняются на клиентской машине в интерактивном режиме (устранение искажений дисторсии большого снимка порядка 40Мб). На дотнете кончилась фантазия по выдумыванию как его ускорить, тупое переписывание один в один на плюсы дало ускорение в 1.5 раза. Сервер же числорубит на дотнете.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>В общем ладно, может тут и моя вина, что не описал контекст, поэтому не понимаю твоего сопротивления очевидным, на мой взгляд, вещам.
V>В общем, сервер конференций, видео, VoIP и вся лабуда типа шаринга приложений и прочие примочки. Основная реалтаймовая и одновременно нагрузочная вещь — это именно VoIP, остальное реалтаймом можно назвать лишь условно. Что есть VoIP: это 50 пакетов в секунду на абонента в одну только сторону, т.е. итого 100 пакетов на абонента. Железка должна держать их несколько сотен, желательно под тысячу. В общем, у меня такой сценарий, что я даже не могу позволить себе такую мелочь, как лишнее копирование данных и тем паче ни о каких 100тыс выделений буферов в секунду не может быть и речи.
В таком случае буферы надо вделять один раз на на абонента. А еще лучше сделать пул буферов.
G>>Как это "априори неизвестен"? покажи мне API которые возвращают "незивестно сколько данных". V>Оно не возвращает, оно читает из сокета в наш предвыделенный буфер. После прочтения возвращает кол-во прочитанных байт. В пакете заголовок и собственно сами данные с неким смещением (зависит от заголовка). Данные обрабатываются прямо из этого буфера по указанной выше причине.
Так всетаки известно сколько данных.
G>>В таком случае надо большие буферы выделять в саом начале и кратковременно их пиннить. Известный рецепт. V>Там в среднем 6 буферов на абонента, под миллион пинов в секунду — это даже на моей "сиротской" железке просто так выкинуть около 15% производительности.
Пины сами по себе производительность не сажают. Сажается она лишь потому что пины мешают работе GC. Если запиненные блоки попадают в нулевое поколение, то gc начинает работать неэффективно.
G>>Ну если это FIR-фильтрили что-то в том роде, то не думаю что накладные расходы доступ по индексу окажутся значимыми по сравнению с наложением фильтра. V>Обычная там фильтрация, ФНЧ/ФВЧ, алгоритм рекурсивного фильтра примитивен — это просто вычисление многочленов z1*a1+z2*a2+z3*a3+..., zi — элементы последовательности, ai — константы. Думаешь, я тебе вру о том, что затраты на доступ к массиву сопоставимы с полезными вычислениями?
Так это и есть обычный FIR, надо будет тесты написать насколько хреново он работает в .NET.
G>>Еще раз перечитай что я писал. "уменьшить гранулярность блокировок" это как раз попытка гоняться за каждым. V>Да почитал, почитал. Сейчас я тебе контекст обрисовал, ты и сам видишь, что дополнительно параллелить там нечего. Вся система асинхронная, по приходу UDP-пакета стоит задача максимально быстро его обработать и освободить тред для следующего. Кол-во таких VoIP-тредов сейчас в 4-6 раз больше, чем ядер, еще больше делать смысла нет, т.к. производительность больше не растет.
В вашем случае нужна система на базе асинхронных агентов, работающих с асинхронным IO.
G>>Ты лучше пересмотри свой взгляд на создание высоконагруженных систем. Например с либой типа CCR можно вообще без блокировок обходится при любом количестве входящих запросов V>Прежде чем советовать что-либо пересмотреть, неплохо бы выяснить как оно сейчас есть... нет?
Не обязательно. Рецепт производства хороших hiload систем уже давно известен.
V>Чтобы два раза не ходить, скажу что по максимум и это у нас есть, кроме тех сценариев, для которых безблокировочные алгоритмы еще не придуманы. Если быть более точным — то некоторые существующие просто не всегда подходят, ввиду требований выделения динамической памяти для каждой порции данных.
Ну если выделенная память живет недолго, то в под .NET можно и выделять. Хотя это уже в конкретных случаях тестить надо.
Здравствуйте, MxKazan, Вы писали:
V>>>Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов. MK>И для порядку, так сказать: MK> MK>из презенташки Микрософта по 2010-й Студии...
vdimas: Я все еще жду от Вас публичных извинений и признания неправоты...
Здравствуйте, vdimas, Вы писали:
MK>>- Изначально ты написал: "И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ". MK>>- На что получил ответ, что рантайм по прежнему 2.0, что он не менялся со времен второго дотНета, ну нету CLR 3.0 и всё.
V>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например?
Здравствуйте, gandjustas, Вы писали:
G>>>Как это "априори неизвестен"? покажи мне API которые возвращают "незивестно сколько данных". V>>Оно не возвращает, оно читает из сокета в наш предвыделенный буфер. После прочтения возвращает кол-во прочитанных байт. В пакете заголовок и собственно сами данные с неким смещением (зависит от заголовка). Данные обрабатываются прямо из этого буфера по указанной выше причине. G>Так всетаки известно сколько данных.
Ну да, залили в буфер и нам известно сколько в нем прочитанных байт, мы это кол-во в _buffLen и храним.
Я действительно так непонятно выражаться стал, что из предыдущего не понял?
G>Так это и есть обычный FIR, надо будет тесты написать насколько хреново он работает в .NET.
Разве рекурсивный фильтр это FIR? В том сообщении я характер вычислений привел, а не всё целиком. Хотя, это не суть, просто БИХ, ИМХО, более экономные по вычислениям и сами вычисления не зависят от отношения частот семплов и среза.
V>>Да почитал, почитал. Сейчас я тебе контекст обрисовал, ты и сам видишь, что дополнительно параллелить там нечего. Вся система асинхронная, по приходу UDP-пакета ... G>В вашем случае нужна система на базе асинхронных агентов, работающих с асинхронным IO.
Все еще нужна, или я таки озвучил "асинхронно"?
G>Не обязательно. Рецепт производства хороших hiload систем уже давно известен.
РецептЫ. Много аспектов, разная их важность и влияние на конкретные сценарии. В общем, система постоянно оптимизируется и будет оптимизироваться, но прямо все и сразу невозможно, поэтому по всем правилам военного исскуства сделаны пока лишь самые критические вещи.
G>Ну если выделенная память живет недолго, то в под .NET можно и выделять. Хотя это уже в конкретных случаях тестить надо.
Тестили многократно, сотни тысяч раз в секунду выделять нельзя, GC начинает мешать работе.
Здравствуйте, criosray, Вы писали:
C>На детские болезни программистов и прочие грабли я налетал примерно 11 лет тому назад, когда работал С/С++ программистом. Так что Ваш комментарий, молодой человек, несколько "мимо тазика".
Так и работал, C/C++ программистом? А это ничего, что такого языка нет и не было?
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, FR, Вы писали:
FR>>Шаблоны и классы нужны, позволяют получить более шустрый код чем чистый си.
G>Пример?
C>>На детские болезни программистов и прочие грабли я налетал примерно 11 лет тому назад, когда работал С/С++ программистом. Так что Ваш комментарий, молодой человек, несколько "мимо тазика". L>Так и работал, C/C++ программистом? А это ничего, что такого языка нет и не было?
В каком месте при чтении Вашего ответа следует начинать смеяться?
Здравствуйте, criosray, Вы писали:
V>>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например?
C>Потому, что оптимизацией занимается именно CLR.
Потому что на твой ламерский взгляд, первые цифры номера версии составили нечто сакральное.
Вот за тебя твое домашнее задание: эти цифры всего лишь означают привязку к спецификации на байткод/метаинформацию и прочее. И эта спецификация действительно не менялась, но это не значит, что реализация этой спецификации не менялась.
А тут в тебе говорит чванство и лень, раз тебе сложно открыть эксплорер и убедиться наконец самому в том, что CLR еще как менялся, не смотря на изменность первых 3-х цифр в номере версии.
Здравствуйте, MxKazan, Вы писали:
V>>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например? MK>Видимо, потому что ты говорил о JIT-е, который таки является частью именно CLR.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, criosray, Вы писали:
V>>>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например?
C>>Потому, что оптимизацией занимается именно CLR.
V>Потому что на твой ламерский взгляд, первые цифры номера версии составили нечто сакральное.
V>Вот за тебя твое домашнее задание: эти цифры всего лишь означают привязку к спецификации на байткод/метаинформацию и прочее. И эта спецификация действительно не менялась, но это не значит, что реализация этой спецификации не менялась.
V>А тут в тебе говорит чванство и лень, раз тебе сложно открыть эксплорер и убедиться наконец самому в том, что CLR еще как менялся, не смотря на изменность первых 3-х цифр в номере версии.
Чем правее самая старшая изменённая цифра в версии, тем меньше фич добавляется и тем мельче фичи. Причём чаще всего изменение младших двух цифр включет в себя в основном багфиксы. И ты хочешь, что бы при изменении самомй младшей цифры версии дотнета майкрософт начал переколбашивать jit?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, MxKazan, Вы писали:
V>>>А откуда взялось слово CLR? Почему ты решил, что речь о CLR, а не о .Net Framework, например? MK>>Видимо, потому что ты говорил о JIT-е, который таки является частью именно CLR. V>А CLR у нас теперь отдельно от фреймворков идёт?
А что это меняет? Ну слушай, уже разобрались что к чему, давай не будем пускаться в демагогию.
Здравствуйте, criosray, Вы писали:
C>Классический юношеский максимализм на лицо...
Ты с топика-то не съезжай. Я тебе тут давеча вопрос про тестирование задал. Ответ будет?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, criosray, Вы писали:
C>>Человек привселюдно опозорился...
V>Угу, а во рту "сладко, сладко, сладко". V>Не в состоянии обосновать своих утверждений — расписался в бессилии.
В бессилии? Действительно — я в бессилии переубедить Вас, т.к. Вы отвергаете простой и понятный даже трех летнему ФАКТ:
Вообщем, как принято тут говорить "слив засчитан".
_>Чем правее самая старшая изменённая цифра в версии, тем меньше фич добавляется и тем мельче фичи. Причём чаще всего изменение младших двух цифр включет в себя в основном багфиксы. И ты хочешь, что бы при изменении самомй младшей цифры версии дотнета майкрософт начал переколбашивать jit?
Его и переколбашивали, просто не в том направлении, в каком лично мне надо было, но это фигня, и фигня потому, что это все внутренние кишки. Для этого дотнет и разрабатывался, чтобы отвязать программы от подробностей реализации рантайма. Спорящий со мной продемонстрировал непонимание этого момента.
Там еще фишка с этими тремя полями версии в том (если сам не обратил внимание), что они входят в строгое имя сборок, поэтому обновленные сборки ложатся аккурат вместо старых, чтобы те самые новые обновления работали для ваших старых программ.
Но вот что не фигня, и я приводил уже примеры — это изменения в публичных интерфейсах основных сборок, согласись, это уже малость посерьезнее. Например, поставили .Net 3.5 SP1, взяли класс Socket, там поиспользовали новые асинхронные методы, а потом понесли программу на Висту без указанного обновления, или там где стоит первоначальная версия .Net 2.0, а она даже не грузится той же версией CLR. (ничего, что я mscorlib и его зависимости в CLR сключил? спасибо)
Поэтому, в спецификациях требований к окружению такой программы надо писать не <CLR 2.0.х>, а <.Net 3.5 SP1>. Разницу ощутил?
На самом деле, пытаться отделять CLR от FW — это профанация, одно без другого не живет, да и смысла не имеет. А для чего был затеян весь сыр-бор сказал здесь
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, anton_t, Вы писали:
V>Но вот что не фигня, и я приводил уже примеры — это изменения в публичных интерфейсах основных сборок, согласись, это уже малость посерьезнее. Например, поставили .Net 3.5 SP1, взяли класс Socket, там поиспользовали новые асинхронные методы, а потом понесли программу на Висту без указанного обновления, или там где стоит первоначальная версия .Net 2.0, а она даже не грузится той же версией CLR. (ничего, что я mscorlib и его зависимости в CLR сключил? спасибо)
V>Поэтому, в спецификациях требований к окружению такой программы надо писать не <CLR 2.0.х>, а <.Net 3.5 SP1>. Разницу ощутил?
А как же multitargeting при разработке?
Скопиленное на платформе .Net3.5sp1 под 2.0 пойдет на 2.0 гарантированно? Или к 2.0 надо свои другие фиксы ставить?
1. Вы обвенили дотнет в том, что в новых фреймворках не ощутимо "обещанное улучшение оптимизации jit"
2. На что Вам ответили, что CLR со времен дотнет 2.0 НЕ менялся.
3. Вы начали доказывать: как же не менялся, когда выходили фреймворк 3.0, 3.5 и сервис паки!
4. Вам ответили, что CLR в них остался прежним, потому там и не могло появится каких-то новых "оптимизаций jit".
и в доказательство привели картинку, авторами которой являются сами МС
...
Теперь Вы пытаетесь перевести тему, оправдаться и как-то выкрутиться, не желая признать свою неправоту. Будьте мужчиной, в конце-то концов! Имейте смелость признать свою неправоту.
C>В бессилии? Действительно — я в бессилии переубедить Вас, т.к. Вы отвергаете простой и понятный даже трех летнему ФАКТ:
Ну ты или настолько непробиваем, или исскуссный манипулятор (в последнее верится с трудом). К счастью, известным форумным приемом это нивелируется: будь добр цитату или последовательность цитат, где я это опровергал.
Ибо пока что ты споришь не с тем, что я говорил, а с тем, что ты мне приписал.
C>Вообщем, как принято тут говорить "слив засчитан".
Серьезно? Слив — это уход от темы или исчезание из обсуждения после неудобных вопросов, оба приема ты уверенно демонстрируешь по нескольку раз в день. (времени не жалко?) В общем, на лицо отсутствие начальных навыков форумного общения, поэтому и подставляешься те самые несколько раз в день. Мне давно уже наплевать на суть нашего обсуждения, просто пока не лень показать, где ты слажал.
Здравствуйте, Pepel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Pepel, Вы писали:
P>>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
G>>Сильных проверок чего?
P>типов проверок !!!! ЧЕГО .. P> мощная статическая проверка типов ..это 0 который делает из 1 десятку
Вы хотите нам сказать, что C++ статически типизированный язык?
0 делает из 1 десятку чего?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, criosray, Вы писали:
C>>В бессилии? Действительно — я в бессилии переубедить Вас, т.к. Вы отвергаете простой и понятный даже трех летнему ФАКТ:
V>Ну ты или настолько непробиваем, или исскуссный манипулятор (в последнее верится с трудом). К счастью, известным форумным приемом это нивелируется: будь добр цитату или последовательность цитат, где я это опровергал.
V>Ибо пока что ты споришь не с тем, что я говорил, а с тем, что ты мне приписал.
Да ну? Серьезно?
А это чьи слова:
"И еще забыл, что последние года 4 тактовая частота процов практически не растет, а обсуждаемого скачка оптимизации JIT-а при переходе на 3.0 версию не было ВООБЩЕ"
"Да, версия стандарта 2.0.x (т.к. формат метаданных не поменялся), а название стандарта ты озвучил. Тем не менее, сам рантайм и .Net-сборки от второго фреймворка обновлялись с выходом каждого последующего или их SP. Для интереса, вот список изменений только лишь для 2.0SP1 http://support.microsoft.com/kb/945757, остальное найти так же не трудно, если есть желание.
То, что ты совершенно не в курсе об постоянных обновлении рантайма и .Net сборок и о характере этих обновлений — это понятно, но поверь, абсолютно не смертельно. Что непонятно, так это твоя реакция: неужели настолько смертельным было то, что ты предположил? И что будешь делать сейчас? Посыпать голову пеплом?"
а потом пошла конкретная демагогия в попытках замять тему:
"
Офигенный ликбез, судя по обширности представленного материала.
Тогда встречный ликбез для тебя: рантайм и основные .Net сборки (mscorlib, System) постоянно обновлялись после выхода второго фреймворка (когда я говорю второй фреймворк, то это именно релиз Microsoft .Net Framework 2.0, который действительно 2.0.50727). Одни из самых заметных обновлений рантайма, пришедшее с .Net 3.0 — это доработка GC, самое заметное изменение сборок версии 2.0.50727, пришедшее с .Net 3.5 — это интерфейс класса Socket из System.dll. А так по мелочи доработок была куча (начни от ссылки в пред. посте), от внутренних кишок System.Data, до дублирования и переноса по неймспейсам объявлений наиболее популярных интеропных COM структур и интерфейсов. "
Вы можете ответить какое отношения номера версий сборок имеют к CLR и JIT-оптимизациям??? Не можете. Потому что Вы банально "съхали с темы".
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Pepel, Вы писали:
P>>Здравствуйте, gandjustas, Вы писали:
G>>>Здравствуйте, Pepel, Вы писали:
P>>>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
G>>>Сильных проверок чего?
P>>типов проверок !!!! ЧЕГО .. P>> мощная статическая проверка типов ..это 0 который делает из 1 десятку
G>
G>A a;
G>B* b = (B*)((void*)&a)
G>
G>Где тут сильные проверки?
G>Лучше сразу напиши что был неправ иначе заклюют.
тут их нет конечно же, это пример сознательного обхода проверок, да, есть такой инструмент в С++, есть полноценные указатели и void*, совместимость с С и это здоровская вещь на самом деле ...
понимаешь.. как тебе объяснить .. "нож хорош для того, у кого он есть, и плох для того, у кого он в нужный момент не оказывается под рукой" .
Здравствуйте, samius, Вы писали:
V>>Поэтому, в спецификациях требований к окружению такой программы надо писать не <CLR 2.0.х>, а <.Net 3.5 SP1>. Разницу ощутил? S>А как же multitargeting при разработке? S>Скопиленное на платформе .Net3.5sp1 под 2.0 пойдет на 2.0 гарантированно? Или к 2.0 надо свои другие фиксы ставить?
Именно привел пример, когда гарантированно не пойдет. Конкретные классы и методы:
Socket.AcceptSync(), Socket.ConnectSync(), и прочие xxxAsync() а так же сам класс SocketAsyncEventArgs.
Была еще куча мелких примеров, но мы не записывали, а просто написали в требованиях <MS .Net FW 3.5 SP1>.
Здравствуйте, criosray, Вы писали:
C>Короче, объясняю на пальцах:
О, наконец-то! Можно ставить точку.
C>2. На что Вам ответили, что CLR со времен дотнет 2.0 НЕ менялся.
(загвоздка в том, что ты говорил про версию, более того, лишь про старшие её цифры, в этом суть, продолжаем)
C>4. Вам ответили, что CLR в них остался прежним, потому там и не могло появится каких-то новых "оптимизаций jit".
Вот наконец тот самый логический клей, спасибо. Хоть я и так понял, что ты хотел именно это сказать, и даже видел эмоциальные добавления к тому, что подразумевалось, но логика без явного озвучивания страдала, а этого я допустить не могу.
Итак, ты заблуждался и очень сильно. Твои прикладные программы привязаны к версии фреймворка, но сама позиция MS (а нам ее тут озвучивали MS MVP, которым я доверяю в этом вопросе), была в том, что рантайм будет развиваться с сохранением обратной совместимости, и он таки успешно развивался/развивается (оглядываясь назад).
Я тебе предлагал уже тупо взять эксплорер (!!!) — ты же можешь сравнить размер, даты и версии файлов, составляющих фреймворк, ты можешь взять Reflector или другой аналогичный тул... вобщем, в конце концов убедиться, что CLR изменялся. Более того, изменения джита со времен FW 2.0 происходили, просто ты не очень активно (судя по профайлу) участвовал в нашем форуме, и мог подробностей не знать. Ну дык, я вроде дал ссылку, откуда можно начать копать (будь у тебя интерес узнать, как обстоят дела на самом деле).
Но это всё мелочи, спорить я начал исключительно по причине того, что ты мне приписал нечто от балды. Спорить непосредственно с этим "нечто" было бы не столь увлекательно (ибо использую .Net с 2002-го года), поэтому я и заставил тебя определённо высказаться самому по этому вопросу, что ты и сделал п.2 и п.4, и более мне ничего от тебя не надо.
Повторюсь, не такие это уж важные знания, важнее знать другое — что наши прикладные программы остануться работоспособными при дальнейшем развии .Net. Такая фигня была бы простительна, если бы ты свое незнание не ставил как аргумент в доказательство ламерства коллеги.
C>и в доказательство привели картинку, авторами которой являются сами МС
Боже мой, какая красивая картинка. Ты из этих картинок предлагаешь "знания" черпать?
У нас тут целая серия issues была по причине несовместимостей фреймворков, так что сведения приходилось черпать из чуть более глубоких источников.
В принципе, я тебе эту картинку объяснил, но ты не понял: формат метаданных остался прежний, спецификации те же, старшие поля версий, участвующие в strong name сборок те же, поэтому старые твои программы могут ссылаться на обновленные сборки без проблем. (в этом состояло домашнее задание)
Итого: ты можешь остаться при своем мнении о неизменности реализации CLR, но будь добр, не требуй от меня согласиться с этим.
C>Теперь Вы пытаетесь перевести тему, оправдаться и как-то выкрутиться, не желая признать свою неправоту. Будьте мужчиной, в конце-то концов! Имейте смелость признать свою неправоту.
Расслабся, если я чего-то не знаю, то с удовольствием слушаю собеседника и всегда ему благодарен за его личное время, потраченное на мое образование. Рекомендую эту тактику как наиболее эффективную, чтобы твое форумное время не проходило бесполезно.
C>Вы можете ответить какое отношения номера версий сборок имеют к CLR и JIT-оптимизациям???
CLR без FW не существует и обратное тоже верно, CLR слишком сильно завязан не только на спецификацию метаинформации и систему типов, но и на сами конкретные типы из FW. И обновляться это может только в сборе.
ОК, конкретно джит — составляющая часть "механики" CLR, платформы исполнения, так же как и GC и система ресолвинга и загрузки сборок и еще куча другой требухи. По доходившим до нас сведениям и по результатам анализа результата джиттинга, мы видели, что джит-таки развивается. Субъективно я так же обратил внимание, что и GC стал практически не заметен на глаз (он тоже не может быть не завязан на джит). Поэтому и утверждаю, что CLR изменялся. А в исходном посте заметил, что среди прочих изменений не было кое-каких, обсуждаемых ранее на форуме и интересных мне по работе. Где тут криминал-то?
C>Не можете. Потому что Вы банально "съхали с темы".
Да ничего не съехал. Не споря с тем, что версия спецификации не поменялась (потому как и не утверждал подобного, это был сугубо твой закидон), продолжаю утверждать, что реализация этой спецификации менялась постоянно и вполне честно остаюсь при своём.
Короче, снова предлагаю ставить точку. Своё мнение ты, слава богу, наконец озвучил здесь
P> P>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
P> G>Сильных проверок чего?
P> типов проверок !!!! ЧЕГО .. P> мощная статическая проверка типов ..это 0 который делает из 1 десятку
Нет в С++ мощной статической проверки типов. С++ — это слаботипизированый язык со статической типизацией
Здравствуйте, samius, Вы писали:
S>Очевидно речь идет о методах Socket.AcceptAsync, Socket.ConnectAsync и т.п. Потому как об AcceptSync нет никаких упоминаний.
Да (проклятый copy&paste и спешка).
S>Эти новые методы были введены в S>Supported in: 3.5, 3.0 SP1, 2.0 SP1 S>Т.е. разрабатывая под 3.0 SP1 и используя эти методы мы получаем бинарник, которому нужен 2.0 SP1 для запуска. Если мы не хотим терять совместимость с 2.0 без sp1, то не используем. И все дела.
Вот в том и прикол, что .Net 3.0 вышел раньше .Net 2.0 SP1, а если мы вели разработку на .Net 2.0 SP1, то получили бяку в Виста, которая идет с предустановленной .Net 3.0, и на которую .Net 2.0 SP1 не ставится никаким образом (если не ошибаюсь, туда и .Net 3.0 SP1 не ставится, не буду утверждать).
А что и как использовать — это сугубо технический вопрос, мы указали в требованиях .Net 3.5 и забыли.
S>Если можно конкретнее...
Не можно.
Было так: потрачено время на разработку классов, предоставляющих аналогичную ф-сть для сокетов для работы под .Net 3.0 и .Net 2.0 без SP, но потом выяснилась еще серия бяк (с сериализацией), и мы не стали заморачиваться и тупо проставили на висту 3.5 и забыли. Коль будет требование сделать нашу прогу под указанные предыдущие выпуски фреймворков, то будем копать глубже, разумеется, и обязательно поделюсь.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Очевидно речь идет о методах Socket.AcceptAsync, Socket.ConnectAsync и т.п. Потому как об AcceptSync нет никаких упоминаний.
V>Да (проклятый copy&paste и спешка).
S>>Эти новые методы были введены в S>>Supported in: 3.5, 3.0 SP1, 2.0 SP1 S>>Т.е. разрабатывая под 3.0 SP1 и используя эти методы мы получаем бинарник, которому нужен 2.0 SP1 для запуска. Если мы не хотим терять совместимость с 2.0 без sp1, то не используем. И все дела.
V>Вот в том и прикол, что .Net 3.0 вышел раньше .Net 2.0 SP1, а если мы вели разработку на .Net 2.0 SP1, то получили бяку в Виста, которая идет с предустановленной .Net 3.0, и на которую .Net 2.0 SP1 не ставится никаким образом (если не ошибаюсь, туда и .Net 3.0 SP1 не ставится, не буду утверждать).
Если так — действительно бяка. Пока не напарывались, но теперь будем внимательны при использовании фич из SP1. Делаем продукт под 2.0.
V>Коль будет требование сделать нашу прогу под указанные предыдущие выпуски фреймворков, то будем копать глубже, разумеется, и обязательно поделюсь.
Если будет уж что-то интересное...
А по субъективным впечатлениям — мне тоже показалось, что инлайнинг джита стал агрессивнее после выхода 2.0. Но подтвердить ощущения не могу. Специально заряжать машину под это дело не стану уж. Хотя если представится случай сравнить, будет интересно попробовать.
P> P>> мощная статическая проверка типов ..это 0 который делает из 1 десятку
P> M>Нет в С++ мощной статической проверки типов. С++ — это слаботипизированый язык со статической типизацией
P> вы гдет надергали каких т стереотипных лозунгов, спорить какт бесполезно
Не стереотипных. Суровая правда жизни
P> приговариваетесь к пожизненному чтению <The C++ Programming Language by Bjarne Stroustrup> с .. заменой на 3-х годичную установкe мелкософтовых патчей к MS.NET Framework
Ггг. Ты бы в руки ругой какой-нибудь, кроме С++ вообще бы взял
Здравствуйте, Mamut, Вы писали:
s>> V>Была еще куча мелких примеров, но мы не записывали, а просто написали в требованиях <MS .Net FW 3.5 SP1>.
s>> ? s>> Если можно конкретнее...
M>Досатточно посотреть what's new: http://msdn.microsoft.com/en-us/library/bb332048.aspx
Действительно, часть изменений позиционируется как изменения в CLR, хотя некоторые из них имеют отношение только к FCL (типа HashSet).
Не совсем то, меня интересовало на что можно напороться разрабатывая под .net 2.0 в vs2008 студии со всеми сервис паками на дотнет. Для этого, по всей видимости, надо смотреть список изменений в .net 2.0 sp1. Только что заюзал неглядя один из новых конструкторов DynamicMethod Надо быть внимательнее.
Здравствуйте, Pepel, Вы писали:
P>Здравствуйте, gandjustas, Вы писали:
G>>Здравствуйте, Pepel, Вы писали:
P>>>Здравствуйте, gandjustas, Вы писали:
G>>>>Здравствуйте, Pepel, Вы писали:
P>>>>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна ..
G>>>>Сильных проверок чего?
P>>>типов проверок !!!! ЧЕГО .. P>>> мощная статическая проверка типов ..это 0 который делает из 1 десятку
G>>
G>>A a;
G>>B* b = (B*)((void*)&a)
G>>
G>>Где тут сильные проверки?
G>>Лучше сразу напиши что был неправ иначе заклюют.
P>тут их нет конечно же, это пример сознательного обхода проверок, да, есть такой инструмент в С++, есть полноценные указатели и void*, совместимость с С и это здоровская вещь на самом деле ...
P>понимаешь.. как тебе объяснить .. "нож хорош для того, у кого он есть, и плох для того, у кого он в нужный момент не оказывается под рукой" .
Не надо объяснять. Не такая уж сильная типизация как тебе кажется.
Пример с union_ами приводить?
Здравствуйте, Pepel, Вы писали:
P>- будете на себя работать — С++ в руки
Много ли ты проектов на С++ сделал?
P>- на контору планируете идти — шарп
И сколько на шарпе?
Здравствуйте, samius, Вы писали:
V>>Вот в том и прикол, что .Net 3.0 вышел раньше .Net 2.0 SP1, а если мы вели разработку на .Net 2.0 SP1, то получили бяку в Виста, которая идет с предустановленной .Net 3.0, и на которую .Net 2.0 SP1 не ставится никаким образом (если не ошибаюсь, туда и .Net 3.0 SP1 не ставится, не буду утверждать). S>Если так — действительно бяка. Пока не напарывались, но теперь будем внимательны при использовании фич из SP1. Делаем продукт под 2.0.
Вроде как через Windows Update ставится самая последняя версия фреймворка, если стоит 2.0 и выше.
G>>Кроме того уже не за горами запуск числомолотилок на GPU, там тоже высокоуровневые языки будут более уместны, так как позволят генерить код для GPU в рантайме. CC>Занимаюсь я щас как раз GPU числомолотильней для финансовых расчетов.
А можно твой опыт поэксплуатировать?
Как насчет параллельного расчета многих задач, т.е. код один и тот же, но нужны сотни одновременных потоков, обрабатывающих свои данные этим кодом (например, это будут аудио-кодеки).
Здравствуйте, criosray, Вы писали:
C>http://en.wikipedia.org/wiki/Objective-C — во многих смыслах замечательное решение, а с недавних пор еще и автоматическая сборка муссора появилась (опционально).
Ты писал на нем реально? И как тебе синтаксис объявлений обычных классов, абстрактных или интерфейсов? Как тебе запись вызова методов?
Сборка мусора там далеко не на всех реализациях, и в отсутствии аналогов смарт-поинтеров получаем тот же гемморой, что и с голым С.
Здравствуйте, Хвост, Вы писали:
Х>логично, но меня всё же более интересовал вопрос о том, будут ли ети структуры существовать на стеке если они замкнуты.
Нет, они сразу располягаются в полях замыкания, и доступ к ним коссвенный, естественно, а на "стеке" они располагаются лишь в синтаксисе программы.
S>Разве возвращается не обертка над объектом на стеке? Копирования я тут не вижу.
Возвращается по значению, походу и в "начальном" варианте это именно копирование, хотя компилятор может заинлайнить целевое тело ф-ии, чтобы оно расчитывало значения непосредственно в область стека, которая выделена под возвращаемое значения (например, если результат используется как аргумента вызова другой ф-ии, то сразу можно вычислять в соотв. позицию аргумента).
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, samius, Вы писали:
S>>Разве возвращается не обертка над объектом на стеке? Копирования я тут не вижу.
V>Возвращается по значению, походу и в "начальном" варианте это именно копирование, хотя компилятор может заинлайнить целевое тело ф-ии, чтобы оно расчитывало значения непосредственно в область стека, которая выделена под возвращаемое значения (например, если результат используется как аргумента вызова другой ф-ии, то сразу можно вычислять в соотв. позицию аргумента).
Кажется там речь шла о возврате function...
Как я понимаю, в общем случае (без инлайнинга) возвращается значение function. Какое отношение к значению function имеет тело самого замыкания?
Что будет если компилятор заинлайнит тело функции, подставляя function в область стека вызывающей функции, куда в этом случае попадет тело самого замыкания?
Что вообще за этим function? Он фиксированного размера?
Здравствуйте, gandjustas, Вы писали:
G>А по сущству есть что сказать? Или ты честно считаешь что в своем проекте будешь вмеесто стандартных new, delete и всего что с ними связано
У нас в проекте именно так, собственные new/delete, потому что в KernelMode аллокация вовсе не через HeapAlloc делается. Полёт нормальный.
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, gandjustas, Вы писали:
G>>А по сущству есть что сказать? Или ты честно считаешь что в своем проекте будешь вмеесто стандартных new, delete и всего что с ними связано
IID>У нас в проекте именно так, собственные new/delete, потому что в KernelMode аллокация вовсе не через HeapAlloc делается. Полёт нормальный.
Разве C++ в ядре? А что там от C++ осталось то?
Здравствуйте, IID, Вы писали:
G>>А по сущству есть что сказать? Или ты честно считаешь что в своем проекте будешь вмеесто стандартных new, delete и всего что с ними связано
IID>У нас в проекте именно так, собственные new/delete, потому что в KernelMode аллокация вовсе не через HeapAlloc делается. Полёт нормальный.
Я почти во всех своих проектах использую аллокатор маленьких (до 256 байт) объёктов (коих обычно 95%), который работает очень быстро и эффективно, устраняя в частности потенциальную фрагментацию.
Здравствуйте, NikeByNike, Вы писали:
NBN>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
А ты в курсе на чем написано ядро Linux, да и Windows?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
v> C>http://en.wikipedia.org/wiki/Objective-C — во многих смыслах замечательное решение, а с недавних пор еще и автоматическая сборка муссора появилась (опционально).
v> Ты писал на нем реально? И как тебе синтаксис объявлений обычных классов, абстрактных или интерфейсов? Как тебе запись вызова методов?
Синтаксис — это как бы вопрос сильно субъективный
ЗЫ. Сам на Objective-C не писал Ленивый я
v> Сборка мусора там далеко не на всех реализациях, и в отсутствии аналогов смарт-поинтеров получаем тот же гемморой, что и с голым С.
Если мне не изменяет память, то для большинства high-level объектов там встроеный счетчик ссылок или тип того. Что, естественно, не решает проблему полностью
Здравствуйте, VladD2, Вы писали:
NBN>>Ага, а в задачу входит создание красивого, быстрого и кроссплатформенного кода и софта — это решаемо _только_ на С++. Даже ущербный С с этим не спрвится.
VD>А ты в курсе на чем написано ядро Linux, да и Windows?
С-код, как и код любого низкоуровневого языка — страшен.
Здравствуйте, Mamut, Вы писали:
v>> Сборка мусора там далеко не на всех реализациях, и в отсутствии аналогов смарт-поинтеров получаем тот же гемморой, что и с голым С.
M>Если мне не изменяет память, то для большинства high-level объектов там встроеный счетчик ссылок или тип того. Что, естественно, не решает проблему полностью
Это ты про либы для iPhone? Да, так и есть, это обычное библиотечное решение, следить за счетчиком надо вручную.
И давно ты так на С# пишешь?
На С++ тоже уже на днях станет можно.
ГВ>>И потом, bind — это, в общем-то, не полноценные лямбды, как ни крути. Показательно то, что на C++ их можно реализовать. G> Показательно то что их нет в современном языке.
Современный язык — понятие растяжимое. Раньше как-то шли ФЯ отдельно, императивные отдельно, а теперь все хотят 2-в-1, и бум этот буквально последние единицы лет. MS пошла навстречу, ну и С++ уже подтянулся.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>И давно ты так на С# пишешь?
Давненько.
V>На С++ тоже уже на днях станет можно.
А смысл?
Здравствуйте, _d_m_, Вы писали:
___>Здравствуйте, MxKazan, Вы писали:
MK>>Здравствуйте, Pepel, Вы писали:
P>>>весь пост не читал, только начало зацепил, вставлю свои 5 центов : тут чет про кросплатформенность много пишут там и прочий валюнтаризм .. мне кажется, дело в области применении задачи, наверное программу управления кардиодатчиком хирургического стола все же стоит писать на C++ ввиду сильного механизма проверок , а дрочилку отчетов овощной базы на рынке можно и на шарпах забомбить и она тож будет великолепна .. MK>>Dildo Framework, Vegetable Edition
___>Остается окрытым вопрос: а как быть мясному рынку?
Известно как! Ждать сервис-пака!
Здравствуйте, vdimas, Вы писали:
v> v>> Сборка мусора там далеко не на всех реализациях, и в отсутствии аналогов смарт-поинтеров получаем тот же гемморой, что и с голым С.
v> M>Если мне не изменяет память, то для большинства high-level объектов там встроеный счетчик ссылок или тип того. Что, естественно, не решает проблему полностью
v> Это ты про либы для iPhone? Да, так и есть, это обычное библиотечное решение, следить за счетчиком надо вручную.
Не, там что-то было и в Objective-C. Но, наверное, как в Qt это сделано для библиотечных классов (каких0нить хэндлов, окон, строк и т.п.) Сейчас просто лень искать
Здравствуйте, gandjustas, Вы писали:
IID>>У нас в проекте именно так, собственные new/delete, потому что в KernelMode аллокация вовсе не через HeapAlloc делается. Полёт нормальный. G>Разве C++ в ядре? А что там от C++ осталось то?
А что в твоем понимании С++? Очень интересно, просвети.
А то ты в последнее время завел шарманку "в нейтиве С рулит, С++ не нужен", что наводит на некоторые интересные мысли о том, что ты понимаешь под С++.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, gandjustas, Вы писали:
G>Смотря в какой области. В системном программировании не сильно получится без нативных языков, байтики ворочить без C мало получится. C++ в такой задаче ни к чему. Аналогично для числомолотилок.
Я тебя уже спрашивал, почему именно С, ты так и не смог предметно объясниться.
Здравствуйте, gandjustas, Вы писали:
G>В нейтиве рулит нэйтив. А в программировании — управляемые языки и мощные платформы.
О, как!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[56]: Таки примеры-то будут, а то правда не ясно...
G>>А еще чаще — нельзя. Потому что решение задачи кроется не в одном алгоритме, а в дестятках. Подобрать оптимально каждый из них нереально, кроме того заранее обычно даже не думают как данные выглядеть будут. E>Не понимаю, в чём проблема. E>Приведи пример задачи, и алгоритма, который сразу трудно выбрать...
Таки примеры-то будут?,. а то правда не ясно о чём речь...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
J>Также компании Microsoft очень сложно предусмотреть в CLR возможность проверки неизменности констант-объектов или констант-параметров. CLR пришлось бы при каждой операции записи проверять, не выполняется ли запись в объект-константу, а это сильно снизит эффективность работы программы. Есте ственно, что обнаружение нарушения должно приводить к генерации исключения. Более того, поддержка констант создает дополнительные сложности для разработчиков. В частности, при наследовании неизменяемого типа, производные типы должны соблюдать это ограничение. Кроме того, неизменяемый тип, скорее всего, должен состоять из полей, которые тоже представляют собой неизменяемые типы.
J>(c)Рихтер
Ага, в случае обнаружения на Runtime всё так. А в compile-time этого не проверить что-ли ?
J>>Также компании Microsoft очень сложно предусмотреть в CLR возможность проверки неизменности констант-объектов или констант-параметров. CLR пришлось бы при каждой операции записи проверять, не выполняется ли запись в объект-константу, а это сильно снизит эффективность работы программы. Есте ственно, что обнаружение нарушения должно приводить к генерации исключения. Более того, поддержка констант создает дополнительные сложности для разработчиков. В частности, при наследовании неизменяемого типа, производные типы должны соблюдать это ограничение. Кроме того, неизменяемый тип, скорее всего, должен состоять из полей, которые тоже представляют собой неизменяемые типы.
J>>(c)Рихтер
IID>Ага, в случае обнаружения на Runtime всё так. А в compile-time этого не проверить что-ли ?
The readonly keyword is a modifier that you can use on fields. When a field declaration includes a readonly modifier, assignments to the fields introduced by the declaration can only occur as part of the declaration or in a constructor in the same class.
Здравствуйте, VladD2, Вы писали:
VD>Погугли и почитай, что за бред там пишется. Все про С++. Это локальная терминалогия отдельных идиотов. Научного понятия статического полиморфизма нет. Есть статическая типизация и разные виды полиморфизма. Но любой из них может отрабатывать в рантайме.
А как называется сод, вроде std::sort, который можно натравить на данные разного типа, удовлетворяющие каким-то формальным требованиям, и получить соответсвующий результат? Пусть члово полиморфизм не годится. Какое таки годится?
Кста, так ещё чуть ли не в алголе можно было делать, так что про эксклюзив С++ в вопросах того, что там статическим полиморфизмом кличут, не надо. Это всё придумали и внедорили задолго до С++...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
L>Смотри выделенное.
Неужели не встречал ситуёвины, когда что-то на С, а что-то на С++? Интероп там оч. хороший, да и можно просто наследовать С-код, просто включив его в С++ проект...
L>Засим откланиваюсь.
Ну и к лучшему, в смысле всего хорошего!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, VladD2, Вы писали:
VD>утиная типизация.
А это что обозначает?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, gandjustas, Вы писали:
V>В общем ладно, может тут и моя вина, что не описал контекст, поэтому не понимаю твоего сопротивления очевидным, на мой взгляд, вещам.
А ты читал, что пишут другие люди про очевидные "на твой взгляд" вещи?
V>В общем, сервер конференций, видео, VoIP и вся лабуда типа шаринга приложений и прочие примочки. Основная реалтаймовая и одновременно нагрузочная вещь — это именно VoIP, остальное реалтаймом можно назвать лишь условно. Что есть VoIP: это 50 пакетов в секунду на абонента в одну только сторону, т.е. итого 100 пакетов на абонента. Железка должна держать их несколько сотен, желательно под тысячу. В общем, у меня такой сценарий, что я даже не могу позволить себе такую мелочь, как лишнее копирование данных и тем паче ни о каких 100тыс выделений буферов в секунду не может быть и речи.
Поэтому для этих целей ведущие собаководы выделяют все нужные буфера заранее.
V>Оно не возвращает, оно читает из сокета в наш предвыделенный буфер. После прочтения возвращает кол-во прочитанных байт. В пакете заголовок и собственно сами данные с неким смещением (зависит от заголовка). Данные обрабатываются прямо из этого буфера по указанной выше причине.
Поэтому в таких случаях ведущие собаководы применяют либо ансейф, либо трюк с джитом типа вот так:
for(var i =0; i<buffer.Length; i++)
{
if (i==iactualLength) // выходим из циклаbreak;
PerformTerribleCalculationAgainst(buffer[i]);//здесь устранены проверки на выход за пределы buffer
}
V>Обычная там фильтрация, ФНЧ/ФВЧ, алгоритм рекурсивного фильтра примитивен — это просто вычисление многочленов z1*a1+z2*a2+z3*a3+..., zi — элементы последовательности, ai — константы. Думаешь, я тебе вру о том, что затраты на доступ к массиву сопоставимы с полезными вычислениями?
Думаю, ты просто не вполне корректно готовишь собаку.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Поэтому в таких случаях ведущие собаководы применяют либо ансейф, либо трюк с джитом типа вот так: S>
S>for(var i =0; i<buffer.Length; i++)
S>{
S> if (i==iactualLength) // выходим из цикла
S> break;
S> PerformTerribleCalculationAgainst(buffer[i]);//здесь устранены проверки на выход за пределы buffer
S>}
S>
Мммм... А чем это отличается от проверки, выполняемой автоматически? Ну, за исключением того, что мы не словим потенциально IndexOutOfRangeException?
Здравствуйте, Cadet, Вы писали:
C>Мммм... А чем это отличается от проверки, выполняемой автоматически? Ну, за исключением того, что мы не словим потенциально IndexOutOfRangeException?
Тем, что она будет делаться один раз на тело цикла, а не один раз на каждое обращение к элементу массива.
Хотя да, в коротких формулах будет немногим лучше .
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Cadet, Вы писали:
C>>Мммм... А чем это отличается от проверки, выполняемой автоматически? Ну, за исключением того, что мы не словим потенциально IndexOutOfRangeException? S>Тем, что она будет делаться один раз на тело цикла, а не один раз на каждое обращение к элементу массива. S>Хотя да, в коротких формулах будет немногим лучше .
Сравнил. При одном обращении к массиву на цикл код получается как минимум эквивалентным по производительности (с точностью до погрешности измерений, т.е. разница в десятую долю секунды из полутора минут прогона). Это означает, что при множественном обращении к массиву по индексу выигрыш от проверки внутри цикла наверняка будет.
Здравствуйте, samius, Вы писали: S>Сравнил. При одном обращении к массиву на цикл код получается как минимум эквивалентным по производительности (с точностью до погрешности измерений, т.е. разница в десятую долю секунды из полутора минут прогона). Это означает, что при множественном обращении к массиву по индексу выигрыш от проверки внутри цикла наверняка будет.
Ну, можно попробовать применить что-нибудь поинтереснее — например, фильтрацию. Там вообще простор фантазии — в том смысле, что фильтрация — это свёртка подмассива с массивом. Как-то типа так:
public double[] Filter(double[] data, double[] filter)
{
double[] target = new double[data.Length-filter.Length];
for(int i = 0; i<target.Length; i++)
{
for(j=0; j<filter.Length; j++)
target[i]+=data[i+j]*filter[j]; // количество неустраненных проверок границ в этом месте определит общий успех предприятия
}
return target;
}
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
V>>Я тебя уже спрашивал, почему именно С, ты так и не смог предметно объясниться. G>Еще раз обясняю. C — потому что низкоуровневый и быстрый. Там где нужны более сложные абстракции лучше юзать более безопасные языки, чем C++.
Ты зачем с ног на голову все ставишь? Язык определяет задачи, или задачи определяеют выбираемый язык — суть инструмент?
С++ такой же низкоуровневый, быстрее в общем случае, чем С, и гораздо безопаснее, чем С, т.к. у него более строгая типизация.
Итак, последний раз спрашиваю: почему именно С, а не С++.
И что за повторяющаяся ахинея насчет "более сложных абстракций"? Речь сейчас исключительно о тех задачах, где ты предлагаешь пихать голый С.
--------
(Вариант ответа, типа "потому что есть платформы с С, но без С++" не принимаются, т.к. для таких платформ мы бы и не сравнивали).
Здравствуйте, VladD2, Вы писали:
VD>Параметрический полиморфизм и утиная типизация.
If the range of actual types that can be used is finite and the combinations must be specified individually prior to use, it is called ad-hoc polymorphism. If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism
Если я правильно понимаю, у шаблонов полиморфизм как раз не параметрический, особенно в данном случае (различный sort для разных типов).
VE>If the range of actual types that can be used is finite and the combinations must be specified individually prior to use, it is called ad-hoc polymorphism. If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism
VE>Если я правильно понимаю, у шаблонов полиморфизм как раз не параметрический, особенно в данном случае (различный sort для разных типов).
Как раз у шаблонов — параметрический. Специализация шаблонов — ad hoc.
Здравствуйте, Sinclair, Вы писали:
V>>В общем ладно, может тут и моя вина, что не описал контекст, поэтому не понимаю твоего сопротивления очевидным, на мой взгляд, вещам. S>А ты читал, что пишут другие люди про очевидные "на твой взгляд" вещи?
Читал много всего. Но помимо чтения, конечно же, ставили эксперименты и получали результаты.
А ты читал мои сообщения выше? Сильную разницу с советами в статье заметил? А сам-то статью внимательно читал?
S>Поэтому для этих целей ведущие собаководы выделяют все нужные буфера заранее.
Это пробегающие_мимо_высунув_язык собаководы так делают, а ведущие читают хотя бы на пару постов выше, чтобы не потерять контекст, перед тем, как делать серьёзное лицо. А то какой-то конфуз — объясняют мне то, что я сам оппоненту объяснял. Ну или надо было не на мой пост отвечать, для сохранения последовательности обсуждения.
И тут требуется уточнить — что значит "заранее"? Перед тем как пустить траффик по какому-нить из тысячи каналов? Или в процессе инициализации системы? Если первое, то так и есть, а если второе — то никак, ибо клиенты заходят по разным протоколам и в каждом протоколе свои особенности.
V>>Оно не возвращает, оно читает из сокета в наш предвыделенный буфер. После прочтения возвращает кол-во прочитанных байт. В пакете заголовок и собственно сами данные с неким смещением (зависит от заголовка). Данные обрабатываются прямо из этого буфера по указанной выше причине. S>Поэтому в таких случаях ведущие собаководы применяют либо ансейф,
Ансейф без пиннинга никак, а насчет пиннинга отсылаю к своим сообщениям чуть выше или к статье по твоей ссылке.
S>либо трюк с джитом типа вот так: S>
S>for(var i =0; i<buffer.Length; i++)
S>{
S> if (i==iactualLength) // выходим из цикла
S> break;
S> PerformTerribleCalculationAgainst(buffer[i]);//здесь устранены проверки на выход за пределы buffer
S>}
S>
Да мы и так всегда однократно значения из массива достаем. Во вторых, я не вижу отсутствия лишней проверки. Согласен, что она должна быть чуть более экономичной.
В любом случае, даже в случае подобных "сверхоптимизаций", заджитенный бинарный код весьма убог в тех местах, где речь идет об обращениях к массивам. И я могу себе позволить предположить почему: наверно есть какой-то "протокол" м/у джиттером и GC, чтобы GC не терял ссылочные значения, "затертые" в регистрах после всех оптимизаций. Компилированных бинарный кусок подобного С++ кода обычно раза в 2 короче. (в исходнике gthtперебор где-то так: while(array!=last) process( *array++); )
Учитывая, что голосовой буффер — это вполне счетное кол-во сэмплов (обычно 160 или 320), то неплохо на С++ на шаблонах смотрится раскрутка цикла "в плоскость".
V>>Обычная там фильтрация, ФНЧ/ФВЧ, алгоритм рекурсивного фильтра примитивен — это просто вычисление многочленов z1*a1+z2*a2+z3*a3+..., zi — элементы последовательности, ai — константы. Думаешь, я тебе вру о том, что затраты на доступ к массиву сопоставимы с полезными вычислениями? S>Думаю, ты просто не вполне корректно готовишь собаку.
Ну думай. В общем, ввиду отсутствия предмета обсуждения позволю себе его задать: есть рекурсивные цифровые фильтры и нерекурсивные. С нерекурсивными в дотнет вообще беда из-за непосредственной реализации той приведенной мною формулы по верх массивов, и это выполняется на каждый отсчет... чтобы получить следующее фильтрованное значение, надо сделать приращение i+1 при Z, и пробежаться по окну снова, а размер окна бывает разный и почти никогда маленьким. Поэтому на практике фильтруем рекурсивными фильтрами, в которые подаются значения по 1-му, а кол-во промежуточных регистров фиксированно и зависит от порядка фильтра. В этом случае zi — переменные структуры и формула вычисляется вовсе в цикле.
------------
Чтобы далее не переливать из пустого в порожнее: на клиента идет по ClickOnce полностью safe managed код (благо там нагрузка — один канал всего). Так что была масса возможностей сравнить варианты по всему градиенту от нейтива до менейджед (сравнить аналогичную ф-сть клиента и сервера в протоколах и обработке сигнала).
Здравствуйте, vdimas, Вы писали: V>А ты читал мои сообщения выше?
Да. V>Сильную разницу с советами в статье заметил?
Нет. V>А сам-то статью внимательно читал?
Да.
V>Это пробегающие_мимо_высунув_язык собаководы так делают, а ведущие читают хотя бы на пару постов выше, чтобы не потерять контекст, перед тем, как делать серьёзное лицо. А то какой-то конфуз — объясняют мне то, что я сам оппоненту объяснял. Ну или надо было не на мой пост отвечать, для сохранения последовательности обсуждения.
Оппонент не занимается проектированием VoIP сервера под дотнет. Поэтому ему статья была бы малоинтересна. Я же не из ехидства — а так, для общей полезности. Мало ли кто чего не прочитал в интернете.
V>И тут требуется уточнить — что значит "заранее"? Перед тем как пустить траффик по какому-нить из тысячи каналов? Или в процессе инициализации системы? Если первое, то так и есть, а если второе — то никак, ибо клиенты заходят по разным протоколам и в каждом протоколе свои особенности.
Ну, в статье более-менее написано что значит "заранее" в их контексте.
Перед каждым коннектом, я так понял, выделять уже поздно — потому, что нельзя пинить равномерно размазанные по памяти буфера.
С точки зрения менеджера буферов, все особенности протоколов сводятся к подходящему размеру буфера.
V>Ансейф без пиннинга никак, а насчет пиннинга отсылаю к своим сообщениям чуть выше или к статье по твоей ссылке.
Так штука в том, что сеть вообще без пиннинга никак — даже если сам его не делаешь, запись в сокет автоматически пинит буфер за тебя. Поэтому ансейфом больше/ансейфом меньше — особенной роли не играет.
V>В любом случае, даже в случае подобных "сверхоптимизаций", заджитенный бинарный код весьма убог в тех местах, где речь идет об обращениях к массивам. И я могу себе позволить предположить почему: наверно есть какой-то "протокол" м/у джиттером и GC, чтобы GC не терял ссылочные значения, "затертые" в регистрах после всех оптимизаций.
Не очень понятно, где там будет экономия — как только в цикле осталось только одно обращение к массиву, дальше начинается математика, и никаких указателей не остаётся.
Значит, джит лажает в математике, а не в указателях и GC.
V>Учитывая, что голосовой буффер — это вполне счетное кол-во сэмплов (обычно 160 или 320), то неплохо на С++ на шаблонах смотрится раскрутка цикла "в плоскость".
Ну, это верно. Шаблоны и раскрутка на С++ — это просто классика кун-фу.
Опытные падаваны делают это на шарпе вручную с ансейфом (ковыряния рефлектором в районе System.String и System.Array дают порой потрясающие впечатления).
Путь джедая — это разработка обобщенного фреймворка развертки циклов в рантайме. Путь полного джедая — это, конечно же, доработка этого обобщенного фреймворка до развёртки циклов в GPU
V>Ну думай. В общем, ввиду отсутствия предмета обсуждения позволю себе его задать: есть рекурсивные цифровые фильтры и нерекурсивные. С нерекурсивными в дотнет вообще беда из-за непосредственной реализации той приведенной мною формулы по верх массивов, и это выполняется на каждый отсчет... чтобы получить следующее фильтрованное значение, надо сделать приращение i+1 при Z, и пробежаться по окну снова, а размер окна бывает разный и почти никогда маленьким. Поэтому на практике фильтруем рекурсивными фильтрами, в которые подаются значения по 1-му, а кол-во промежуточных регистров фиксированно и зависит от порядка фильтра. В этом случае zi — переменные структуры и формула вычисляется вовсе в цикле.
Да это всё более-менее понятно. Можешь привести код такого фильтра, чтоб стало понятнее, куда оптимизировать?
V>Чтобы далее не переливать из пустого в порожнее: на клиента идет по ClickOnce полностью safe managed код (благо там нагрузка — один канал всего). Так что была масса возможностей сравнить варианты по всему градиенту от нейтива до менейджед (сравнить аналогичную ф-сть клиента и сервера в протоколах и обработке сигнала).
И как результат сравнения? Дает ли переход в ансейф прирост? Насколько переход в нейтив бъет ансейф?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, vdimas, Вы писали:
V>Правильно, поэтому мы используем класс Socket только для инициализации (бо удобно очень), а потом берем хендл, и по UDP работаем не через класс сокета.
И как вы работаете "не через класс"? Даже если напрямю ДллИмпортировать неуправляемые Send и Receive, маршалер один хрен выполнит тот же пиннинг на время вызова. Потому что иначе никак — злой GC переместит буфер и привет.
V>Там какая-то возня по регистрам. Такое ощущение, в джит забили жесткие правила: такую-то адресацию делать так-то, другую так-то, и вот он вынужден жонглировать регистрами. Почему мне и показалось, что "протокол" соблюдают, дабы джит знал в каких регистрах искать ссылки.
Ссылки — да. Там же register map. Но я тут во всё более-менее верю.
V>Разве не проще на С/С++? V>Согласен, для первого такого случая это же так муторно: надо еще один проект создать, в нем файл export.def, завести у себя класс NativeMethods V>Зато каждый следующий случай добавляется за считанные секунды без этих "звездных войн". По крайней мере отдача адекватна вложенному результату.
V>Ха-ха по последнему. V>Это должен быть путь не одинокого джедая, а как минимум серьёзного коллектива, т.к. сами оптимизации/развороты и прочее хоть и просты каждый в отдельности, но их охренительное кол-во, т.е. база знаний должна быть приличная.
Не, если коллектив — то и падаванов хватит.
V>нерекурсивный примерно такой (без оптимизаций): V>
Угу. То есть развертка — в отказе от C[j] в пользу Cj. V>Но наложение окна — это общая и довольно частая операция в обработке сигналов, когда инициализируется некий кодек или препроцессор, то ему динамиччески параметры сигнала дают, и он выделяет буфера динамически, и наложение окна — это цикл в цикле получается.
V>Рекурсивный более скромен в плане ресурсов: V>// мемберы, линия задержки V>
Здравствуйте, Qbit86, Вы писали:
Q>Насчёт быстрее в общем случае, чем Си — это вряд ли. В некоторых случаях может быть быстрее кода на Си, в этом месте как правило спешат привести хрестоматийный пример qsort vs. std::sort. Собственно, это была одной из целей Страуструпа — не сильно потерять в производительности. Но совсем этого избежать не получилось.
У С++ гораздо больше возможностей работы в compile time, поэтому не в некторых случаех, а практически всегда.
V>>И что за повторяющаяся ахинея насчет "более сложных абстракций"?
Q>Исключения, например, сильно мешают некоторым оптимизациям, приводят к громоздкому бинарному коду. Совсем же без исключений на C++ писать трудно, тем более что даже простой new может бросить std::bad_alloc.
Исключения можно не использовать в критических местах.
Q>Шаблоны могут привести к разбуханию и дублированию бинарного кода, что как минимум скажется на cache locality (C++FQA).
Во первых компиляторы уже неплохо умеют это оптимизировать, во вторых кеши сейчас у процессоров мегобайтные.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, vdimas, Вы писали:
V>>Правильно, поэтому мы используем класс Socket только для инициализации (бо удобно очень), а потом берем хендл, и по UDP работаем не через класс сокета. S>И как вы работаете "не через класс"? Даже если напрямю ДллИмпортировать неуправляемые Send и Receive, маршалер один хрен выполнит тот же пиннинг на время вызова. Потому что иначе никак — злой GC переместит буфер и привет.
Опять же правильно, поэтому маршаллируется не массив, а эго запиненный адрес.
Если опускаться все дальше и все глубже, то у нас основной протокол IAX, который хорош тем, что используется всего 1 UDP порт, поэтому всех клиентов по этому протоколу мы слушаем на одном порту. Вызываем синхронный метод чтения UDP-пакета из одновременных нескольких конкурирующих потоков (самый эффективный вариант получился, крайне рекомендую). Каждый такой поток-близнец при старте системы инициализирует буффер и пинит его, затем мы оперируем лишь IntPtr. Да, GC.Collect дважды с ожиданием финализаций перед этой операцией вызываем.
В общем, unsafe-ом мы не страдаем, тем более, что это все-равно байт-код, т.е. смысл не так уж велик. Я вообще не знаю такую задачу для unsafe, которую не смог бы решить в safe столь же эффективно, кроме случая реинтерпретации памяти (см. например вычисление String.GetHashCode()). Я и в native всячески от реинтерпретации стараюсь уходить, а в managed сам бог велел.
V>>Это должен быть путь не одинокого джедая, а как минимум серьёзного коллектива, т.к. сами оптимизации/развороты и прочее хоть и просты каждый в отдельности, но их охренительное кол-во, т.е. база знаний должна быть приличная. S>Не, если коллектив — то и падаванов хватит.
Не знаю. Для себя я сложности делю на 2 полюса:
1-й — сложность "в глубину", когда объем реализации/спецификаций/абстракций маленький, но за ним скрывается большой теоретический бэкграунд (как пример — ИИ, либо обработка сигналов, и то и другое выполняется примитивными операциями с векторами, но эта "примитивность" дорогого стоит).
2-й — сложность "в ширину", когда объем реализации и т.д. очень большой, но при этом этот объем легко разложим на множество примитивных подзадач (пример: большинство современных информационных систем).
Так что реализация этого интересного варианта с GPU действительно скорее (2), чем (1), и падаванов хватит. А вот задача поиска новых алгоритмов оптимизации или же повышение эффективности имеющихся — неспоримо (1), как раз для джидая.
S>Угу. То есть развертка — в отказе от C[j] в пользу Cj.
Если Сj константы, то почему бы нет.
V>>Но наложение окна — это общая и довольно частая операция в обработке сигналов, когда инициализируется некий кодек или препроцессор, то ему динамиччески параметры сигнала дают, и он выделяет буфера динамически, и наложение окна — это цикл в цикле получается.
S>А, ну я так и думал — то есть теперь есть два "окна", которые едут мимо друг друга.
В нерекурсивном было тоже два окна, просто одно из них константное (для случая фиксированных в compile-time характеристик фильтра) и очень большое. В рекурсивном же окно обычно маленькое — это порядок фильтра+1, и сдвиг окна неплохо выполняется одновременно с вычислениями.
Продолжая давать советы по эффективной реализации фильтрации: т.к. данные подаются порциями, то все регистры сдвига для рекурсивного фильтра могут располагаться на стеке в процессе обработки порции, с сохранением состояния фильтра м/у обработками. Для .Net достаточно класс фильтра сделать value-type, далее "всё само".