Есть ли реальный прирост производительности при выключении {$IMPORTEDDATA}?

#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. Я должен признать, что я этого не сделал, поскольку это шло бы вразрез со всем, что я знаю по этому вопросу, я предположил это. Я только что протестировал это ради этого, и я подтверждаю, что доступ к переменной формы осуществляется косвенно. Тот факт, что переменная является указателем, не меняет того факта, что вам нужно получить доступ к адресу, где хранится указатель, чтобы прочитать его. Доступ к переменным всегда осуществляется «по адресу». Причина косвенности здесь в том, что когда переменная хранится в пакете, исполняемый код не может узнать, по какому адресу будет сохранен пакет (и, следовательно, переменная).