Советы по настройке производительности Clojure в реальном мире?

Как nsanders сказал , STLFilt является хорошим решением. STLFilt собственной разработки (когда Вы не хотите переходить к проблеме установить Perl) должен скопировать сообщение об ошибке в редакторе и начать заменять части ошибки, пока это не становится (более) управляемым.

, например,

s/std::basic_string,std::allocator>/string/g 

В менее гиковских терминах это означает:

Замена:

std::basic_string,std::allocator>

С:

string

25
задан Zubair 5 April 2011 в 08:44
поделиться

3 ответа

Мои личные советы:

  • Сначала проверьте свой алгоритм - вы несете O (n ^ 2) стоимость, когда она действительно должна быть O (n.log n)? Если вы выбрали плохой алгоритм, остальные настройки - пустая трата времени.
    • Помните об общих «ошибках», таких как стоимость O (n) обхода списка / последовательности.
    • Воспользуйтесь преимуществами приятных функций в Clojure, таких как стоимость O (1) копирования большой постоянной структуры данных или стоимость O (log32 n) доступа к карте / множеству / вектору.
  • Мудро выбирайте из основных конструкций Clojure:
    • Атом хорош, когда вам нужны изменяемые данные, например, обновление некоторых данных в цикле
    • Если вы собираетесь просматривать некоторые данные в последовательности, используйте список , а не вектор или карту, поскольку это позволит избежать создания временных объектов при обходе последовательности.
    • Используйте deftype / defrecord / defprotocol , где это необходимо. Они в значительной степени оптимизированы, и, в частности, их следует предпочитать использовать для деструктуры / мультиметодов начиная с Clojure 1.2 и далее.
  • Воспользуйтесь преимуществами возможностей параллелизма Clojure:
    • pmap и future - относительно простые способы использования преимуществ нескольких ядер, когда вы выполняем несколько независимых вычислений одновременно.
    • Помните, что из-за неизменных постоянных структур данных Clojure создание и работа с несколькими копиями данных очень недороги. Вам также не нужно беспокоиться о блокировке при создании снимков .....
  • Если вы взаимодействуете с Java-кодом, используйте «(set! * Warn-on-отражение * true)» и устраняйте каждое предупреждение об отражении . Отражение - это одна из самых дорогих операций, которая, если ее выполнять неоднократно, действительно замедлит работу приложения.
  • Если вам по-прежнему требуется более высокая производительность, определите наиболее важные для вашего кода части кода (например, 5% строк, где приложение тратит 90% + процессорного времени), проанализируйте этот раздел подробно и разумно примените следующие правила:
    • Избегайте лени . Лень - отличная функция, но она требует дополнительных затрат. Имейте в виду, что многие из обычных функций последовательности / списка Clojure являются ленивыми (например, для map, partition). loop / recur, dotimes и сокращения - ваши ленивые друзья.
    • Используйте примитивные подсказки и арифметику без контроля , чтобы ускорить арифметический / числовой код. Примитивы намного быстрее, чем стандартная арифметика Clojure BigInteger.
    • Минимизация выделения памяти - старайтесь избегать создания слишком большого количества ненужных промежуточных данных (векторов, списков, карт, непримитивных чисел и т. Д.). Все выделения накладывают небольшое количество дополнительных накладных расходов, а также приводят к более / более длительным паузам GC с течением времени (это, вероятно, будет более серьезной проблемой, если вы пишете игровое / мягкое приложение реального времени).
    • (Ab) использовать массивы Java - не совсем идиоматично в Clojure, но aget / aset / areduce и друзья очень быстрые (им выгодна большая оптимизация JVM !!). (Ab) использовать примитивные массивы для дополнительных бонусных очков.
    • Использовать макросы - генерировать некрасивый, но быстрый код во время компиляции, где это возможно

Выполнение всего вышеперечисленного должно обеспечить довольно хорошую производительность кода Clojure - благодаря тщательной настройке я обычно был достаточно близок к производительности чистой Java, что довольно впечатляюще для динамического языка!

60
ответ дан 28 November 2019 в 18:11
поделиться

Вы можете использовать JVisualVM для профилирования кода Clojure (см., Например, JVisualVM и Clojure ). Это должно, по крайней мере, указать вам правильное направление медленного кода.

5
ответ дан 28 November 2019 в 18:11
поделиться

Этот вопрос касается профилирования с помощью Clojure: Инструмент профилирования для Clojure?

Я уверен, что вы найдете там несколько полезных советов.

Затем прямо изо рта лошади: http://clojure.org/getting_started#Getting%20Started-Profiling

3
ответ дан 28 November 2019 в 18:11
поделиться
Другие вопросы по тегам:

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