Инкрементные вычисления , также известные как инкрементные вычисления , — это программная функция , которая при изменении фрагмента данных пытается сэкономить время , пересчитывая только те выходные данные, которые зависят от измененных данных. [1] [2] [3] Когда инкрементные вычисления успешны, они могут быть значительно быстрее, чем наивное вычисление новых выходных данных. Например, пакет программного обеспечения для работы с электронными таблицами может использовать инкрементные вычисления в своих функциях пересчета, чтобы обновить только те ячейки, содержащие формулы, которые зависят (прямо или косвенно) от измененных ячеек.
Когда инкрементные вычисления реализуются с помощью инструмента, который может автоматически реализовать их для множества различных фрагментов кода, такой инструмент является примером инструмента анализа программы для оптимизации .
Методы инкрементальных вычислений можно в целом разделить на два типа подходов:
Статические подходы пытаются вывести инкрементальную программу из обычной программы P, используя, например, либо ручное проектирование и рефакторинг, либо автоматические преобразования программы. Эти преобразования программы происходят до того, как будут предоставлены какие-либо входные данные или изменения входных данных.
Динамические подходы записывают информацию о выполнении программы P на определенном входе (I1) и используют эту информацию при изменении входа (на I2) для обновления выхода (с O1 на O2). На рисунке показана связь между программой P, функцией расчета изменений ΔP, которая составляет ядро инкрементной программы, и парой входов и выходов, I1, O1 и I2, O2.
Некоторые подходы к инкрементальным вычислениям являются специализированными, в то время как другие являются универсальными. Специализированные подходы требуют от программиста явного указания алгоритмов и структур данных, которые будут использоваться для сохранения неизменных подвычислений. С другой стороны, универсальные подходы используют язык, компилятор или алгоритмические методы для придания инкрементального поведения в противном случае неинкрементальным программам. [4]
Учитывая вычисление и потенциальное изменение , мы можем вставить код до того, как произойдет изменение (предпроизводная) и после изменения (постпроизводная), чтобы обновить значение быстрее, чем перезапуск . Пейдж записал список правил для формальной дифференциации программ в SUBSETL. [5]
В системах баз данных, таких как DBToaster, представления определяются с помощью реляционной алгебры. Инкрементальное обслуживание представлений статически анализирует реляционную алгебру для создания правил обновления, которые быстро поддерживают представление при наличии небольших обновлений, таких как вставка строки. [6]
Инкрементальное вычисление может быть достигнуто путем построения графа зависимостей всех элементов данных, которые могут нуждаться в пересчете, и их зависимостей. Элементы, которые необходимо обновить при изменении одного элемента, задаются транзитивным замыканием отношения зависимости графа. Другими словами, если есть путь от измененного элемента к другому элементу, последний может быть обновлен (в зависимости от того, достигнет ли изменение в конечном итоге элемента). Граф зависимостей может нуждаться в обновлении по мере изменения зависимостей или по мере добавления или удаления элементов в систему. Он используется внутри реализации и обычно не требует отображения пользователю.
Избежать фиксации зависимостей между всеми возможными значениями можно, определив подмножество важных значений (например, результаты агрегации), по которым можно отслеживать зависимости, и постепенно пересчитывая другие зависимые переменные, тем самым уравновешивая объем информации о зависимостях, которую необходимо отслеживать, с объемом пересчета, который необходимо выполнить при изменении входных данных. [7]
Частичную оценку можно рассматривать как метод автоматизации простейшего возможного случая инкрементальных вычислений, в котором делается попытка разделить данные программы на две категории: те, которые могут изменяться в зависимости от входных данных программы, и те, которые не могут (и наименьшей единицей изменения являются просто «все данные, которые могут изменяться»). Частичную оценку можно комбинировать с другими методами инкрементальных вычислений.
При наличии циклов в графе зависимости одного прохода по графу может быть недостаточно для достижения фиксированной точки. В некоторых случаях полная переоценка системы семантически эквивалентна инкрементальной оценке и может быть более эффективной на практике, если не в теории. [8]