Ruby Efficiency - PullRequest
       12

Ruby Efficiency

1 голос
/ 03 марта 2012

Я просто слушал лекцию на Coursera (https://www.coursera.org/saas/)), и профессор говорил, что все в Ruby является объектом, и что каждый вызов метода вызывает метод send для объекта, передавая ему несколько параметровЭто включает в себя числа, массивы и другие базовые классы.

Я пошел в Google и искал критерии эффективности и обнаружил следующее: http://benchmarksgame.alioth.debian.org/u32/which-programs-are-fastest.html

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

Даже если есть способ скомпилировать код ruby ​​(я не исследовал эту тему), я думаю, что эффективностьпроблема все еще будет существовать из-за основной «проблемы» в языке: базовые операции слишком тяжелы: 1 + 1 требует много больше циклов ЦП.

Я люблю Ruby. Я люблю аспект высокого уровняметапрограммирования, и я думаю, что это должно быть будущее, и я согласен, иногда нам нужно идти на компромиссЭто определенная вещь для того, чтобы быть более эффективной: я не вижу себя оптимизирующим мой код в сборке, чтобы сэкономить несколько лишних миллисекунд.Однако, когда мы делаем 1 + 1 в C, это не увеличивает экспоненциально количество времени, которое занимает базовая операция!

Мой вопрос: как вы, ребята, имеете дело с программами, интенсивно работающими?У нас есть проект Ruby on Rails, который мы разрабатывали уже около года, и сейчас мы приступаем к некоторому машинному обучению с обходом геолокации и установлением приоритетов.

Надеюсь, вы понимаете мои проблемы ипредложить разумные предложения: -)

1 Ответ

4 голосов
/ 04 марта 2012

Это не такой плохой вопрос, как кажется, глядя на комментарии. Единственная проблема - неправильно используемое слово экспонента , но описанная проблема реальна.

У меня есть схожие шаблоны использования Ruby, которые вы описываете - я выполняю большую обработку естественного языка в Ruby, которая также включает в себя машинное обучение. Для преодоления проблем с производительностью Ruby я использую следующие методы:

  1. При необходимости используйте библиотеки C с интерфейсом Ruby. Например. Я бы не стал использовать реализацию SVM или деревья решений в Ruby, поскольку в Си есть гораздо более быстрые реализации.

  2. Напишите мои собственные оболочки Ruby для реализации на C, если они недоступны. Обычно это не очень проблематично - я широко использую RubyInline gem для склеивания Ruby с кодом C.

  3. Патч Управление памятью Ruby или ручное управление сборщиком мусора.

  4. Рассматривайте JRuby как свою платформу Ruby - вы получите легкий доступ к быстрым библиотекам Java для машинного обучения (Weka), а также общая производительность вашего приложения будет сохранена или даже выше

...