Выбор языка сценариев для начальной производительности

У меня есть небольшое легкое приложение, которое используется как часть более крупного решения. В настоящее время он написан на C, но я хочу переписать его, используя кроссплатформенный язык сценариев. Решение должно работать в Windows, Linux, Solaris, AIX и HP-UX.

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

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

Итак, в основном я ищу лучшие языки сценариев, а именно:

  • Кросс-платформенный.
  • Возможность синтаксического анализа XML и HTTP-сообщений.
  • Мало памяти и малое время запуска.

Возможные варианты включают, но не ограничиваются: bash / ksh + curl, Perl, Python и Ruby. Что бы вы порекомендовали для такого сценария?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
9
0
7 838
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Lua - это язык сценариев, который соответствует вашим критериям. Это, безусловно, самый быстрый язык сценариев с наименьшим объемом памяти.

Но есть ли в нем необходимые библиотеки ??

Leon Timmermans 30.11.2008 02:32

И работает ли Lua на AIX и HP-UX?

mpeters 30.11.2008 04:55

@Leon, см. Ответ @ PhiLho относительно библиотек. @mpeters, поскольку Lua реализован в ANSI C, он должен работать на всем, что имеет компилятор C.

Robert Gamble 30.11.2008 06:31

При правильном написании C должен быть независимым от платформы и потребует только перекомпиляции для этих разных платформ. Возможно, вам придется перескакивать через несколько обручей #ifdef для заголовков (не все системы используют одни и те же заголовки), но большинство обычных (не связанных с Win32 API) вызовов очень переносимы. Для веб-доступа (который, как я полагаю, вам нужен, когда вы упоминаете bash + curl), вы можете взглянуть на libcurl, он доступен для всех упомянутых вами платформ, и работать с ним не должно быть так сложно.

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

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

Лично я бы использовал Ruby или Python для этого типа работы, они оба позволяют очень легко сделать понятный и понятный код, который могут поддерживать другие (или вы можете поддерживать, не глядя на него в течение 6 месяцев). Если у вас есть контроль, я бы также предложил получить последнюю версию интерпретатора, поскольку и Ruby, и Python в последнее время значительно улучшили производительность.

Это немного личное. Программирование на Ruby меня радует, а код на C - нет (как и создание сценариев на bash для чего-либо нетривиального).

Ответ принят как подходящий

Из-за ваших требований к быстрому запуску и частоте вызовов более 1 Гц я бы рекомендовал либо остаться с C и выяснить, как сделать его портативным (не всегда так просто, как несколько ifdef), либо изучить возможность превращения его в сервисный демон, который всегда запущен. Конечно, это зависит от того, как

У Python может быть меньшее время запуска, если вы скомпилируете модуль и запустите файл .pyc, но он по-прежнему считается медленным. По моему опыту, Perl - это самый быстрый из языков сценариев, так что, возможно, вам повезет с демоном Perl.

Вы также можете посмотреть кросс-платформенные фреймворки, такие как gtk, wxWidgets и Qt. Хотя они нацелены на графические интерфейсы, у них есть низкоуровневые кроссплатформенные типы данных и сетевые библиотеки, которые могут облегчить работу по использованию быстрого приложения на основе C.

По моему опыту, Perl запускается быстрее, чем Python; это не быстрее. Так что демон python может быть решением.

tzot 30.11.2008 10:40

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

По моему опыту, Python является наиболее эффективным из трех, за ним следует Perl, а затем Ruby, причем разница между Perl и Ruby особенно велика в определенных областях. Если вы действительно хотите попробовать перенести это на язык сценариев, я бы собрал прототип на языке, который вам наиболее удобен, и посмотрю, насколько он соответствует вашим требованиям. Если у вас нет предпочтений, начните с Python, поскольку он прост в изучении и использовании, а если он слишком медленный с Python, Perl и Ruby, вероятно, не смогут добиться большего.

Python хорош. Я бы также посмотрел на веб-сайт игры Computer Languages ​​Benchmarks Game:

