![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамические массивы
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]зависит от того, как конкретно ты будешь писать код, использующий указанные массивы