Чому люди кажуть, що Рубі повільний? [зачинено]


184

Мені подобається Ruby on Rails, і я використовую його для всіх своїх веб-проектів. Кілька років тому було багато розмов про те, як Рейлс був свиней пам’яті, і про те, як вона не дуже масштабується, але Грегг Поллак тут поклав ці пропозиції .

Однак останнім часом я чую, як люди казали, що Рубі сама повільна.

  • Чому Рубі вважають повільним?

Я не вважаю, що Ruby є повільним, але знову, я просто використовую його для створення простих додатків CRUD та блогів компаній. Якими проектами мені потрібно було б займатися, перш ніж я побачу, що Рубі стає повільною? Або це повільність просто щось, що впливає на всі мови програмування?

  • Які ваші варіанти як програміста Ruby, якщо ви хочете мати справу з цією "повільністю"?

  • Яка версія Ruby найкраще відповідатиме такій програмі, як Stack Overflow, де швидкість є критичною, а трафік - інтенсивним?

Питання суб'єктивні, і я розумію, що архітектурна настройка (EC2 проти автономних серверів тощо) має велику різницю, але я хотів би почути, що люди думають про Рубі повільно.

Нарешті, я не можу знайти багато новин про Ruby 2.0 - я вважаю, що ми знаходимося за кілька років від цього?




окрім чудових відповідей, жоден із них насправді не відповідає ЧОМУ. кращі розуміння є у спорідненому питанні, згаданому Накілоном
Андре Фігейредо

Відповіді:


184

Чому Рубі вважають повільним?

Тому що якщо ти запускаєш типові орієнтири між Ruby та іншими мовами, Ruby програє.

Я не вважаю, що Ruby є повільним, але знову, я просто використовую його для створення простих додатків CRUD та блогів компаній. Якими проектами мені потрібно було б займатися, перш ніж я побачу, що Рубі стає повільною? Або це повільність просто щось, що впливає на всі мови програмування?

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

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

Які ваші варіанти як програміста Ruby, якщо ви хочете мати справу з цією "повільністю"?

Перехід на швидшу мову. Але це несе витрати. Це вартість, яка, можливо, того варта. Але для більшості веб-додатків вибір мови не є важливим фактором, оскільки просто недостатньо обґрунтованого трафіку, використовуючи швидший мову, який потрібно розробити набагато більше.

Яка версія Ruby найкраще відповідатиме такій програмі, як Stack Overflow, де швидкість є критичною, а трафік - інтенсивним?

На це відповіли інші люди - JRuby, IronRuby, REE змусять частину вашої програми Ruby працювати швидше на платформах, які можуть дозволити собі VM. Оскільки часто не Ruby викликає повільність, а архітектуру комп'ютерної системи та архітектуру додатків, ви можете робити такі речі, як реплікація бази даних, кілька серверів додатків, балансування навантаження з зворотними проксі-серверами, кешування HTTP, memcache, Ajax, кешування на стороні клієнта тощо Нічого з цього матеріалу не є Рубі.

Нарешті, я не можу знайти багато новин про Ruby 2.0 - я вважаю, що ми знаходимося за кілька років від цього?

Більшість людей чекає на Рубі 1.9.1. Я сам чекаю Rails 3.1 на Ruby 1.9.1 на JRuby.

Нарешті, пам’ятайте, що багато розробників обирають Ruby, тому що це робить програмування більш радісним досвідом порівняно з іншими мовами і тому, що Ruby with Rails дозволяє кваліфікованим веб-розробникам дуже швидко розробляти програми.


3
після довгого розгляду я вирішив, що це найкраща відповідь. Дякую, мені подобається аналогія щодо програми обробки сигналів. Простіше зрозуміти, про що зараз люди говорять, після всіх цих корисних відповідей.
Stephenmurdoch

1
Так, вам було пару років від ruby ​​2, Ruby 2.0.0 Вийшов 24 лютого 2013
Morgan

3
Мій досвід використання Ruby 2.1 полягає в тому, що це приблизно на 25% швидше, ніж той самий додаток, який працює в Ruby 2.0
Matt Connolly

14
Мови не повільні і не швидкі, їх реалізація, перекладачі та укладачі:
Zelphir Kaltstahl

122

Перш за все повільніше щодо чого ? C? Пітон? Давайте отримаємо декілька цифр у грі « Комп’ютерна мова» .

Чому Рубі вважають повільним?

Залежить від того, кого ви запитуєте. Вам можуть сказати, що:

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

