FastCGI C ++ против языка сценариев (PHP / Python / Perl) - PullRequest
22 голосов
/ 30 апреля 2009

Каковы плюсы и минусы использования FastCGI C ++ против PHP / Python / Perl для выполнения той же работы.

Есть ли какие-то подводные камни в производительности или дизайне или вы используете один над другим? Даже ваши мнения приветствуются. (Скажите, почему тот или другой камень, или тот или другой отстой).

Ответы [ 16 ]

31 голосов
/ 30 апреля 2009

скриптовые языки могут работать медленнее, чем C, но это проблема? почти никогда. и если производительность становится проблемой, вы начинаете переводить только критические части.

twitter / ruby ​​- хороший пример; Рубин медленный. некоторые языковые функции (которые в первую очередь делают рубин приятным) просто предотвращают различные виды оптимизации (об этом есть отличная статья от jruby… была ли это ola bini? не помню).

все же, твиттер работает от ruby, потому что ruby ​​достаточно достаточно быстрый . не так давно «блоги» сообщали о том, что твиттер мигрирует в scala по соображениям производительности ... правда в том, что в scala переместилась только очередь сообщений (и другие части серверной части). Yahoo работает на смеси языков; php для внешнего интерфейса, другие, более быстрые языки используются там, где важна производительность.

Итак, почему производительность не так важна? Есть несколько причин:

  • узкое место в базе данных: не сценарии медленные, база данных
  • клиентское узкое место: рендеринг в браузере занимает больше времени, чем запрос. оптимизировать серверную часть, и никто не заметит
  • горизонтальное масштабирование: часто дешевле добавить другой сервер и, таким образом, утроить количество запросов в секунду, чем оптимизировать приложение
  • Время разработки и сопровождения - самые дорогие части вашего проекта. за меньшее время вы получите более дешевых разработчиков Python, поддерживающих ваше приложение, чем c-кодеры с веб-поддержкой
  • без компиляции, короткие циклы разработки

еще один аргумент в пользу написания сценариев: многие языки сценариев поддерживают встраивание или включение быстрого (C) кода:

  • Python, встроенный C
  • php: расширения в c
  • javascript на стороне сервера через rhino: прямой доступ к java / jvm (хорошим примером этого является orf.at, один из крупнейших веб-сайтов в Австрии, работающий на helma - серверная часть jvm интерпретируемый JavaScript!)

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

22 голосов
/ 30 апреля 2009

Несколько лет назад я более или менее научился программировать веб-приложения на работе. C был основным языком, который я знал, поэтому я написал (довольно масштабное) веб-приложение на C. Плохая ошибка. Обработка строк в C и управление памятью утомительны, и, несмотря на отсутствие у меня опыта работы с веб-приложениями, он быстро стал трудоемким проектом.

C ++ был бы значительно лучше, в основном потому, что std::string намного лучше, чем char*.

Однако теперь я бы использовал Python каждый раз (хотя PHP не является ужасным выбором, и, возможно, легче начать с него). Обработка строк в Python великолепна, и она легко обрабатывает Unicode. Python имеет гораздо лучшие веб-инструменты и фреймворки, чем C ++, и его обработка регулярных выражений и стандартные библиотеки (urllib, email и т. Д.) Работают очень хорошо. И вам не нужно беспокоиться об управлении памятью.

Вероятно, я бы использовал C или C ++ для веб-приложения только в том случае, если у меня были серьезные ограничения в ОЗУ (например, на встроенном микро), или если я работал в Google и программировал поисковую систему, которая должна была отвечать тысячи запросов в секунду.

11 голосов
/ 30 апреля 2009

Использование C ++ может привести к радикально более быстрому приложению, чем PHP, Perl или Python, и несколько быстрее, чем C # или Java - если только он не тратит большую часть своего времени на ожидание БД, и в этом случае не будет никакой разницы , На самом деле это самый распространенный случай.

С другой стороны, по причинам, упомянутым Бенхойтом, разработка веб-приложения на C ++ займет больше времени и будет сложнее поддерживать. Более того, гораздо вероятнее, что в нем будут серьезные дыры в безопасности (в настоящее время все больше всего беспокоятся о внедрении SQL и XSS - но если бы они писали свои веб-приложения на C ++, это было бы переполнением буфера, и это означало бы, что их целые сети были бы повреждены, а не только данные). ).

И именно поэтому в наши дни почти никто не пишет веб-приложения на C ++.

8 голосов
/ 30 апреля 2009

Я думаю, что кто-то должен быть пионером в теме Webapp / C ++, чтобы проверить свои возможности и предоставить доказательства концептуальных решений.

С появлением STL и разработкой Boost анализ текста оказался чрезвычайно легким с C ++. Два года назад, если бы мне пришлось анализировать данные CSV, я бы использовал Python или PHP. Сейчас я использую C ++ с STL / Boost. Чтение файла CSV в векторы? Нет проблем, просто getline + boost :: split + lexical_cast. Вычислить сумму данных в векторе пар? Нет проблем:

pair<int, double> sum_int_double(pair<int,double> & total, pair<struct in_addr, pair<int,double> > & a) {
    total.first += a.second.first;
    total.second += a.second.second;
    return total;
}
pair<int,double> mixedSum = accumulate(mixedVec.begin(), mixedVec.end(), emptyPair, sum_int_double);

Передача данных с карты в вектор пар? Нет проблем:

mixedVec.assign(amap.begin(), amap.end());

Все четко определено и остро. Строковые операции, регулярные выражения, алгоритмы, ООП и т. Д. Все хорошо определено и хорошо развито в C ++. Если ваше приложение будет по-настоящему похожим на приложение и не будет разбирать текст на основе, то C ++ также будет хорошим выбором с его функциями ООП.

