#performance #delphi #memory #delphi-7 #delphi-xe
#Производительность #delphi #память #delphi-7 #delphi-xe
Вопрос:
Есть ли реальный прирост производительности при выключении {$IMPORTEDDATA}?
В руководстве сказано только это: «Директива {$ G-} запрещает создание ссылок на импортированные данные. Использование {$ G-} повышает эффективность доступа к памяти, но не позволяет упакованному модулю, где это происходит, ссылаться на переменные в других пакетах.»
Обновить:
Вот больше информации, которую я смог найти:
«В разделе отладки появилась новая опция Использовать импортированные ссылки на данные (сопоставленные с $ G), которая управляет созданием импортированных ссылок на данные (повышая эффективность памяти, но предотвращая доступ к глобальным переменным, определенным в других пакетах среды выполнения)»
Ответ №1:
Почти никогда
Эта директива относится только к доступу к глобальным переменным модуля из другого модуля.
Если вы используете {$ G }
unit1;
interface
var
Global1: integer; //<-- this is a global var in unit1.
Form1: TForm1; //<-- also a global var, but really a pointer
Global1
доступ к нему будет осуществляться косвенно через указатель (если и когда доступ осуществляется извне unit1)
Form1
доступ также будет осуществляться косвенно (т. Е. изменение прямого указателя на косвенный указатель).
если вы используете {$ G-}, доступ к integer global
будет прямым и, следовательно, немного быстрее.
Это будет иметь значение, только если вы используете глобальные общедоступные переменные unit в другом модуле и в коде, критичном ко времени, т.Е. почти никогда.
Смотрите эту статью: http://hallvards.blogspot.com/2006/09/hack13-access-globals-faster.html
Комментарии:
1. Form1 также будет доступен косвенно. И Global1, и Form1 — это 4 байта данных, содержащихся в памяти. Доступ к этим 4 байтам данных выполняется одинаково, независимо от того, представляет ли содержимое этих 4 байтов целое число или указатель.
2. @Ken вы сами это подтвердили?
3. Я должен признать, что я этого не сделал, поскольку это шло бы вразрез со всем, что я знаю по этому вопросу, я предположил это. Я только что протестировал это ради этого, и я подтверждаю, что доступ к переменной формы осуществляется косвенно. Тот факт, что переменная является указателем, не меняет того факта, что вам нужно получить доступ к адресу, где хранится указатель, чтобы прочитать его. Доступ к переменным всегда осуществляется «по адресу». Причина косвенности здесь в том, что когда переменная хранится в пакете, исполняемый код не может узнать, по какому адресу будет сохранен пакет (и, следовательно, переменная).