Але, знову ж таки, повільно щодо чого? Ruby 1.9 настільки ж швидкий, як Python та PHP (в межах 3-кратного коефіцієнта продуктивності) порівняно з C (що може бути до 300x швидше), тому вище (за винятком міркувань щодо нарізки, якщо ваша програма сильно залежатиме від цього аспекту ) багато в чому академічні.

Які ваші варіанти як програміста Ruby, якщо ви хочете мати справу з цією "повільністю"?

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

Яка версія Ruby найкраще відповідатиме такій програмі, як Stack Overflow, де швидкість є критичною, а трафік - інтенсивним?

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


1
Збір сміття сам по собі не обов'язково повільний, але збирання сміття МРТ є. Якщо вам потрібна швидша Ruby, ви також можете подивитися на JRuby, а також на REE.
Андреас

1
@igouy, Правда, середина 2008 року, можливо, була надзвичайною. Я оновив посилання, але вони, у свою чергу, застаріли через кілька місяців. :) Так чи інакше, апаратне забезпечення та деякі патч-рівні могли бути різними, і було додано кілька додаткових тестів, але більша картина речей не змінилася.
vladr

11
>> в межах одного і того ж порядку величини << Це в межах одного порядку величини, якщо ви доживаєте до 7 або живете до 69. Чи є ця різниця незначною?
igouy

10
@igouy, я не знаю про тебе, але я не є програмою для вимірювання моєї тривалості життя з точки зору швидкості виконання. Наприклад, коли я НЕ дбаю про швидкість виконання, наприклад, час відображення відповіді HTTP. Я знаю, що я не помічаю різниці між часом візуалізації 7 мс і 69 мс (особливо при їзді понад 130 мс затримки в мережі). Я ВАМ знаю, що я помічу різницю між 7 мс і 700 мс, і Я СПОСОБНО зауважую різницю між 7 мс і 7 с - але ні, не між 7 мс і 69 мс.
vladr

3
@vladr, що з 70мс або 700мс? Ви можете помітити цю різницю?
Пол Дрейпер

60

Ось що сказав творець Рейлів Девід Хайнмейер Хансон :

Rails [Ruby] для переважної більшості веб-додатків досить достатньо. У нас є сайти, які роблять мільйони динамічних переглядів сторінок на день. Якщо ви опинитесь на титульній сторінці Yahoo або Amazon, навряд чи позакласні рамки будь-якою мовою принесуть вам багато користі. Вам, мабуть, доведеться закатати своє. Але звичайно, я також хотів би безкоштовних циклів процесора. Мені просто трапляється набагато більше турбуватися про безкоштовні цикли розробників, і я готовий торгувати першим за останній.

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

Ruby 1.9 - це величезне покращення порівняно з 1,8. Найбільшими проблемами у Ruby 1.8 є його інтерпретована природа (немає байт-коду, ніякої компіляції), і виклики методу, одна з найпоширеніших операцій у Ruby, є особливо повільними.

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

Якби я писав популярну веб-програму в Ruby, я зосереджувався б на кешуванні. Кешування сторінки скорочує час обробки цієї сторінки до нуля незалежно від мови, якою ви користуєтесь. Для веб-додатків накладні дані та інші введення-виведення починають мати значення набагато більше, ніж швидкість мови, тому я б зосередився на оптимізації цього.


7
"Зрештою, мало хто пише веб-додатки на C." - Звичайно, ні, але багато критичних для продуктивності веб-сайтів перейшли, наприклад, до Scala.
Даріо

6
Я не погоджуюся з тим, що "кидати на це більше обладнання" дешевше. Важко переконати клієнтів, що вони повинні платити більше грошей за хостинг кожні X місяців, оскільки їх платформа була розроблена для розробників на увазі.
Кевін

9
@Keven: напевно витрати на розробку будуть зменшені? Інакше який би був сенс використання Рубі в першу чергу?
rjh

4
@Kevin Це твердження трохи широке. Якщо вам потрібно буде створити новий сервер для кожні 10% збільшення трафіку або близько того, приблизно 100 відвідувань на день, замовник, очевидно, має право на скаргу. Реально, однак, як правило, потрібно мати набагато більше трафіку для початку і збільшити його на порядок, перш ніж старе обладнання не зможе вже впоратися. У цей момент тема переходить на територію "непогана проблема", і навряд чи хтось скаржиться на оновлення обладнання. Крім того, жоден "замовник" не працює на такому веб-сайті з високим трафіком, не знаючи про подібні речі.
деге

