Зачем использовать сценарий Groovy shell над Bash (когда важен объем памяти)? [закрытый]
У меня есть скрипт Bash (50 строк кода), который требует немного взлома из-за ограничений bash. Поэтому кто-то сказал: "Эй, используйте для этого лучший язык, чем Баш!"
Итак, я посмотрел на Groovy (Groovy/Grails следующий в моем списке, поэтому, возможно, это хорошее время). Я могу делать более сложные сценарии оболочки, так что это может быть идеально подходит.
но когда я запускаю даже простой скрипт Groovy (while(true){...}
) потребление памяти процесса Java составляет 123M, ой, У меня есть около 10 таких сценариев для запуска (все bash на основе сейчас) на коробке с 650M памяти. Эквивалентный автономный скрипт bash работает примерно в 1,5 м памяти.
Так это случай:
- Я новичок, делающий что-то не так, след памяти 123M не нужен?
- Groovy не подходит здесь? Возможно, Python или Perl более сознательны в памяти?
- Баш хороший вариант, даже для своих недостатков, когда небольшой след ноги важно?
6 ответов
если память ограничена таким образом, то любой язык, работающий на JVM, будет в невыгодном положении. И Groovy-такой язык.
другие языки, такие как Python или Perl, имеют более скудную среду выполнения и требуют меньше памяти для простых скриптов (я предполагаю, что Python все еще немного скуднее, чем Perl, но я не могу создать резервную копию с числами).
на мой взгляд, Python-хороший шаг вперед от скриптов bash, предоставляя гораздо более приятные функции, но при этом достаточно скудный для использования в обычных сценариях.
bash сам по себе является хорошим языком сценариев с разумным требованием к памяти. Если объем памяти действительно важно, чем другая POSIX-совместимая оболочка (например,тире) может быть разумной заменой. Обратите внимание, что многие, но не все функции bash
присутствуют в современных POSIX-совместимых оболочек.
вот формула:
- используйте Bash для скриптов, которые просто тыкать и щекотать другие программы.
- избегайте Perl, если вы не воображаете себя архаичным твердолобым хакером.
- использовать Python или Ruby для скриптов, которые автоматизируют легкие задачи.
- используйте Groovy или Scala для сценариев, которые автоматизируют тяжелые задачи.
Groovy и Scala излишни для тривиальных задач, но находка для ситуаций бульдозера - серьезные сценарии сделайте JVM довольно экономным.
когда вы запускаете и приложение, которое работает на JVM, вы должны иметь возможность настроить такие вещи, как размер кучи и пространство permgen, которые должны повлиять на объем памяти. Если вам нужно написать на Java или Groovy или Jython или JRuby или Scala, найдите, как это можно установить для вашего приложения.
да, языки на основе JVM известны потреблением памяти, такие как 8-байтовые накладные расходы для объектов и необходимость заполнения, что делает целочисленные объекты требуют намного больше памяти, чем вы думаете (смотреть здесь :-)). Однако JVM предлагает много преимуществ: большинство JVMs были высоко настроены и оптимизированы за последние 15 лет действительно умными людьми (можете ли вы написать сборщик мусора это хороший?). И платформа Java просто огромна. В нем есть все.
являются ли ваши 10 сценариев длительными и должны быть резидентами памяти одновременно? Или они быстро бегут? Поскольку вы уже написали их в bash, это похоже, вам не нужна богатая платформа Java. Вы просто перемещаете файлы, режете и греппинг, а также awking и sedding?
AAS эмпирическое правило мне нравится Bash для небольших скриптов, но как только я доберусь до точки, где у меня есть циклы или два и несколько переменных (в основном все, что связано с логикой, кроме оператора if), Ruby и Python начинают выглядеть намного проще читать и поддерживать. Groovy не обязательно является плохим выбором (хотя другие языки более популярный.) Но что касается проблем с памятью, вы должны потратить время, чтобы попытаться настроить свои приложения на основе JVM и сделать некоторые измерения. В твоей ситуации это может не иметь большого значения. Возможно, время запуска JVM играет роль фактора? Многое зависит от конкретной ситуации.
Java вообще имеет проблемы, когда вы хотите запустить quickie в командной строке. У меня был большой успех, используя (и расширяя) инструмент под названием Nailgun. Он в основном запускает один экземпляр JVM и использует собственный клиент для передачи сценариев или основных команд на сервер для оценки, а выходные потоки преобразуются в стандартный вывод командной строки. Результаты довольно впечатляющие.
Также см. Этот почта. К цитата:
вот пример времени запуска JRuby на OS X Java 6, первый нормальный и затем с НГ:
нормальный:
~ / NetBeansProjects / jruby $ time jruby-e "ставит" привет "" привет
реальный 0m1.944s пользователь 0m1.511s sys 0m0.138s
nailgun:
~ / NetBeansProjects / jruby $ time jruby-e "ставит" привет "" привет
real 0m0.103S пользователь 0m0.006s sys 0m0.009s
Как вы сказали, используйте python или perl, для таких вещей они имеют гораздо меньший объем памяти.
имейте в виду, что" groovy "- это просто скрипт-оболочка, который запускает " java-CP groovy.jar:$CLASSPATH " или что-то подобное. Это означает, что вы должны проверить, есть ли флаги JVM, которые влияют на предварительно выделенную память, и соответственно изменить их. А еще эти скритпы называют друг друга? Если это так, попробуйте сделать их классами groovy и попробуйте запустить их все в одной виртуальной машине.