Предисловие Только что я слушал Рубиновый подкаст NoName (кстати, очень всем рекомендую), в котором я услышал новость о том, что МакРуби 0.5 вышла из стадии бета-тестирования.
Докладчики также сообщили, что в пакет MacRuby входит отличный компилятор Ruby — MacRubyC, который теперь может компилироваться в динамические библиотеки.
Естественно, мне стало интересно, и я решил поэкспериментировать.
Процесс
Так что же нам делать? Зайдите на официальный сайт MacRuby и скачать последняя версия пакета.Распакуйте архив и установите его.
Далее запустите Терминал и попробуйте:
Все работает? Большой.
Теперь попробуем компилятор MacRubyC. Для этого нам понадобится любой файл .
rb, например hello.rb, содержащий всего одну строку: puts "Hello world!"
Пишем в терминале: macrubyc hello.rb -o hello
Результатом является аккуратный исполняемый файл, который можно легко запустить как обычное приложение Unix:
Однако если мы попробуем запустить нашу программу на другой машине, на которой не установлен MacRuby, результат будет неутешительным — в программе отсутствует динамическая библиотека MacRuby:
Выход есть — статическая компиляция.
Но и здесь не все так просто: если у вас нет ЛЛВМ , то программа не скомпилируется:
Самое логичное решение — установить вот этот самый LLVM: svn co -r 82747 llvm.org/svn/llvm-project/llvm/trunk llvm-trunk
cd llvm-trunk
.
/configure
UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 make -j2
sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" ENABLE_OPTIMIZED=1 make install
Заранее предупреждаю, LLVM собирается довольно долго; это заняло у меня около часа.
Наиболее вкусный
Наши программы легко можно скомпилировать статически и, соответственно, запустить на чужой машине.Это потрясающе.
Что ж, давайте проведем небольшое исследование.
Во-первых, размер: исходный код hello.rb составляет всего 19 байт. Если мы посмотрим на размер первого бинарника, то увидим, что он весит всего 13,6 килобайт. Не так много, как может показаться.
Но мы скомпилировали его динамически! Давайте посмотрим на размер статически скомпилированного бинарного файла — 14,3 мегабайта! Но это всего лишь «Привет, мир».
Однако особо волноваться не стоит: ведь с увеличением объёма кода размер исполняемого файла увеличится не так сильно.
Совершенно очевидно, что в этих 14 мегабайтах находятся библиотеки, которые программа нечаянно тащит за собой.
Теперь перейдем к самому интересному — производительности.
Для измерения производительности напишем программу, состоящую всего из одной строки: 10000000.times { |i| puts i }
Затем мы скомпилируем нашу программу статически и динамически соответственно с опцией --статический и без этого: macrubyc cycle.rb -o cycle
macrubyc cycle.rb --static -o cycle-static
Чтобы увидеть, насколько быстро (или медленно) выполняются наши программы, мы воспользуемся встроенной утилитой измерения времени Unix.
Замеры проводились несколько раз, но результат в целом был один и тот же.
Что мы видим? Мы видим, что программа, выполняемая интерпретатором, выполняется почти на порядок быстрее, чем автономная программа.
В то же время статическая компиляция выигрывает на несколько секунд по сравнению с динамической компиляцией.
А если взять более серьезные тесты, например, Функция Мандельброта , то все становится на свои места: скомпилированная программа работает на порядок быстрее — всего 0,32 секунды, а интерпретируемая — примерно 8 секунд. Аналогичные результаты наблюдаются, если принять в качестве тестовой функции Функция Такеючи (около 21 секунды при интерпретации и 0,5 секунды при компиляции):
Вместо послесловия
Вот и все, собственно.В целом выводы неоднозначные: с одной стороны, скомпилированная программа отстает в линейных случаях, с другой стороны, при компиляции используется хорошая оптимизация, которая дает хорошие результаты в более сложных случаях.
Однако решение об использовании компиляции в ваших проектах остается за вами.
Теги: #ruby #macruby #macrubyc #компиляция #ruby #компиляция #ruby
-
Производитель Этикеток Для Компакт-Дисков
19 Oct, 24 -
Новые Возможности Amazon Для Сервиса Ec2
19 Oct, 24 -
Небольшое Объявление
19 Oct, 24 -
Как Я Перестал Бояться И Заново Изобрел Qml
19 Oct, 24 -
Онлайн Репетитор По Python
19 Oct, 24 -
Алиса — Rest-Мониторинг Rabbitmq
19 Oct, 24 -
Как Откатить Коммиты На Github.com
19 Oct, 24