На производительности и совместимости Java: Clojure по сравнению с Scala

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

map<...> MyMap;
vector<...> MyVecOfKeys; // <-- add keys to this when added to the map.

map<...>::key_type key = MyVecOfKeys[ random_0_to_n(MyVecOfKeys.size()) ];
map<...>::data_type value = MyMap[ key ];

, Конечно, если карта действительно огромна, Вы не могли бы быть в состоянии сохранить копию всех ключей как это. Если можно предоставить его, хотя Вы получаете преимущество поисков в логарифмическое время.

82
задан Jonas 23 April 2011 в 08:26
поделиться

6 ответов

Думаю, вам подойдет любой язык. При сравнении Python и Java кажется немного неразумным обвинять язык в разнице в скорости. Java компилируется JIT (кроме мобильных устройств *), тогда как Python интерпретируется. Тот факт, что оба используют байт-код, не означает, что реализации будут иметь даже отдаленно сопоставимую производительность. Но и Scala, и Clojure являются языками JVM, поэтому у них должна быть одинаковая производительность.

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

Что касается взаимодействия с Java, Scala ближе к Java, но я уверен, что оба языка хорошо взаимодействуют. В Программирование Clojure Стюарт Хэллоуэй пишет: «[вы можете получить доступ] ко всему, что вы можете достичь из кода Java. ».

И поскольку автор Scala Мартин Одерски написал ] Компилятор Java Sun, я думаю, что со стороны Scala тоже ничего не упало. : -)

Трудно выбрать два языка лучше, хотя мне тоже нравится Ruby. Почему вы беспокоитесь о том, какой из них попробовать? Почему бы не попробовать их обоих? Scala, скорее всего, станет "следующей Java", в то время как он Трудно представить, что Lisp наконец-то взлетит после того, как не делал этого более 50 лет. Но ясно, что Lisp находится на собственном уникальном уровне абстракции, а Clojure довольно прост, поэтому Scala + Clojure не будет намного сложнее, чем просто (довольно сложный) Scala, и я уверен, что вы будете рады, что сделали Это.

И если на то пошло, они взаимодействуют ...

* dalvik (Android JVM) получил JIT-компилятор в версии 2.2 в 2010 году

73
ответ дан 24 November 2019 в 09:12
поделиться

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

Кроме того, Scala прекрасно принимает изменяемые объекты, а некоторые алгоритмы просто быстрее реализовать с изменяемостью.

Поскольку и Scala, и Java по существу являются языками, основанными на классах, они легче взаимодействуют. Или, может быть, более плавно. Класс Java - это класс для Scala, а класс Scala - это класс для Java. Проблемы могут возникнуть, когда дело доходит до синглтонов Scala или статических членов Java, особенно когда есть Фреймворк sa предполагал, что все будет работать определенным образом.

Так что я бы использовал Scala на обоих этих аккаунтах. Clojure во многих отношениях является лучшим языком , и у него, безусловно, есть очень интересные функции, которых (пока) не было в Scala, но вы получаете такие преимущества, работая полностью функционально. Если вы намереваетесь это сделать, то Clojure, скорее всего, лучше. Если вы этого не сделаете, вам, вероятно, следует остаться на Scala.

32
ответ дан 24 November 2019 в 09:12
поделиться

Обратите внимание, что Clojure и Scala - это два совершенно разных типа языков программирования. Clojure - это функциональный язык, подобный Lisp, он не объектно-ориентированный. Scala - объектно-ориентированный язык, который имеет функции функционального программирования.

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

Я бы выбрал Scala, потому что он объектно-ориентированный, но также позволяет изучать функциональное программирование (если вам это интересно). С другой стороны, если вам наплевать на объектно ориентированный объект и вы хотите учиться "

21
ответ дан 24 November 2019 в 09:12
поделиться

Статистика, полученная в « компьютерной языковой тестовой игре », примерно самая лучшая. вы, вероятно, найдете.

Они всесторонние, и вы можете сравнивать многие языки. Проблема в том, что они не охватывают Clojure: (

Тем не менее, довольно легко отправить что-либо - это все с открытым исходным кодом.

Статистика действительно говорит, что Scala чертовски быстр.

15
ответ дан 24 November 2019 в 09:12
поделиться

On interoperability, I can't speak for Clojure, but I would expect it to be in a similar situation as Scala.

It is trivially easy to call Java from Scala.

It is easy to call Scala from Java as long as you conform your external API to the common points between Scala and Java. For example, a Scala object is used in some ways like static methods in Java, but it's not the same thing. Scala classes may compile to a number of classes with names that look funny in Java.

You will not want to mix and match much. Building component in Scala or Clojure that uses lots of Java libraries is very feasible. You can of course call into this component from Java, but what you are not going to want to do is try to consume a Scala API intended for use by Scala programs from Java.

SVN claims to be "CVS done right". In my view, Scala is Java done right.

9
ответ дан 24 November 2019 в 09:12
поделиться

Сейчас (по состоянию на май 2010 года) стоит обратить внимание на последнюю ветку 1.2 Clojure - она включает много дополнительной поддержки примитивных типов и статической типизации (через различные подсказки типов и протоколы).

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

1
ответ дан 24 November 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: