Специализация алгоритма времени выполнения - Run-time algorithm specialization - Wikipedia

В Информатика, специализация алгоритма времени выполнения это методология создания эффективных алгоритмов для дорогостоящих вычислительных задач определенного типа. Методология берет свое начало в области автоматическое доказательство теорем и, более конкретно, в Доказательство теорем вампиров проект.

Идея вдохновлена ​​использованием частичная оценка в оптимизации перевода программ. Многие основные операции в средствах доказательства теорем демонстрируют следующий шаблон: предположим, что нам нужно выполнить некоторый алгоритм в ситуации, когда значение фиксируется для потенциально многих различных значений . Чтобы сделать это эффективно, мы можем попытаться найти специализацию за каждый фиксированный , т.е. такой алгоритм , что выполнение эквивалентно выполнению .

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

Отличие от частичной оценки

Ключевое различие между специализацией времени выполнения и частичной оценкой заключается в том, что значения на котором не известны статически, поэтому специализация происходит во время выполнения.

Также есть важное техническое отличие. Частичная оценка применяется к алгоритмам, явно представленным в виде кода на каком-либо языке программирования. Во время выполнения нам не нужно конкретное представление . Нам только нужно представлять себе когда мы программируем процедура специализации. Все, что нам нужно, это конкретное представление специализированной версии . Это также означает, что мы не можем использовать какие-либо универсальные методы для специализации алгоритмов, что обычно имеет место при частичной оценке. Вместо этого мы должны запрограммировать процедуру специализации для каждого конкретного алгоритма. . Важным преимуществом этого является то, что мы можем использовать некоторые мощные для этого случая уловки, использующие особенности и представление и , недоступные для универсальных методов специализации.

Специализация с компиляцией

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

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

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

Специализация на данных и алгоритмах

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

Смотрите также

Рекомендации

дальнейшее чтение