2016-12-13 2 views
3

Я сделал небольшое поверхностное чтение на inlining declamations и прочитал на relevant CLHS pages, но не может легко увидеть явный ответ.Возможно ли `inline`` метод`?

Разумно ли (declaim (inline foo)) когда foo объявляется с использованием defmethod, а не defun (последний из которых явно крытого случай)? Как насчет foo является функция readerclass? Является ли эффект этого вложения заметным в плане производительности? Является ли она специфичной для реализации?

Для простых методов при жестких ограничениях может быть разумно переписать как defun для производительности, но это иногда сложно или невозможно. Существуют ли общие стратегии оптимизации, которые можно использовать для общих методов Лиспа, не переписывая их как функции?

+1

См. Https://github.com/guicho271828/inlined-generic-function – coredump

+0

@coredump - В соответствии с этим, похоже, что ситуация «встраивание общих функций/методов обычно приводит к незначительным выигрышам в производительности и может быть улучшена в оптимизированном случае за счет использования внешней библиотеки, дополнительной декларации метакласса и более низкой производительности в неоптимизированном случае ». Он доступен из 'quicklisp' как' inlined-generic-function', поэтому было бы экономично исследовать. Знаете ли вы, что он также попадает в регистр 'reader' /' accessor'? А также, хотите опубликовать это как ответ? – Inaimathi

+1

Обратите внимание, что программы Common Lisp не вызывают отдельные методы, а общие функции. –

ответ

3

Методы ввода не имеют большого смысла, потому что способ компилятора CL может сделать это, когда он может быть уверен заранее, о какой функции вызывается. При явном вызове (foo x) с встроенным foo может быть заменено определение foo. Однако, когда скомпилированный код равен (funcall method x y), вы не можете встроить функцию, если method неизвестно.

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

Вы можете взглянуть на статью Роберта Странда Fast generic dispatch for Common Lisp для получения более подробной информации о создании общей отправки. Существует также библиотека, предоставляющая Inlined Generic Functions, где, очевидно, общие функции могут быть эффективно отправлены во время компиляции при соответствующих обстоятельствах.

Смежные вопросы