7 голосов
/ 30 апреля 2009

Вопрос в том, "где создано значение?"

Если вы думаете, что значение создано в управлении памятью, тщательном проектировании классов и получении ночной сборки, то используйте C ++. Вы потратите много времени на написание большого количества кода для выполнения важных задач, таких как удаление объектов, на которые больше нет ссылок.

Если вы считаете, что ценность заключается в развертывании приложений, которые могут использовать люди, используйте Python с платформой Django. Учебное пособие по Django показывает, что примерно через 20 минут вы можете запустить и запустить приложение. Он готов к производству, и вы можете сосредоточиться на важных вещах:

  • Модель. Просто напишите модель на Python, и слой ORM обрабатывает все взаимодействия с базой данных за вас. Нет SQL. Нет ручного отображения.

  • Презентация. Просто создайте свои страницы в HTML с помощью нескольких {{}} «заполните значение здесь» и нескольких {% for thing in object_list %} конструкций, и ваши страницы готовы к работе. Никаких манипуляций со строками.

  • Функции просмотра. Напишите простые функции Python для инкапсуляции обрабатывающей части вашего сайта. Не проверка (это в формах), не представление (что было в шаблонах), не базовая модель (это было в классах моделей), но немного проверки авторизации, обработки запросов и формулирования ответов. Поскольку в Python имеется богатый набор классов коллекций, этот код оказывается очень коротким и точным.

  • Другие вещи. Отображения URL - это регулярные выражения Python. Формы соответствуют вашей модели; вы можете создать подкласс по умолчанию, чтобы добавить настраиваемую проверку ввода и обработку.

  • Замечательная система модульного тестирования для низкоуровневых функций модели, а также сквозных операций.

Нет управления памятью, нет скрупулезного дизайна класса с рефератами и интерфейсами. Не беспокойтесь о том, как оптимизировать работу со строками. Нет ночной сборки. Просто создайте материал, имеющий реальную ценность.

6 голосов
/ 30 апреля 2009

Если вы хотите иметь возможность реализовывать веб-сервисы в существующем запущенном процессе (например, daemon), который написан на C / C ++. Имеет смысл заставить этот процесс реализовывать протокол FastCGI для этого интерфейса. Получите Apache для работы с HTTP (2-way SSL и т. Д.) С внешним миром и отправки запросов через FastCGI через сокет. Если вы делаете это на PHP, вам нужно заставить PHP общаться с вашим процессом, что означает поддержку PHP-кода, а также вашего процесса.

4 голосов
/ 30 апреля 2009

Наличие веб-приложения FastCGI (независимо от C ++, PHP, Perl, Python, Ruby и т. Д.) Обеспечивает лучшее время запуска при запуске, чем приложение CGI. Под начальным временем запуска я подразумеваю время, прошедшее между моментом, когда веб-сервер получил запрос, и временем выполнения первой написанной вами строки кода, поэтому начальное время запуска - это минимальное время, которое посетители посещают. Ваше веб-приложение должно ждать каждого запроса. Нередко начальное время запуска составляет 1 секунду, особенно если у вас большое приложение или вы используете большую среду (например, Ruby on Rails). FastCGI поддерживает работу ваших приложений после того, как он ответил на первый запрос, поэтому FastCGI сокращает начальное время запуска всех последующих запросов (кроме самого первого), обычно до нескольких миллисекунд.

Если вы используете PHP, обычно его конфигурация по умолчанию обеспечивает достаточно хорошее начальное время ответа (даже без FastCGI), но, пожалуйста, убедитесь, что вы используете PHP-ускоритель на своем рабочем сервере (см. http://en.wikipedia.org/wiki/PHP_accelerator), чтобы повысить производительность. .

Большинство языков программирования и сред позволяют вам запускать одно и то же приложение в разных режимах сервера (таких как CGI, FastCGI, встроенный веб-сервер, модуль Apache), изменяя конфигурации приложения без изменения кода. FastCGI обычно не лучший выбор при написании приложения, потому что после изменения кода вам, возможно, придется перезапустить приложение, чтобы оно приняло ваши изменения, но обычно перезапускать приложение FastCGI неудобно. Перезапустить CGI или встроенный веб-сервер гораздо проще. Вы должны установить FastCGI только в производственной конфигурации.

3 голосов
/ 30 апреля 2009

Здесь есть середина. Python (и я считаю, Perl и Ruby) позволяет вам вызывать функции из C. 99 раз из 100, вам не нужно. Но приятно знать, что опция есть, если она вам нужна.

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

3 голосов
/ 30 апреля 2009

Есть люди, которые спрашивали об этом раньше: http://cppcms.sourceforge.net/wikipp/en/page/main

Проект CppCMS предоставляет основу для веб-разработки с использованием C ++.

Вы можете взглянуть на следующие тесты, чтобы понять, в чем разница: http://cppcms.sourceforge.net/wikipp/en/page/benchmarks - примерно на два порядка.

Проблема PHP / Python в том, что они очень медленные, в кэшировании много проблем данные в FastCGI процессе PHP.

Самая большая проблема C ++ - это небольшое количество ресурсов для разработки Web на C ++. Однако использование такой инфраструктуры, как CppCMS, значительно упрощает жизнь.

2 голосов
/ 30 декабря 2009

Возможно, кому-то из вас будет интересен Wt [1], веб-инструментарий, полностью написанный на C ++. Это может быть альтернативой cppCMS. Я пробую оба в эти рождественские каникулы ..

[1] http://www.webtoolkit.eu/wt

...