Почему люди говорят, что Ruby работает медленно?

Мне нравится Ruby on Rails, и я использую его для всех своих проектов веб-разработки. Несколько лет назад было много разговоров о том, что Rails - это боров памяти, и о том, как он не очень хорошо масштабируется, но эти предложения были уложены Греггом Поллаком здесь.

В последнее время я слышал, как люди говорили, что сам Ruby работает медленно.

  • Почему Ruby считается медленным?

Я не считаю Ruby медленным, но опять же, я просто использую его для создания простых приложений CRUD и блогов компании. Какие проекты мне нужно было бы сделать, прежде чем Ruby станет медленным? Или эта медлительность влияет на все языки программирования?

  • Какие у вас есть возможности программиста на Ruby, если вы хотите справиться с этой "медлительностью"?

  • Какая версия Ruby лучше всего подойдет для такого приложения, как Stack Overflow, где скорость критична, а трафик интенсивен?

Вопросы субъективны, и я понимаю, что архитектурная настройка (EC2 против автономных серверов и т. Д.) Имеет большое значение, но я хотел бы услышать, что люди думают о том, что Ruby работает медленно.

Наконец, я не могу найти много новостей о Ruby 2.0 - я так понимаю, что через несколько лет у нас это получится?

14 ответов

Решение

Почему Ruby считается медленным?

Потому что если вы запускаете типичные тесты между Ruby и другими языками, Ruby проигрывает.

Я не считаю Ruby медленным, но опять же, я просто использую его для создания простых приложений CRUD и блогов компании. Какие проекты мне нужно было бы сделать, прежде чем Ruby станет медленным? Или эта медлительность влияет на все языки программирования?

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

Помните, что большая часть обработки ваших веб-приложений на самом деле выполняется программным обеспечением, разработанным на C. Например, Apache, Thin, Nginx, SQLite, MySQL, PostgreSQL, многие библиотеки синтаксического анализа, RMagick, TCP/IP и т. Д. - это программы на C, используемые Ruby., Ruby обеспечивает клей и бизнес-логику.

Какие у вас есть возможности программиста на Ruby, если вы хотите справиться с этой "медлительностью"?

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

Какая версия Ruby лучше всего подойдет для такого приложения, как Stack Overflow, где скорость критична, а трафик интенсивен?

Другие люди ответили на это - JRuby, IronRuby, REE заставят Ruby-часть вашего приложения работать быстрее на платформах, которые могут позволить себе виртуальные машины. И поскольку медлительность часто вызывается не Ruby, а архитектурой вашей компьютерной системы и приложений, вы можете выполнять такие вещи, как репликация базы данных, несколько серверов приложений, балансировка нагрузки с помощью обратных прокси-серверов, кэширование HTTP, memcache, Ajax, кэширование на стороне клиента и т. Д. Ничто из этого не относится к Ruby.

Наконец, я не могу найти много новостей о Ruby 2.0 - я так понимаю, что через несколько лет у нас это получится?

Большинство людей ждут Ruby 1.9.1. Я сам жду Rails 3.1 на Ruby 1.9.1 на JRuby.

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

Прежде всего, медленнее в отношении чего? C? Python? Давайте возьмем некоторые цифры в игре "Тесты компьютерного языка":

Почему Ruby считается медленным?

Зависит от того, кого вы спрашиваете. Вам может быть сказано, что:

  • Ruby - это интерпретируемый язык, и интерпретируемые языки будут работать медленнее, чем скомпилированные.
  • Ruby использует сборку мусора (хотя C#, который также использует сборку мусора, выходит на два порядка впереди Ruby, Python, PHP и т. Д. В более алгоритмических, менее ресурсоемких тестах выше)
  • Вызовы методов Ruby медленны (хотя из-за утки, возможно, они быстрее, чем в строго типизированных интерпретируемых языках)
  • Ruby (за исключением JRuby) не поддерживает настоящую многопоточность
  • и т.п.

Но, опять же, медленно по отношению к чему? Ruby 1.9 примерно так же быстр, как Python и PHP (с коэффициентом производительности в 3 раза) по сравнению с C (который может быть в 300 раз быстрее), поэтому приведенное выше (за исключением соображений о многопоточности, должно ли ваше приложение сильно зависеть от этого аспекта)) в значительной степени академические.

