11.7.2. Доступные оптимизации WPO

На верх  Назад  Вперёд

Опции командной строки -OW и -Ow требуют список оптимизаций программы в целом, разделённый запятыми. Это строки, где каждая строка обозначает опцию. Список доступных опций приведён ниже:

all – включает все доступные оптимизации.

devirtcalls – заменяет вызов виртуального метода вызовом обычного (статического) метода, если компилятор может определить, что вызов виртуального метода всегда будет таким же, как статический метод. Это делает код меньше и быстрее. В общем, это включает оптимизацию других оптимизаций, потому что это делает программу лёгкой для анализа в связи с тем, что снижает косвенный контроль потока.

Имеются два ограничения этой опции:

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

2.В текущей реализации ещё не девиртуализуются вызовы методов интерфейса. Ни при вызове их через интерфейс, ни при вызове их через экземпляр класса.

optvmts – эта оптимизация смотрит, какие типы класса могут быть реализованы и какие виртуальные методы могут быть вызваны в программе. На основании этой информации она заменяет записи виртуальной таблицы методов (VMT), которые могут быть никогда не вызваны на ссылку FPC_ABSTRACTERROR. Это означает, что такие методы, если они не вызываются напрямую через унаследованный вызов из дочернего класса/объекта, могут быть удалены при компоновке. Это не имеет практически никакого влияния на скорость, но может помочь при уменьшении размера кода.

Имеются два ограничения этой опции:

1.Общедоступные методы или getters/setters общедоступных свойств никогда не будут оптимизированы этим способом, потому что они могут в любой момент быть связаны и вызваны через RTTI (который компилятор не может определить).

2.Такая оптимизация пока не реализована для виртуальных методов класса.

wsymbolliveness – этот параметр не выполняет каких-либо оптимизаций сам по себе. Он просто указывает компилятору записи каких функций/процедур и где были сохранены компоновщиком в конечной программе. Во время следующего прохода WPO компилятор может игнорировать удалённые функции/процедуры настолько, насколько WPO сочтёт нужным (например, если конкретный тип класса только создан в одной неиспользуемой процедуре, то игнорирование этой процедуры может повысить эффективность двух предыдущих оптимизаций).

Имеются два ограничения этой опции:

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

2.Сбор информации для этой оптимизации (используя -OWsymbolliveness ) требует, чтобы умная компоновка была включена (-XX), а символьный анализ отключен (-Xs-). Если использовать предыдущий способ сбора информации, то эти ограничения не действуют.