Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Динамические массивы


Страницы:   1 2 3

FXeS ©   (2005-08-30 14:46:00) 

Подскажите, что с точки зрения эффективности (т.е. скорость работы и занимаемый объем памяти) лучше - дин. массивы или обычные, но создаваемые "с запасом" ячеек.


Суслик   (2005-08-31 11:31:00) [41]

а вы все-таки тест мой посмотрите - разница по доступу к элементам при {$rangechecks on} в 3 процента. При {$rangechecks off} разница больше но все равно не более 20 процентов. TList при {$rangechecks on} сильно проигрывает обоим типам массивов.


>  [12] tesseract ©   (30.08.05 22:22)


> В динамическом приходится ещё и проверять границы/размер
> массива  


насколько мне известно эта проверка отключается {$rangechecks off}


Джо   (2005-08-31 01:09:00) [42]


> [12] tesseract ©   (30.08.05 22:22)

Да, я тоже не совсем понял, почему PChar "значительно быстрее" String... Уж про определение длины строки спрашивать не буду, спрошу в общем.


Anatoly Podgoretsky   (2005-08-31 00:31:00) [43]

tesseract ©   (30.08.05 22:22) [12]
Нука, нука - еще раз про скорость PChar например для определения длины больщой строки.
Страницы памяти, ты случайно с винчестером не путаешь.


tesseract   (2005-08-30 22:22:00) [44]

Самый быстрый массив - статический с индексом с нуля array[0..etc] - там проще считать индекс.
В динамическом приходится ещё и проверять границы/размер массива  -ещё медленнее.(PChar значительно быстрее String)
в Tlist данные могут распологаться на разных страницах памяти - ещё медленнее.


Суслик   (2005-08-30 17:14:00) [45]

tlist точно медленнее  (хоть и не сильно) дин массивов, т.к. там есть вызов метода.

зато добавление быстрее, это точно.


Erik1   (2005-08-30 17:08:00) [46]

TList с принудительным выделением памяти рулит.


Суслик   (2005-08-30 16:28:00) [47]

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

Можно ради примера посмотреть такой код. У меня разница в 3%.

Если  де убрать использование DoS и DoD, а непосредственно изменять знанчения по месту, то разница будет сильная. Но этот случай в жизни редок, т.к. к массиву обычно обращаешься по индексу, неизвестному в момент компиляции.

{$rangechecks on}
{$optimization on}
procedure TForm1.Button3Click(Sender: TObject);
const
  cLen = 128*1024;
var
  d: array of integer;
  s: array [0..cLen-1] of integer;
  i,j: integer;
  c1, c2,f: TLargeInteger;

  procedure DoS();
  begin
     s[i] := 10; // тут оптимизация допустимости границ не может
                 // быть пропущена компилятором
  end;

  procedure DoD();
  begin
     d[i] := 10;
  end;

begin
  QueryPerformanceFrequency(f);

  // normal
  QueryPerformanceCounter(c1);
  for j := 1 to 1000 do
     for i := 0 to High(s) do
        DoS();
  QueryPerformanceCounter(c2);
  ShowMessageFmt('normal %.4f', [(c2-c1)/f]);

  // dynamic
  QueryPerformanceCounter(c1);
  SetLength(d, cLen);
  for j := 1 to 1000 do
     for i := 0 to High(d) do
        DoD();
  QueryPerformanceCounter(c2);
  ShowMessageFmt('dynamic %.4f', [(c2-c1)/f]);
end;


Суслик   (2005-08-30 16:12:00) [48]


> С точки зрения скорости - обычный, статический

и чем же :)
скорость обращения у них одинаковая, т.к. код генерится почти одинаковый, если не одинаковый


TUser   (2005-08-30 16:06:00) [49]

С точки зрения экономии памяти - лучше дин. массив. С точки зрения скорости - обычный, статический. Если заранее (при разработке) известен размер массива, и известно, что максимальный размер будет достигнут - одназначно, статический. Если размер заведомо небольшой, но скорость очень критична - пожалй, тоже. В остальных случаях - динамический.


Igor_thief   (2005-08-30 15:59:00) [50]

FXeS   (30.08.05 15:09) [3]
Если пройтись циклом по этим массивам, то они пройдут за одно время?

НЕТ!


Суслик   (2005-08-30 15:58:00) [51]

мое имхо, что про дин массивы нужно помнить 2 важных факта:
1. при копировании одной переменной в другую копируется ссылка, а не значения массива.
2. добавление в дин. массив большего кол-ва элементов по одному достаточно медлительно.

Во всем остальном дин и обычные похожи


Суслик   (2005-08-30 15:51:00) [52]


> Если пройтись циклом по этим массивам, то они пройдут за
> одно время?

да


> Насколько больше памяти занимает дин. массив,


Они хранятся в разных местах: дин массив в динамической памяти, управляемой менеджером памяти дельфи, обычный массив в стеке.

На хранение дин массив дополнительно стратится что-то порядка 4 или 8 байт (точно не помню) накладных расходов на хранение служебной информации о выделенном блоке памяти.

--------

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


FXeS   (2005-08-30 15:09:00) [53]

Пример: Дин. массив из 100 ячеек и обычный массив из 100 ячеек, оба типа integer.
Насколько больше памяти занимает дин. массив,
Если пройтись циклом по этим массивам, то они пройдут за одно время?


Суслик   (2005-08-30 14:51:00) [54]

Легче и всем полезней отвечать на вопросы с конкретным кодом...


Суслик   (2005-08-30 14:48:00) [55]

зависит от того, как конкретно ты будешь писать код, использующий указанные массивы


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо