Как стать автором
Обновить

Комментарии 114

НЛО прилетело и опубликовало эту надпись здесь
Вполне может подойти для случаев, когда критично быстродействие.
ab показывает среднее время выполнения одного запроса при 10 конкурентных около 2,5-3ms. Кажется это не так уж и быстро. Наверное от того что ведется синхронная работа с сокетом.
Я имел ввиду не количество запросов, а время обработки какого-либо одного, но тяжелого, например расчеты и т.д. Или просто какие-то специфичные программы. Например какой-нибудь рендер.
Статья про оптимизацию. Настоятельно советую почитать, чтобы больше не говорить такого.
rsdn.ru/article/philosophy/Optimization.xml
Краткое содержание статьи: «Оптимизировать надо узкие места»
Вполне может подойти, когда работать с альтернативой нет возможности.
После «Hello, world» я попробую написать web-интерфейс к своей программе. Писать не так уж и сложно, просто сказывается сильная неразвитость веб-направления на с++ и отсутствие хороших библиотек.
Fastcgi-программы на c/c++ очень похожи по структуре на fastcgi-программы на perl. Можно писать с оглядкой на множество существующих perl-скриптов.
я вот посмотрел на все это, и пришел к выводу что это только начало такое тяжелое.
думаю что если был нормальный фрейм форк, как ZF CI и др с кодогенерацией. То время на написания вэб приложений — отличалось не на много.
благо PHP объектно-ориентирован.
После «Hello, world» я попробую написать web-интерфейс к своей программе. Писать не так уж и сложно, просто сказывается сильная неразвитость веб-направления на с++ и отсутствие хороших библиотек.
Fastcgi-программы на c/c++ очень похожи по структуре на fastcgi-программы на perl. Можно писать с оглядкой на множество существующих perl-скриптов.
Насколько мне известно abn.com.ua баннерная сеть с оборотом 11М написана как раз на си… Таким способом или другим, но факт.
… была написана…
у меня один знакомый сейчас пишет интернет магазин на С++.
Если уж и писать на сях то сразу модуль в nginx
А если пишете десктоп-приложение, то сразу как расширение ядра ос?
Здесь другая аналогия. Десктоп приложение, если говорить об оконной части, не имеет смысла лабать на чем-то хардкорном. А вот критичные к производительности места, вполне себе могут быть и на уровне ядер.

Я тоже, когда «пробовал» писать что-то для веб на С/С++ писал модуль для apache. Хотя я не вспомню сейчас как там что, но у меня такое ощущение, что для хелло ворлд у меня гораздо меньше строк получилось )

Меньше кода — меньше ошибок © )
Есть ли какие-нибудь фреймворки на C/C++?
Полноценных я не нашел. можно внимательно присмотреться к www.nongnu.org/fastcgipp/.
cryp.to/publications/fastcgi/#FRAMEWORK — здесь были намеки, но опять же реализации в сети я не нашел.

кстати, когда я написал точно такой же комментарий в другом топике, то надо мной долго смеялись. Теперь я не один. =)
Возможно смешно звучит слово «фреймворки» :)? Наверное правильней было бы спрашивать о библиотеках и утилитах, облегчающих программирование под Web на С/С++?
Klone, мини-фреймворк для С. Изначально предполагался для веб-интерфейсов к какому-либо железу/прочему лоулевелу. Довольно забавная штучка.
а если без сокетов?
Есть вот такая табличка по соотношению способов коммуникации и типов запуска программы:

STDIN Domain Socket TCP/IP Socket Remote app PM starts app

External N Y Y Y N

Dynamic Y N N N Y

Static N Y Y N Y

без сокетов можно использовать только динамическим способом запуска, при этом поток stdin указывается при порождении процесса программы.
Если вы спрашивали о скорости работы, то я не знаю, должно быть быстрее.
Ээто безусловно интересно но… Вряд ли когда-нибудь буду на С/С++ писать сайты, слишком уж это. Вот на ассемблере — это да, сила! Зачем нам полумеры :E
Хотя на счет того, что не буду на сях писать сайты, это я погорячился. Более правильно сказать — fastcgi вряд ли буду юзать, а вот под.нет возможно и придется в определенных местах использовать C++.

Где-то я видел графики сравнения по скорости между php, perl, ruby, cgi, еще чего-то. Если кто-нибудь поделиться — буду благодарен. Интересно.
Интересно в карму насрали любители С++ или не-любители ассемблера? :) Хотя вроде ни то ни другое не опускал и не пропагандировал
я думаю не-любители комментариев не в тему
Да вроде комментарий в тему — я высказал свое личное мнение, что вряд ли буду создавать сайты используя С++. Хотя наверно не стоит обсуждать подобное, вот это точно будет не в тему :) И меня скорее всего будут бить, может быть даже ногами © G.
называется мы не ищем легких путей, обычные сайты: блоги, магазины, корпоративные — php за глаза, а еще есть asp.net, java.
Можете ли привести пример сайта написанного на С++, хотя бы частично ?? Просто интересно посмотреть.
ebay.com — ключевые сервисы написаны на С++
Ну там больше ISAPI, чем фастги :)
Мне когда-то говорили, что мэйлру относится к таковым. Частично на С/С++, частично на перле.
все верно, позволяет очень ощутимо экономить железо
А по времени наверное намного затратней. Хотя могу ошибаться и это не аргумент за другии языки.
НЛО прилетело и опубликовало эту надпись здесь
Какое отношение это имеет к веб-сервисам и HTTP протоколу?
веб-чаты не видел никогда чтоли?
сейчас уже есть звонилки, типа позвоните нажав на кнопочку и поговорите с нашим оператором прямо из браузера
про C++ и его отношение к разработке веб-приложений выше, полагаю, вы не читали даже…
Yahoo! Placemaker. Это сервис, вообще говоря. Back-end написан на C++ целиком и полностью.
paypal.com вроде на с++
Например, баннерные сети, счетчики. Только основная часть, т.е. выдача рекламного блока/картинки, но не сайт. Работает быстро.
ЭМ… А На чем написан Google? О_О
Помню когда-то давно задавал вопрос людям из русского гугла, кажется они упоминали что сидят под каким то линуксом и пишут на питоне, С++ ну и еще чего-то по-мелочи. Не все конечно, но очень многие.
На дофига чем написан гугл :)
Несложная, непопулярная, но потихоньку развивающаяся браузерная игра — tuagir.ru, написана на С под фреймворк Klone.
наверное именно поэтому она "_ потихоньку_ развивающаяся браузерная игра" :)
Какие-то критически важные части LinkedIn, афаик, на Ц.
НЛО прилетело и опубликовало эту надпись здесь
что именно там может быть на С частично?
а, я кажется понял…

вот сайты:

Call of Duty 2 в Украине
и
Call of Duty 4 Modern Warfareв Украине
и
Call of Duty 5 World at War в Украине

они все полностью на С-- + немного asm
mp3.ru
Имхо, в большинстве случаев это совершенно не нужно. Гораздо проще и удобнее использовать точку входа на каком-нибудь пхп, а сишный или плюсовый код оформить подключаемым к php расширением. В память оно будет загружаться одновременно с апачем, обработка ввода и показом результатов будет заниматься php. А C/C++ будет заниматься ровно тем, чем должен: обрабатывать переданный набор данных и возвращать результат. Заодно это, как правило, даёт универсальность — одну библиотеку можно будет при необходимости использовать и из плюсовой программы, и из php, и еще откуда.
Если ради скорости на C++, то лучше вообще без apache.
Правда, тогда кроме C++ на занятый порт ничего не прикрутишь (резко сложность возрастает).
В принципе статику можно любым другим сервом, висящем на другом порте, отдавать. А вообще в данной ситуации лучше к nginx прилепить и не париться.
Большое спасибо за статью. :)

Прочтя статью, до меня вдруг окончательно дошло, что такое FastCGI. И если вы тут предлагаете попробовать C++, то у меня возникло желание попробовать FastCGI + Java.

В какой-то момент деплой в сервлет контейнер, какие-то его падения и прочее стали просто задалбывать и занимать ощутимое время разработки. Окончательно разозлившись, я свалил на Ruby On Rails, чему очень рад.

В голове уже идея простого фреймворка аля RoR для Java. FastCGI + DB4O + еще что нибудь ;)

Но после прочтения статьи появилось желание попробовать, за что респект.
> В голове уже идея простого фреймворка аля RoR для Java.

Вас уже опередили. См. grails.
Ну тогда уж можно было бы вспомнить про JRuby + Rails, все это отлично работает.

Нет, я имел ввиду не платформу, а язык.
Видел веб морду к базе данных написанную на C… При переезде на другой сервер отказалась работать… хорошо еще что программист был доступен, скинул исходники, и только после перекомпиляции заработало. Кстати и собиралось тольк gcc 2.96, другие уже с ошибками валились… Ужос в общем. Не и интерпретаторы не для интернета.
Написать через задницу можно на любом языке. Скажите спасибо своему программисту, Си тут ни при чём.
Очень интересная, по крайней мере для меня, тема.
Был бы признателен за продолжение темы.
Спасибо за статью. На практике, из моего опыта, могу сказать, что чаще всего C++ не используется непосредственно как CGI front-end. В одной из крупных интернет-компаний ;) применяется обычно следующее решение: в качестве фронт-энда выступает PHP код, который выполняет задачи связанные с авторизацией пользователей, начальным sanity check входных данных и т.п. Следующим компонентом идет прокси-модуль, который как правило, представляет собой расширение для PHP, которое уже непосредственно перенаправляет запросы к .so, в котором заключен высокопроизводительный С++ код. Это немного более громоздкое решение, но в долгосрочной перспективе оно работает лучше, т.к. все компоненты на своих местах и для каждой задачи мы используем наилучшим образом подходяющую технологию.

В частности, на подобной архитектуре построен Yahoo! Placemaker — наверное, я все же описал с массой ошибок, но в целом архитектура именно такая.
Ну вот, глюк случился, продолжение сообщения:

www.wrensoft.com/zoom/benchmarks.html

Приведенные материалы конечно не являются истиной в последней инстанции, но более-менее картину можно представить. Да, С++ (CGI) рулит, но ему хорошую конкуренцию составляет .NET, и даже Руби приближается к нему по производительности, причем ближе многих (v1.9). Так что все таки стоит задуматься, а стоит ли использовать С++ для такой области как веб, учитывая что он не очень к этому приспособлен. Это не критика С++ никоим образом :)
Да стоит задуматься. Но очень рад, что есть такая возможность для его использования. Это дает всю мощь Си ++ =) (бесспорно я думаю), без которой порой пока очень сложно обойтись.
И еще. По бенчмаркам ASP.NET отстает от CGI на примерно 30%. Согласитесь это не мало.
Да, но по сравнению с другими участниками теста —.нет молодец :)
И еще — С++ вроде оптимизировать особо некуда больше. А в .NET постоянно выходят новые версии этого фреймворка, что я думаю положительно сказывается на производительности, может он когда-нибудь приблизится к С++.

Хотя скорее компьютеры просто станут еще на порядок мощнее и веб-разработчики забудут о разнице в производительности разных языков и технологий и будут писать на чем им удобнее :)
Да. Вот с этим согласен. ( «на чем им удобнее» ). И согласен с тем что «приблизится».
Ждем новой эры. Я думаю новая эра придет только когда операционные системы станут сами объектно-ориентированны… А в MS всё на стареньком Win32 как сидели, так и сидят.
Ну вебформс — это не все, на чем пишут странички в асп.нет :)
Попробуйте те же асинхронные хендлеры. Нет надобности создания экземляров класса Page, прикручивания событий. Плюс Thread Pool. Да, а еще можно создать один экземпляр хендлера, в некотрых случаях это тоже может сказаться на производительности в лучшую сторону.
Странно. а я слышал наоборот, Руби очень медленный. Например приложение на RoR приходится запускать заранее, так как иначе ответ на запрос был бы слишком медленным (а вот php работает быстрее!)
На сколько я знаю, и в тестах заметно — руби достаточно быстрый (особенно >v.1.9), а вот Ruby on Rails не самый быстрый из фреймворков, поэтому неторопливость RoRа переводят на язык, но под руби есть и другие фреймворки. То есть нельзя говорить про приложения на RoR и PHP — пхп это язык, а RoR — фреймворк. Можно сравнивать руби и пхп, что в тестах и делают.
источникик конечно очуметь, тока вот первая ссылка — вобоще 2008-ой год )
ну уж если С/C++, то тогда mod_helloworld… Благо апач с его apr — очень грамотное апи, не хуже чем и сам fastcgi протокол (всмысле, не сложнее). А выигрыш в скорости в таком случае совсем фатальный)
да и, не могу не заметить: современные маленькие дилетанты только думают, что «ну уж если веб то только интепретируемое...». Люди с мозгами знают что для некоторых задач си и 2 сервера лучше чем питон/пхп/чтоугодно и 20ть. Просто для бОльшего круга задач в этом смысла нет.
Де факто я знаю проекты, где от сервера с C++, перешли к ферме серверов с интерпретируемым кодом.

Потому что машины дешевы, а саппорт C++-проекта оказался дороже, чем саппорт более медленного кода.
ну я же говорю — люди с мозгами…

