Про продуктивність та взаємодію Java: Clojure проти Scala


82

Я вже читав різні розповіді про Clojure проти Scala, і хоча я розумію, що обидва мають своє місце. Є кілька міркувань, щодо яких я не отримав повного пояснення щодо порівняння обох Clojure та Scala:

1.) Яка з двох мов, як правило, швидша ? Я усвідомлюю, що це буде різнитися залежно від особливостей мови, але загальна оцінка ефективності буде корисною. Наприклад: Я знаю, що словники Python дійсно швидкі. Але в цілому це набагато повільніша мова, ніж Java. Я не хочу їхати з Клоджуре і натрапити на цю проблему по дорозі.

2.) Як взаємодіє з Java? Все, що я досі читав, - це те, що Scala має власні типи колекцій, які роблять трохи незграбним інтегрування з великою базою коду Java, тоді як Clojure дотримується простого Iterable / Iterator-centric-способу взаємодії з класами Java. Є ще думки / подробиці з цього приводу?

Зрештою, якщо це достатньо близька нічия між клоджуре та скалою, я можу спробувати їх обох. Одне в Clojure - це те, що мова здається дуже простою. Але знову ж таки, Scala має дуже гнучку систему типу. Але я знаю, що Scala працює швидко (на основі кількох особистих рахунків). Отже, якщо Clojure значно повільніший: я хотів би знати це швидше, ніж пізніше.


1
З Clojure 1.2 Clojure може телефонувати до Java без накладних витрат. Подивіться на assembla.com/wiki/show/clojure/Datatypes та assembla.com/wiki/show/clojure/New_new . Це робиться тому, що Clojure хоче бути близьким до Java, але реалізовано в Clojure.
nickik

Відповіді:


73

Я думаю, що будь-яка мова буде для вас досить швидкою. Порівнюючи Python та Java, здається трохи нерозумним звинувачувати мову в різниці швидкості. Java компілюється JIT (крім мобільних пристроїв *), тоді як Python інтерпретується. Те, що обидва використовують байт-код, не означає, що реалізації матимуть навіть віддалено порівнянну продуктивність. Але і Scala, і Clojure є мовами JVM, тому вони повинні мати однакову продуктивність.

Scala має кілька переваг впровадження перед Clojure, і я очікував би дещо вищої продуктивності. Хоча статична типізація Scala, як правило , перевести на перевагу в швидкості над качкою набравши Clojure, в Clojure робить тип підтримки натякаючи , яка може прискорити код значно. Можливо, звичайна Scala швидша за звичайну Clojure, але вам потрібно лише оптимізувати вузькі місця. Більша частина часу роботи програми генерується невеликою кількістю фактичного коду.

Що стосується взаємодії з Java, Scala ближче до Java, але я впевнений, що обидві мови добре взаємодіють. У програмуванні Clojure Stuart Halloway пише: "[ви можете отримати доступ] до всього, що ви могли отримати за допомогою коду Java. ".

І оскільки автор "Scala" Мартін Одерський написав компілятор Java Sun, я, здається, не мав жодних куль на стороні Scala. :-)

Вам важко вибрати дві кращі мови, хоча мені також подобається Рубі. Чому вас турбує, який із них спробувати? Чому б не спробувати їх обох? Scala, швидше за все, стане "наступною Java", хоча важко уявити, що Lisp нарешті злетить, не роблячи цього більше 50 років. Але зрозуміло, що Lisp має власний унікальний рівень абстракції, а Clojure досить простий, тому Scala + Clojure буде не набагато складнішим, ніж просто (досить складна) Scala, і я впевнений, ви будете раді, що зробили це.

І щодо цього вони взаємодіють ...

* dalvik (андроїд JVM) отримав компілятор JIT у версії 2.2 у 2010 році