Какие у вас есть возможности программиста на Ruby, если вы хотите справиться с этой "медлительностью"?

Пишите для масштабируемости и добавляйте больше оборудования (например, памяти)

Какая версия Ruby лучше всего подойдет для такого приложения, как Stack Overflow, где скорость критична, а трафик интенсивен?

Ну, REE (в сочетании с пассажиром) будет очень хорошим кандидатом.

Вот что сказал создатель Rails Дэвид Хайнемайер Ханссон:

Rails [Ruby] предназначен для подавляющего большинства веб-приложений. У нас есть сайты, которые делают миллионы динамических просмотров страниц в день. Если вы в конечном итоге окажетесь на главной странице Yahoo или Amazon, маловероятно, что готовая платформа на ЛЮБОМ языке будет вам полезна. Вам, вероятно, придется свернуть свой собственный. Но, конечно же, я бы тоже хотел бесплатные циклы процессора. Меня просто больше волнуют бесплатные циклы разработки, и я готов обменять первое на второе.

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

Ruby 1.9 - это значительное улучшение по сравнению с 1.8. Самыми большими проблемами в Ruby 1.8 является его интерпретируемая природа (без байт-кода, без компиляции), а вызовы методов, одна из самых распространенных операций в Ruby, особенно медленны.

Это не помогает, что почти все это поиск методов в Ruby - добавление двух чисел, индексация массива. Где другие языки выставляют хаки (Python's __add__ метод, Perl's overload.pm) Ruby во всех случаях выполняет чистый OO, и это может снизить производительность, если компилятор / интерпретатор недостаточно умен.

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

Написание кода идет медленно. Чтение кода идет медленно. Поиск и исправление ошибок происходит медленно. Добавление функций и улучшений происходит медленно. Все, что улучшается по сравнению с предыдущим, является победой. Очень редко возникает проблема с исполнением.

Ответ прост: люди говорят, что рубин медленный, потому что он медленный на основе взвешенных сравнений с другими языками. Имейте в виду, однако, "медленный" относительный. Часто ruby ​​и другие "медленные" языки достаточно быстрые.

Джоэл о программном обеспечении - Ruby Performance Revisited довольно хорошо это объясняет. Может быть устаревшим, хотя...

Я бы порекомендовал просто придерживаться этого, так как вы привыкли к Ruby on Rails,
если вы когда-нибудь столкнетесь с проблемой производительности, вы можете пересмотреть использование другого языка и структуры.

В этом случае я бы действительно предложил C# с ASP.NET MVC 2, очень хорошо работает для приложений CRUD.

Я бы сказал, что Ruby работает медленно, потому что на то, чтобы сделать переводчика быстрее, не было потрачено много времени. То же относится и к Python. Smalltalk такой же динамичный, как Ruby или Python, но работает на порядок лучше, см. http://benchmarksgame.alioth.debian.org/. Поскольку Smalltalk был более или менее заменен Java и C# (то есть, по крайней мере, 10 лет назад), для него больше не проводилась работа по оптимизации производительности, и Smalltalk по-прежнему намного быстрее, чем Ruby и Python. У сотрудников Xerox Parc и OTI/IBM были деньги, чтобы платить людям, которые работают над тем, чтобы сделать Smalltalk быстрее. Я не понимаю, почему Google не тратит деньги на то, чтобы сделать Python быстрее, потому что это большой магазин Python. Вместо этого они тратят деньги на развитие таких языков, как Go...

Ruby медленнее, чем C++, в ряде легко измеримых задач (например, при выполнении кода, который сильно зависит от плавающей запятой). Это не очень удивительно, но для некоторых достаточно оправдания, чтобы сказать, что "Рубин медленен" без квалификации. Они не считают, что писать код на Ruby намного проще и безопаснее, чем на C++.

Лучшее решение - использовать целевые модули, написанные на другом языке (например, C, C++, Fortran) в вашем коде Ruby. Они могут сделать тяжелую работу, и ваши сценарии могут сосредоточиться на вопросах координации более высокого уровня.