5
@Kevin - давайте перевернемо це. "Важко переконати клієнтів, що вони повинні чекати 3 місяці на нову функцію, оскільки їх платформа була розроблена з урахуванням комп'ютерів". Якщо ця нова функція різко збільшить дохід, вона заплатить за додаткове обладнання. Крім того, вибір швидкої мови з самого початку є для багатьох застосувань передчасною оптимізацією. Цілком ймовірно, що вузьке місце буде десь іншим: база даних читає, затримка в мережі тощо
Натан Лонг

34

Введення коду відбувається повільно. Читання коду відбувається повільно. Пошук та виправлення помилок відбувається повільно. Додавання функцій та вдосконалень відбувається повільно. Все, що покращиться на попередньому - це виграш. Дуже рідко проблема виконання.


30
@GregS: продуктивність виконання завжди є проблемою, якщо вона впливає на зручність використання. Щоправда, сканування файлу XML на рядок за одну секунду чи три не має значення з точки зору чистого числа, але різниця в декількох секундах може значно змінити зручність використання, коли ви говорите про додаток, орієнтований на користувача.
Брайан Оуклі

5
@Ajax: Ні, я думаю, що це ваша перемогла особистість.
Президент Джеймс К. Полк

15
Мій рекорд досі - це економія компанії $ 30 000 / рік за один день роботи. Їхні інженери вирішили, що легше читати, щоб алгоритм хмарних обчислень підраховував кількість завдань, виконаних на кожній ітерації, викликаючи n! запити на робочі місця з 20 000+ одиницями роботи. Змінивши це, щоб перевірити, чи не залишився 1 робочий предмет, скинув його на n запитів і скоротив рахунок від 130 доларів на день до 20 доларів на день. Ледачі кодери заробляють мені гроші. Будь ласка, заохочуйте більш ліниві кодери.
Аякс

10
Смішно, що ви коментуєте саме зараз ... Я перейшов до іншої компанії, де нам просто довелося витягнути п'ятнадцять розробників з функцій і на ефективність, оскільки великий американський банк відмовляється підписувати багатомільйонний контракт, поки система може впоратися з їх навантаженням. Їм подобаються функції, які ми маємо, тільки не швидкість, з якою вони виконують. Якщо ви досить довго ігноруєте продуктивність, не має значення, які функції у вас є, оскільки вони будуть неприпустимо повільними .
Аякс

4
Ефективність виконання - це завжди проблема, скільки саме питання - це те, про що ми говоримо. Скільки інтерпретованого коду можна запустити на мобільний телефон, перш ніж користувачі перестануть купувати ваш додаток, оскільки він вбиває батареї? Скільки часу користувач чекатиме завантаження вашої сторінки, перш ніж закривати оголошення, позбавляючи вас доходу від реклами? Дайте відповіді на подібні запитання, і ви наскільки важливі для виконання виконання.
Sqeaky

15

Відповідь проста: люди кажуть , що рубін повільно , тому що це повільно на основі виміряних порівнянь з іншими мовами. Майте на увазі, хоча "повільний" відносний. Часто рубін та інші "повільні" мови досить швидко.


Так, я про це думав, я маю на увазі, люди кажуть, що це повільно, але це все одно швидко
пронизує

11
>> все ще швидко проклята для моїх вимог << Досить швидко для всього, що не потрібно бути швидким :-)
igouy

Я частково упереджений з цього приводу, можливо, Кокс це застарілий коментар. тепер у нас є рубін 2.3, і з досвіду рубіну 2.2 я виявив, що стек рейок важкий. якщо їм потрібна швидша рамка, спробуйте pidrano, заснований на синатрі, і вони намагалися виконати якомога ближче до команди рейлів, але набагато легше. але вони ще не досягли версії 1.0, ще попереду, але з мого тесту, це працює добре і швидко. Я працюю з активним записом 5 і зірочками pidrano, запозиченими з рейок. При 200 одночасних з'єднаннях я отримую відповідь 1,5 секунди без db-запиту, з активами зірочок
Джеймс Тан

5

Joel on Software - Ruby Performance Revisited досить добре пояснює це. Можливо, застаріла ...

Я рекомендую просто дотримуватися цього, як ви звикли до Ruby on Rails,
якщо ви коли-небудь зіткнетеся з проблемою продуктивності, ви можете переглядати використання іншої мови та рамки.

У такому випадку я б дуже запропонував C # з ASP.NET MVC 2 , дуже добре працює для додатків CRUD.


Дякую за посилання, мені завжди подобається читати прийом Джоеля про речі. Цікаве зауваження, яке він висловлює про "гасло" наклейки на бампер "
DHH

Цитата: " Це стосується не всіх, але коли люди кажуть, що вони мають проблеми з продуктивністю з Ruby або що їм просто потрібно мати змогу запускати код швидше, ніж основний мовний механізм Ruby може це запустити, це не допомагає мати Рубі виступає за спів гімнів щодо циклів розробників проти циклів процесора ".
Марк.2377,

3

Я б сказав, що Рубі повільний, оскільки не було витрачено багато зусиль, щоб зробити перекладача швидше. Те саме стосується і 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 ...


Я думаю, що це тому, що в Python вже є своє місце і він зараз активно використовується. Якщо вам потрібна висока продуктивність, існує багато бібліотек, якими ви можете користуватися або ткати та інші речі, які ви можете використовувати.
Зельфір Кальтшталь

З того, що я прочитав, деякі зусилля вже дали хороші результати в Ruby 2.5.
Марк.2377,

2

Перш за все, вам байдуже, що говорять інші про мову, яка вам подобається? Коли він виконує роботу, яку повинен виконувати, у вас все добре.

OO - це не найшвидший спосіб виконання коду, але він допомагає створити код. Смарт-код завжди швидший, ніж німий код і марні петлі. Я DBA і бачу багато цих непотрібних циклів, скидаю їх, використовую кращий код і запити, а застосування швидше, набагато швидше. Вас хвилює остання мікросекунда? Можливо, у вас є мови, оптимізовані для швидкості, інші просто виконують роботу, яку вони повинні робити, і її можуть підтримувати багато різних програмістів.

Це все лише вибір.


2

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

У невеликому проекті ви не відчуваєте жодної повільності (я маю на увазі, поки не подобається <50K користувачів), враховуючи, що в коді не використовуються складні обчислення, а лише основні матеріали.

Для більшого проекту оплата ресурсів окупається і дешевша, ніж зарплата розробника. Крім того, написання коду на RoR виявляється набагато швидшим, ніж будь-який інший.

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


2

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

АРХИТЕКТУРА

Це зробити простіше в Rails, ніж у більшості інших веб-фреймів.

На рівні програми , кешуючи все, що належить кешувати, та керуючи доступом до БД інтелектуальним способом (оскільки вузьке місце зазвичай знаходиться у доступі «БД» для більшості програм WEB).

Рейки дозволяють вирішити ці проблеми дуже просто і природно. Існує кілька абстракцій для кешування даних, сторінок та фрагментів , а також є дуже приємні абстракції для роботи з частиною SQL оптимізованим та багаторазовим використанням ( Active Record та AREL ).

Це причина, чому так багато додатків, написаних швидшими та не настільки експресивними мовами (як, наприклад, php), закінчуються повільніше, ніж колеги Ruby. Не так просто та елегантно вирішувати кешування та запити цими мовами, ніж це для Ruby.

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


1

Ruby повільніше, ніж C ++, у ряді легко вимірюваних завдань (наприклад, виконання коду, який сильно залежить від плаваючої точки). Це не дуже дивно, але достатньо виправдання для того, щоб деякі люди сказали, що "Рубі повільний" без кваліфікації. Вони не вважають, що писати Ruby-код набагато простіше і безпечніше, ніж C ++.

Найкраще виправити використання цільових модулів, написаних іншою мовою (наприклад, C, C ++, Fortran) у вашому Ruby-коді. Вони можуть зробити важкий підйом, і ваші сценарії можуть зосередитись на питаннях координації вищого рівня.


Порівняння часто проводяться з Java, C #, Python, можливо, Perl, а не C ++.
rjh

5
Звичайно. Але я можу запевнити вас (як розробника Tcl), що люди завжди будуть порівнювати вас з іншими мовами несправедливо. Виправлення полягає у використанні інших мов для компонентів, які ви зшиваєте разом; робити все це однією мовою - це трохи схоже на використання єдиного інструменту для всіх завдань. Якщо у вас є молоток, все виглядає як великий палець.
Стипендіати Дональ

приємна ідея використання модулів іноземних мов, коли вони знадобляться
Stephenmurdoch

>> сказати, що "Рубі повільний" без кваліфікації << Пару років тому вони, можливо, продовжували показувати програми Ruby, які були повільнішими, ніж програми Tcl :-)
igouy

1
Ви знаєте, що вони говорять про брехуни, прокляті брехні та тести. ;-)
стипендіати Дональ

0

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


0

Люди кажуть, що Ruby повільний, оскільки вони порівнюють програми Ruby з програмами, написаними іншими мовами. Можливо, програми, які ви пишете, не повинні бути швидшими. Можливо, для програм, які ви пишете Ruby, це не вузьке місце, яке уповільнює справи.

Ruby 2.1 порівняно з Javascript V8

Ruby 2.1 порівняно зі звичайним Lua

Ruby 2.1 порівняно з Python 3


-5

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.