Почему Clojure / Lisp Программы быстрее, чем другие динамические языки? - PullRequest
14 голосов
/ 29 сентября 2011

Основываясь на языковых перестрелках за последние несколько лет, Clojure и другие Lisps стабильно работают лучше, чем большинство других динамических языков. Почему это так? Это из-за его гомоиконичности ?

Edit:

Я не знал, что Clojure скомпилирован в байт-код, как Java и Scala. Этот поток переполнения стека пролил свет на то, почему Clojure использует преимущество как компиляции, так и интерпретации.

1 Ответ

18 голосов
/ 29 сентября 2011

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

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

Сказав это, следующие причины могут дать Clojure преимущество, однакопри определенных обстоятельствах:

  • Clojure всегда компилируется - сначала до байт-кода, а затем до собственного кода компилятором JIT JVM.Это может дать ему преимущество в скорости во многих случаях, особенно над языками, которые полагаются на некоторую форму интерпретации.Теоретически, по крайней мере, вы должны быть в состоянии соответствовать скорости чистого Java в любых обстоятельствах, когда Clojure позволяет вам создавать один и тот же байт-код (что достаточно часто, хотя и не всегда ....)
  • Clojureможет использовать примитивы JVM и статическую типизацию - несмотря на то, что он является динамическим языком, Clojure будет компилировать статические типы или примитивный код, если вы дадите ему достаточно подсказок.Это может легко повысить производительность в 10 раз, хотя и за счет того, что ваш код станет немного длиннее / уродливее .....
  • Clojure сильно оптимизировал определенные структуры данных и операции -в частности, неизменяемые постоянные структуры данных и некоторые функциональные программные конструкции, такие как «Reduce».
  • Макросы обеспечивают мощную оптимизацию во время компиляции - если вы используете макросы умно, вы можете сделать некоторые довольно сложные оптимизацииво время компиляции, эффективно используя генерацию кода для создания кода, который будет наиболее эффективным во время выполнения.Это преимущество многих Лиспов (особенно Common Lisp, который был одним из главных вдохновителей Clojure).Как отмечает Нульвинге, для достижения этой цели строго не требуется гомойконичность (в C ++ также есть макросы!), Но использование гомоиконического языка упрощает макросы на лот .
  • СовременныйJVM блестяще спроектированы - Clojure использует в своих интересах тысячи человеко-лет инженерной работы, вложенных в JVM, библиотеки времени выполнения Java, алгоритмы сборки мусора и т. Д. Языки, не относящиеся к JVM, не получают этих преимуществ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...