Очевидно, говоря о скорости, Руби проигрывает. Несмотря на то, что тесты производительности показывают, что Ruby не намного медленнее, чем PHP. Но взамен вы получаете простой в обслуживании DRY-код, лучший из всех фреймворков на разных языках.

Для небольшого проекта вы не почувствуете никакой медлительности (я имею в виду до тех пор, пока пользователи не будут <50K), учитывая, что в коде не используются никакие сложные вычисления, а только мейнстрим.

Для более крупного проекта оплата ресурсов окупается и дешевле, чем заработная плата разработчиков. Кроме того, написание кода на RoR оказывается намного быстрее, чем на любом другом.

В 2014 году величина разницы в скорости, о которой вы говорите, для большинства веб-сайтов незначительна.

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

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

Это всего лишь выбор.

Способ работы с Ruby в веб-приложении такой же, как и в любом другом языке программирования:

АРХИТЕКТУРА

Это проще сделать в Rails, чем в большинстве других веб-фреймворков.

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

Rails позволяет очень легко и естественно решить эти проблемы. Есть несколько абстракций для кэширования данных, страниц и фрагментов, а также есть очень хорошие абстракции для работы с SQL-частью оптимизированным и многократно используемым способом ( Active Record и AREL).

Это причина того, что так много приложений, написанных на более быстрых и не очень выразительных языках (таких как php), в конечном итоге работают медленнее, чем аналоги Ruby. С этими языками справиться с кешированием и запросами не так просто и элегантно, как с Ruby.

На уровне инфраструктуры разумно подумать о балансировке нагрузки и обо всем этом, о чем мне не так много известно. Я бы передал эту проблему на аутсорсинг, наняв платформу в качестве поставщика услуг, например Heroku или Engine Yard. Тем не мение. Развертывание рельсов с балансировкой нагрузки, вероятно, не очень сложно сделать.

Люди говорят, что Ruby работает медленно, потому что они сравнивают программы на Ruby с программами, написанными на других языках. Может быть, программы, которые вы пишете, не должны быть быстрее. Возможно, для программ, которые вы пишете, Ruby не является узким местом, которое замедляет работу.

Ruby 2.1 по сравнению с Javascript V8

Ruby 2.1 по сравнению с обычным Lua

Ruby 2.1 по сравнению с Python 3

Производительность почти всегда зависит от хорошего дизайна и оптимизированного взаимодействия с базой данных. Ruby делает то, что нужно большинству веб-сайтов, довольно быстро, особенно в последних версиях; а скорость разработки и простота обслуживания обеспечивают высокую окупаемость затрат и удовлетворение клиентов. Я нахожу, что JAVA имеет низкую производительность выполнения для некоторых задач, и, учитывая сложность разработки в JAVA, многие разработчики создают медленные приложения независимо от теоретической возможности скорости, как продемонстрировано в тестах (тесты, как правило, изобретены, чтобы показать конкретную и узкую возможность). Когда мне нужна интенсивная обработка, которая не очень подходит для возможностей моей базы данных, я выбираю C, Objective-C или другой действительно высокопроизводительный скомпилированный язык для этих задач в зависимости от платформы. Если мне нужно создать веб-приложение на основе данных, я использую RoR или иногда C# ASP.NET в зависимости от других требований; потому что все платформы имеют свои сильные и слабые стороны. Скорость выполнения того, что делает ваше приложение, важна, но в конце концов, если важна производительность выполнения одного узкого аспекта языка; тогда я все еще мог бы использовать язык Ассемблера для всего.

Ruby хорошо работает для производительности разработчиков. Ruby по своей природе заставляет тестировать управляемую разработку из-за отсутствия типов. Ruby хорошо работает, когда используется в качестве оболочки высокого уровня для библиотек Си. Ruby также хорошо работает во время длительных процессов, когда JIT-компилируется в машинный код через JVM или Rbx VM. Ruby не очень хорошо работает, когда требуется за короткий промежуток времени обработать числа чистым рубиновым кодом.

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