http://shootout.alioth.debian.org/

Возможно, стоит потратить немного времени на изучение тестов (включая числа для времени запуска и использования памяти). Сравнивается множество языков, таких как Perl, Python, Lua и Ruby. Вы также можете сравнить эти языки с тестами на C.

Помните, что если вы выберете Python, вы также можете расширить его на C, если производительность невелика. Черт возьми, вы, вероятно, даже могли бы использовать часть кода, который у вас есть прямо сейчас. Просто перекомпилируйте его и оберните, используя пирекс.

Вы также можете довольно легко сделать это в Ruby и Perl (хотя и с некоторыми трудностями). Но не спрашивайте меня, как это сделать.

Я согласен с Lua: он суперпортативен, в нем есть библиотеки XML, собственные или связанные с библиотеками C, такими как Expat, у него есть хорошая библиотека сокетов (LuaSocket), плюс для сложных вещей, некоторые привязки cURL, и он хорошо известен за быть очень легким (часто встроенным в устройства с низким объемом памяти), очень быстрым (один из самых быстрых языков сценариев) и мощным. И очень легко кодировать!

Он написан на чистом Ansi C, и многие люди утверждают, что у него один из лучших API-интерфейсов для C (вызов подпрограмм C из Lua, вызов кода Lua из C ...).

«вызывается отовсюду от каждой минуты до множества раз в секунду. Как следствие, важно сохранять память и время запуска на низком уровне».

Для меня это совсем не похоже на сценарий.

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

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

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

Для меня это самый мудрый ответ. Определить проблему часто сложнее, чем найти ответ.

e-satis 15.08.2009 17:15

Можете ли вы вместо этого сделать это длительным процессом и отвечать на запросы http или rpc?
Это удовлетворило бы требования к задержке практически в любом сценарии, но я не знаю, нарушит ли это ваши ограничения на объем памяти.

Как предлагали другие, демонизация вашего скрипта может быть хорошей идеей; это сократит время запуска практически до нуля. Либо у вас есть небольшая оболочка C, которая подключается к вашему демону и передает запрос туда и обратно, либо демон обрабатывает запросы напрямую.

Неясно, предназначено ли это для обработки HTTP-запросов; в таком случае Perl имеет хороший модуль HTTP-сервера, привязки к нескольким различным анализаторам XML на основе C и невероятно быструю поддержку строк. (Если вы не хотите демонизировать, у него есть хороший полнофункциональный модуль CGI; если у вас есть полный контроль над сервером, на котором он работает, вы также можете использовать mod_perl для реализации вашего скрипта в качестве обработчика Apache.) Строки Ruby работают немного медленнее, но для этого есть несколько действительно хороших фоновых инструментов. Боюсь, что я не так хорошо знаком с Python, поэтому не могу дать никаких рекомендаций по этому поводу.

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

Dagny:~ brent$ time perl -MCGI -e0

real    0m0.610s
user    0m0.036s
sys     0m0.022s
Dagny:~ brent$ time perl -MCGI -e0

real    0m0.026s
user    0m0.020s
sys     0m0.006s

(Параметры интерпретатора Perl загружают довольно большой модуль CGI, а затем выполняют строку кода '0;'.)

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

У вас уже есть работающее приложение. Очевидно, вы хотите вызвать функцию, предоставленную еще из нескольких источников. Для меня это похоже на описание услуги (может быть, проще в обслуживании).

Наконец, вы также упомянули, что это часть более крупного решения, тогда вы можете захотеть повторно использовать язык, возможности более крупных решений. Из приведенного вами описания (xml + http) кажется вполне обычным приложением, которое можно написать на любом универсальном языке (может быть, веб-контейнер на java?).

Некоторые библиотеки могут помочь вам сделать ваш код переносимым: Способствовать росту, Qt

более подробная информация может вызвать больше идей :)

Портируйте свое приложение на Ruby. Если ваше приложение слишком медленное, профилируйте его и перепишите эти части на C.

Другие вопросы по теме