6
Га Ну, дякую за всі ідеї. Спочатку я був у режимі, коли хотів просто вибрати один і побігти з ним. Але мені чомусь не спало на думку, що я можу просто використовувати обидва і змусити їх взаємодіяти. Тож, можливо, я оберу обидва і з ними швидко прогуляюся :-)
Райан Делуччі,

7
І я хотів би додати, що у мене є дещо «м’яке місце» для ЛІСП, тому того, що Клоджуре страждає на паретезит, недостатньо, щоб мене відлякати.
Райан Делуччі,

8
Не завжди правда, що мова, написана в JVM, буде працювати з максимальною швидкістю. Оригінальний JRuby мав жахливу продуктивність, оскільки це був інтерпретатор, який був скомпільований до JVM, а не вихідний код. Мова також може бути винна. Статично набрані мови часто легше оптимізувати, ніж динамічні мови тощо
Білл К

7
-1 "і Scala, і Clojure - це мови JVM, тому вони повинні мати подібну продуктивність" абсолютно немає сенсу. Динамічні мови, які повинні залишатися сумісними зі статичними мовами, такими як Java, завжди набагато повільніші (перевантаження має величезну ціну,
натяк на

4
@julkiewicz - це просто неправда, що динамічні мови завжди набагато повільніші. Це залежить від того, чи зможе ваш компілятор гідно оптимізувати відповідний код. Наприклад, у Clojure ви можете робити арифметику з примітивами Java, яка точно відповідає продуктивності Java. Подібним чином, виклик методу на натяканий на об'єкт Java-об'єкт є таким же швидким, як виклик методу Java-об'єкта. Компілятор Clojure по суті виробляє той самий байт-код, що і javac для еквівалентного коду Java.
mikera

32

У даний час JVM Scala має перевагу завдяки статичному набору тексту, оскільки підтримка JVM для динамічного набору тексту - відображення - повільна. Насправді, одну особливість Scala, яка повинна бути реалізована за допомогою тих самих методів, типів конструкцій, часто застерігають від цієї саме причини.

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

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

Тому я хотів би скористатися Scala за обома цими рахунками. Clojure - це багато в чому краща мова , і він, безумовно, має дуже цікаві функції, яких немає (поки що) у Scala, але ви отримуєте такі переваги, працюючи повністю функціонально. Якщо ви маєте намір це зробити, тоді Clojure, швидше за все, краще. Якщо ви цього не зробите, то, мабуть, вам слід залишитися зі Скалою.


9
Функціональні особливості програмування clojure є найбільш вагомою причиною того, чому я розглядаю цю мову. Я доходжу до точки, коли: якщо я щось не кодую функціонально - чому я все одно заморочуюсь мовою сценаріїв, вбудованою в Java? У мене вже є на моїй стороні Python для швидких і брудних завдань.
Райан Делуччі,

9
Тоді йди з Клоджуре.
Даніель К. Собрал, 02

msgstr "мова сценаріїв, вбудована в Java". Будь ласка, обґрунтуйте.
Jus12,

@Daniel: Вибачте за плутанину. Я мав на увазі коментар до Райана Делуччі. Він каже, що Scala - це "мова сценаріїв, вбудована в Java", яку я не купую. (Хіба що він мав на увазі Клоджуре, про що я поняття не маю).
Jus12,

@ Jus12 Я розумів, що він використовує ці мови як мови сценаріїв JVM, і, враховуючи це, він не бачить у них жодної переваги над Python, якщо він не стане функціональним. Знову ж таки, я не він, тому я можу лише здогадуватися.
Daniel C. Sobral

20

Зверніть увагу, що Clojure та Scala - це два абсолютно різні типи мов програмування - Clojure - це функціональна мова, схожа на Lisp, вона не є об’єктно-орієнтованою. Scala - це об’єктно-орієнтована мова, яка має функціональні можливості програмування.

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

Я б вибрав Scala, оскільки вона об’єктно-орієнтована, але також дозволяє вивчати функціональне програмування (якщо вас це цікавить). З іншого боку, якщо вам все одно для OO і ви хочете навчитися "чистому" функціональному програмуванню, спробуйте Clojure.


9
Очевидно, ви не використовували Clojure. Clojure - приблизно така ж об’єктно-орієнтована, як Scala є функціональною. Ви можете реалізувати інтерфейс, розширити клас, оголосити приватні та статичні функції тощо ( clojure.org/java_interop ).
Річард Клейтон,

28
Ці речі існують у Clojure для взаємодії з Java, але класи та об'єкти явно не є головними особливостями Clojure. Ви не створюєте класи і не проектуєте свій проект в ОО, якщо збираєтеся програмувати в Clojure.
Jesper

>> "ніж виступ". Проблема полягає в тому, що трапляється, коли - глибоко в проекті - ви виявляєте, що ваша продуктивність погана - і не через лише один його невеликий фрагмент (який ви вже планували перетворити на java саме в той самий період). Хоча я не маю наміру тут говорити "не використовуй clojure - period ..", повинно бути ясно, що clojure - це більший ризик на арені продуктивності. Існує безліч можливостей для коду рівня додатків, для яких це не має значення: а також безліч каркасних / багатопотокових / обробних основних кодів, де це відповідальність.
StephenBoesch

@javadba Думка про те, що clojure шкідливий для низькорівневого багатопотокового коду, здається досить довільною. Clojure розроблений таким чином, що дуже важко допустити багатопотокові помилки програмування. Незмінні дані та функції STM, які є основними для мови clojure, є якимись недоступними в основній Scala, і вони роблять набагато менш імовірними, що програміст випадково вставляє в свій код стан перегонів чи тупик. Безумовно, це цінніше, ніж ті декілька мс середовища виконання, які ви можете отримати від статично введеної мови, такої як Scala або Java.
nben

"Безумовно, це цінніше, ніж декілька ms виконання". Це залежить від масштабу даних. кілька мс - це добре для кількох записів. помножте на сотні мільйонів ..
Стівен Бош

16
  1. Ідіоматична Скала швидша, ніж ідіоматична Clojure, і залишиться такою.
  2. І Скала, і Клоджуре легко сидять на вершині Яви. І те, і інше не сидить добре під ним.

Якщо ваш код критично важливий для часу або простору, дотримуйтесь Java. Але це не так, навіть якщо ви думаєте, що це так.

Тест на комп’ютерну мову проливає мало світла на справжні витрати Clojure. Структури даних Clojure не використовуються. Функціональні абстракції та абстракції послідовності не відображаються.

Clojure може здатися простим. Це не так, але виразно. Він може працювати в п'ять разів повільніше, ніж Java, але джерело в п'ять разів менше (YMMV). Для більшості додатків це великий виграш. Але для деяких і для деяких частин багатьох інших це руйнівна втрата.

Маючи досвід роботи з мовою Clojure, я вважаю, що можна заздалегідь сказати, чи ваша проблема буде чітко розбита на частину, яка може бути стисло та адекватно (з точки зору продуктивності), виражена в Clojure, і частина, яка потребує виконання на Java.

  • Ви можете піти на Scala lite: писати ідіоми Java у Scala. Ви отримаєте деяку стислість, синтаксис, простіший на око, і цілісну, хоч і складну систему типів.
  • Не існує такого поняття, як Clojure lite: писати ідіоми Java в Clojure абсолютно безглуздо. Все, що ви отримаєте, - це повільна Java, яку важко зрозуміти, оскільки вона перетинає зерно ідіом, що використовуються для її вираження.

Кажуть, що Scala - це Java, зроблена правильно . Clojure - це не що інше, як Java. Ви можете сказати, що це Lisp зроблено правильно - сміливий, дехто сказав би недоречний, твердження - що може виявитись правдою.


4
Ця відповідь проливає гарне світло на справжні відмінності та сильні / слабкі сторони двох. Це написано не скала-, ані клоджуре-апологет, а скоріше правдиво.
StephenBoesch

15

Статистика, вироблена " Комп’ютерною мовою порівняльної гри ", - це найкраще, що ви, мабуть, знайдете.

Вони глибокі, і ви можете порівняти багато мов. Проблема в тому, що вони не покривають Clojure :(

Тим не менш, подати що-небудь досить просто - це все з відкритим кодом.

Статистика дійсно говорить, що Scala досить проклятий швидкий.


9
Ось так. У 2-25 разів повільніше, ніж Java, в 2-30 разів більше пам'яті та розмір коду, як правило, більше, ніж Java. Схоже, це можна порівняти з Python, де Scala дуже близька до Java. Я б сказав, що Scala досить чіткий переможець, а Clojure значно повільніший - хіба що тест Clojure був написаний погано.
Bill K

2
Здається, орієнтовний показник справді охоплює Clojure (зауваженню ОП рік). І результати не обнадійливі. Scala - це шлях.
Мартін,

4
Наведені вище коментарі дещо застарілі - станом на середину 2012 року Clojure суттєво подолав цю прогалину, і зараз у середньому вона становить лише 2 рази Java.
mikera

9

Що стосується сумісності, я не можу говорити за Clojure, але я мав би очікувати, що він опиниться в подібній ситуації, як Scala.

Зателефонувати на Java із Scala просто.

Легко зателефонувати Scala з Java, якщо ви відповідаєте своєму зовнішньому API загальним пунктам між Scala та Java. Наприклад, об’єкт Scala використовується певним чином, як статичні методи в Java, але це не одне і те ж. Класи Scala можуть компілюватися в ряд класів з іменами, які виглядають смішно в Java.

Вам не захочеться багато змішувати та поєднувати. Побудова компонента в Scala або Clojure, який використовує безліч бібліотек Java, дуже здійсненна. Звичайно, ви можете зателефонувати до цього компонента з Java, але те, що ви не хочете робити, це спробувати використовувати Scala API, призначений для використання програмами Scala з Java.

SVN заявляє, що "CVS зроблено правильно". На мій погляд, Scala - це Java, зроблена правильно.


19
так кложуре - це git?
Рон

1
@Ron ха-ха, я думав точно так само.
KoW

2
Насправді колекції Clojure є справжніми
Джо Леманн

2

У листопаді 2010 року у PragPub розглядається питання взаємодії Clojure-Java. Викликати методи Java просто, але розширення класів / інтерфейсів Java зовсім інше.

Scala, з іншого боку, набагато ближче до Java. Взаємодія Scala-Java розроблена на веб- сайті http://www.codecommit.com/blog/java/interop-between-java-and-scala

Виклик коду Java та розширення класів / інтерфейсів Java працює так само, як виклик коду Scala. Деякі проблеми можуть бути певними випадками роботи із дженериками Java, оскільки система типів Scala набагато сильніша, ніж система Java. Створення геттерів і сеттерів згідно з умовою Java Bean вимагає анотації .

Виклик Scala з Java більшу частину часу є простим, але, наприклад, супутні об’єкти Scala вимагають знання того, як вони компілюються в байт-код. Також використання ознак з не абстрактними методами з Java повинно бути складним, а для виклику методів зі спеціальними символами потрібно знати, як вони кодуються в байт-коді.


1

Зараз (станом на травень 2010 р.) Варто переглянути найновішу гілку 1.2 Clojure - це включає велику кількість додаткової підтримки примітивних типів та статичного набору тексту (за допомогою різних підказок та протоколів).

Я розумію, що ви можете використовувати ці функції, коли вам це потрібно, щоб отримати швидкість, еквівалентну написанню точно такого ж коду на чистій Java.


2
І в той же час, @specializedтехніка в майбутній Scala 2.8 приносить аналогічне вдосконалення бібліотекам Scala. І як мовна установка вона доступна для всього коду, а не лише для стандартної бібліотеки.
Рендалл Шульц,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.