С/C++ кода в мире больше чем какого-либо другого. И ниче, поддерживают…
Веб-приложения на С`ях, тоже самое, что GUI приложения на php — можно, а нужно ли...?! Быстродействие — так настроем сервер, отключим все что не нужно — будет вам реактивная ракета…
А Вам, уважаемый автор, спасибо за статью :)))
Может не «настроем сервер» а купим новый?
Я вот несложные GUI-приложения пишу на javascript в .hta :-[
Зачастую это бывает намного продуктивнее и быстрее, чем открывать студию и ваять что-то там — кода получается меньше и делаю я это быстрее :) А на счет С и пхп — всетаки С более универсальный, и если гуи на пхп — зло, то вот в веб С живет потихоньку.
Если уж в коде используются сокеты, то не легче/оптимальнее ли будет писать сразу без апача, используя самописный веб сервер? Ведь его написать это совсем несложная задача.
А можно и не самописный, а например такой
Классная вещь. Спасибо за ссылку.
Если мы будем писать отдельный web-сервер, то нам надо будет еще заморочиться:
1) с отдачей статических файлов
2) с безопасностью
3) с различными фичами, вроде access по ip, паролированием, рерайтами.

Оно нужно? :) С этим прекрасно справляется nginx.
Проблема в том что на си очень сложно 1) управлять памятью (надо делать умные указатели, так как обычные сборщики мусора плохи. а хороший вам никто не даст просто так, хотя именно на сервере тормоза из за сборки мусора не особо критичны) 2) Вырвиглазный синтаксис: надо писать заголовочные файлы в доп-е к обычным, кучу инклюдов и определять функции до (!!!!!!!) их использования. 3) тяжело писать ажурные конструкции из обхектов, ассоциаьтивных массивово и порчего, как в php. Вам придется самому реализовать такие объекты как хеши.работу со строками, подсчет ссылок… и все только ради того чтобы понять что вы сделали аналог php?

Хотя идея повысить производительность мне нравится. Интепретатор php тормоз, может инклудить файл дольше 1 мс и вообще мог бы работать и побыстрее!!! Жутко злит в общем.
Насчет структур данных кагбэ stl. Да и boost тоже есть. C++ же не первый день существует, очень многое уже давно написано.
И вы считаете, что в Си такой же простой и приятный синтаксис для объектов/массивов как в php? И проблема управления памятью по прежнему остается))

А вот на языке типа D (конечно в нем пара мест тоже неидеальны например работа со строками)  — было бы интересно попробовать писать придложения :)
Ну понятно же, что все зависит от поставленных целей и требуемого соотношения производительность/сложность разработки.
Более низкоуровневая работа с памятью — цена за быстродействие и отличительная особенность языка, а не проблема.
Нет, эта проблема (работа с памятью) должна решаться, частично компилятором (так как в части случаев он видит, где память можно уже освободить), частично каким-то средством вроде считалки ссылок, или сборщика мусора.

Так как писать вручную все эти выделения паямти и освобождения надоест быстро.
Поверьте, никто кроме автора не разбирается в том как должна работать его программа. если память где-то уже можно освободить, то автор должен это сделать. каким образом это произойдет неважно, будет это явное освобождение памяти или из стека будет вытолкнута переменная неважно. именно автор должен все учитывать и контролировать, а среда и компилятор ему подсказывать и помогать.

как говорил вирт, для написания программ дебагеры не нужны, если она написана правильно.
Это на словах так, автор все знает, а на деле над проектом работает куча людей, следствие баги с памятью, возьмите список уязвимостей в Windows например.

Это просто, когда у тебя в программе 3 функции (и то, мне бы стало лень руками писать delete, я бы навернг придумал что-нибудь, чтобы не писать), а когда огромное количесттво объектов, получаектся ерунда, программист не пишет код а только отслеживает баги.

Единственный способ борьбы с багами памяти — автоматическое управление памятью.
Чтобы не писать delete, средство уже придумано.
Вы правы виндовс довольно сложный программный продукт у которого были обнаружены множество ошибок при работе с памятью. именно поэтому в майкрософте постоянно усовершенствуют процесс разработки и требования к коду.

Я даже не против опционального средства для работы с памятью. и оно поверьте есть, ведь никто не запрещал сборщики мусора внутри программы.

все моменты неправильной работы с памятью должны быть выявленны на этапе компиляции программы, но не вовремя её работы.
> именно поэтому в майкрософте постоянно усовершенствуют процесс разработки и требования к коду.

А надо — менять особености языка, или применять автоматическое управление памятью. Например, у меня на php ни разу программа не вылетала из-за багов с памятью.

Средства есть, не только сборщики мусора, но и умные указатели например.

> все моменты неправильной работы с памятью должны быть выявленны на этапе компиляции программы, но не вовремя её работы.

Это невозможно, так как неизветсно, сколько раз выполнится какой то цикл, по какой ветке пойдет выполенние, сколько раз будет вызвана функция.
> Единственный способ борьбы с багами памяти — автоматическое управление памятью.

И как это помогает при зацикливании структур данных?
Сборщики мусора удяляют зацикленные структуры. счеткики ссылок — нет, но там можно применять хитрости, вроде слабых ссылок, или еще чего-нибудь.
Я в курсе, я имел в виду не совсем это (неверно выразился). Я про то, когда дизайн программы такой, что на какую-то мутную структуру остаётся всегда одна ссылка — например, из замыкания незаконченной процедуры или, более часто, из неаккуратно очищенного глобального или рано-инициализируемого контейнера.

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

{
a = new Object();
dosmthWith(a);
// здесь компилятор может смело ставить delete a;
… много кода, не использующего a
return true;
}

Уничтожать локальную переменную a можно раньше выхода из функции.
Всё равно лучше программиста никто это не отследит. Разве что ввести в сигнатуру dosmthWith свойство переменной a, которая подскажет, что эта a нигде не будет использоваться, типа:

dosmthWith( unlinkable<Object *> a ) {… }

Иначе если разрешить предложенную вами оптимизацию, нельзя будет реализовать интерфейсы-конструкторы вложенных структур (типа innerHTML).

В общем, много моментов. Гораздо проще, если речь идёт о C++ договориться всегда удалять объекты по указателям, определённым в текущем блоке, в этом же блоке, а в классе — в деструкторе этого класса. А для создания структур пользоваться обёртками в виде адаптирующих функций или классов.
P.S. Пример в бесшаблонном стиле:

dosmthWith( Object * unlinkable a ) {… }
Нет, вы не поняли. Я предлагаю уничтожать не объект, на который указывает «a», а только саму переменную, которая удерживает ссылку на него и не дает сборщику мусора удалить объект. Если где-то в функции doSmthWith() кто-то создает новую ссылку на объект, он не будет удален.

Естественно, речь идет о системах с подсчетом сылок или сборщиками мусора.
А, я думал, что вы написали на С++, где приведённая вами конструкция удаляет объект (ссылку-переменную со стека компилятор и так удаляет).

Собственно, современные GC-системы так и осуществляют контроль ссылок: пробегают по уничтожаемому стеку, если в объектах по ссылкам счётчик ссылок нулевой, то уничтожают и объекты. В Перле, например, по-другому, ссылки проверяются и объекты сносятся сразу после завершения предложения.

Но, как я раньше писал, это не спасает от мемликов за счёт подлинковывания из общих структур… :(
А это не так уж и сложно
А это не так уж и сложно
Хелловролд-то? Конечно. :)
Спасибо автору за статью, т.к. очень не люблю фреймворки и все же очень надеюсь на то, что кто-то еще что-то пишет сам. Насчет того, нужно ли подобное, скажу да, т.к. сам лично сталкивался с ситуациями необходимого взаимодействия через веб-интерфейс с драйвером устройства на низком уровне, вот там-то как раз очень-очень и пригодилось сишное приложение.
пару слов про nginx. он поддерживает технологию fastcgi, но здесь придется использовать либо встроенный в php сервер fastcgi либо ставить стороний обработчик запросов, например lighttpd. я лично так и сделал, потому что первый жрет достаточное количество памяти, а из последнего выдрал утилиту spawn-fcgi, которая и занимается обработкой запросов.
А как с обработкой параметров?
разрабатывать свои или брать готовые классы-парсеры параметров запроса.
например bp cgicc или fastcgi++.
А как с рестартом fcgi через 1000 запросов?
Чувство у меня такое что fcgi не умеет рестартить чилдов ну никак :(
MaxRequestsPerProcess n (-1)
Почемуто не компилится пример, пишет:
g++ -o init.bin main.cpp
/tmp/cc7XKvnp.o: In function `main':
main.cpp:(.text+0x47): undefined reference to `FCGX_Init'
main.cpp:(.text+0xab): undefined reference to `FCGX_OpenSocket'
main.cpp:(.text+0xd2): undefined reference to `FCGX_InitRequest'
main.cpp:(.text+0xfb): undefined reference to `FCGX_FPrintF'
main.cpp:(.text+0x107): undefined reference to `FCGX_Finish_r'
main.cpp:(.text+0x113): undefined reference to `FCGX_Accept_r'
collect2: ld returned 1 exit status

Хотя development kit встал нормально…
Судя по гуглу проблема не редка на линуксе, зато нашёл вот эту библиотечку http://cryp.to/libfastcgi/
проверьте включение .h файла и библиотеки.

компилятор говорит что функции не найдены на этапе компиляции, значит он даже не нашел их объявления в .h файле.
Делается это так:
g++ -o init.bin main.cpp -lfcgi++

т.е. указать что использовать либу для С++ если для С то без ++
Если после компиляции запустить и начнет ругаться на отсутствие либ, просто пролинкуйте их т.к. fcgi инсталится в /usr/local/lib
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации