Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Эффективность динамических массивов типа, a : array of <type> 
V
    Опции темы
Coder
Дата 11.10.2007, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



Собственно, насколько они эффективны в плане скорости скорости, размерам занимаемой памяти под служебные нужды и доступе к элементам? Чем массивы типа:
Код

type
  aaa = array[1..1000000] of integer;
var
  d_arr : ^aaa;
begin
  GetMem(d_arr,1000);
end;


Пробывал тестировать, но для моего компьютера не получается придумать такой тест, где бы функция SetLength() работала медленнее GetMem() и где бы осуществлялось заметное отставание одних массивов от других при работае в цикле.

Может у вас есть сведения по этой теме?
PM MAIL   Вверх
ALeXandrK
Дата 11.10.2007, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 342
Регистрация: 31.1.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 6



А ты посмотри какова разница в представлении на asm и по разнице
кол-ва строчек сможешь предположить разницу в скорости.


--------------------
Богат не/ни тот, у кого много, а тот, кому хватает
PM WWW   Вверх
Coder
Дата 11.10.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

Репутация: 5
Всего: 11



ё маё...

Добавлено через 1 минуту и 34 секунды
а "внутри " SetLength еще больше ASM инструкций....

Присоединённый файл ( Кол-во скачиваний: 25 )
Присоединённый файл  untitled.GIF 88,76 Kb
PM MAIL   Вверх
MetalFan
Дата 11.10.2007, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



если память для дин.массива не перевыделяется, то имхо большой разницы по скорости работы с дин. или стат.масствами быть не должно.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 12.10.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(MetalFan @  11.10.2007,  08:05 Найти цитируемый пост)
то имхо большой разницы по скорости работы с дин. или стат.масствами быть не должно.

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 12.10.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Провел эксперимент на таком коде 
Код

{$O-}
procedure TForm1.Button1Click(Sender: TObject);
var
  a : array [0..1000000] of byte;
  b : array  of byte;
  i, j, ctr : integer;
begin
  SetLength(b, 1000001);
  ctr := GetTickCount();
  for I := 0 to 1000000
  do
   for j := 0 to 100
   do
     a[i] := 5;

  ctr := GetTickCount() - ctr;
  ctr := ctr;
end;


Проверка показала, что для стекового массива 100млн присваиваний произошли за 328мс, а для массива в куче за 406 мс, т.е. на целых 23% дольше!

Похоже правду говорят про то что стек кешируеться лучше.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
EvilsInterrupt
Дата 12.10.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 3
Всего: 9



Иногда большое кол-во машинный инструкций приводит к более эффективному коду в плане скорости выполнения! Отсюда вывод, надо смотреть не на кол-во инструкций, а на кол-во конструкций c условным переходом, куда я отношу такие как jnX, jX. Этому есть разумный довод, процессор работает так:
1. Выборка новой команды
2. Декодирование команды выбранной в прошлом такте
3. Выполнение инструкции выполненной 2 мя тактами раньше.

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

и так, если есть код:

Код

if Index < 0 then ShowMessage('Index < 0')
else ShowMessage('Index >= 0');


Процессор не знает, что тактом раньше перед сравнением выбрана не верная конструкция и нужно на самом деле не then, else выполнять, в итоге идет очистка команд, чтобы выполнить else !

В итоге, если вы вставите меньше jne, je и др. команд перехода то код будет более эффективным, т.к. процессор будет точнее предсказывать ход выполнения кода.

Еще раз замечу, современные процессоры, по другим механизмам работают, но классику не стоит забывать, она позволяет оценить код на глаз! ;)

Добавлено через 5 минут и 43 секунды
Вот еще выдержка из unit DCPsha512, компонента DCPcrypt v2.0 written by David Barton:

Есть код:
Код

{
Non-optimised version
  for i:= 0 to 79 do
  begin
    t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) +
      ((e and f) xor (not e and g)) + K[i] + W[i];
    t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) +
      ((a and b) xor (a and c) xor (b and c));
    h:= g; g:= f; f:= e; e:= d + t1; d:= c; c:= b; b:= a; a:= t1 + t2;
  end;
}


и есть:
Код

  t1:= h + (((e shr 14) or (e shl 50)) xor ((e shr 18) or (e shl 46)) xor ((e shr 41) or (e shl 23))) + ((e and f) xor (not e and g)) + $428a2f98d728ae22 + W[0]; t2:= (((a shr 28) or (a shl 36)) xor ((a shr 34) or (a shl 30)) xor ((a shr 39) or (a shl 25))) + ((a and b) xor (a and c) xor (b and c)); d:= d + t1; h:= t1 + t2;
  t1:= g + (((d shr 14) or (d shl 50)) xor ((d shr 18) or (d shl 46)) xor ((d shr 41) or (d shl 23))) + ((d and e) xor (not d and f)) + $7137449123ef65cd + W[1]; t2:= (((h shr 28) or (h shl 36)) xor ((h shr 34) or (h shl 30)) xor ((h shr 39) or (h shl 25))) + ((h and a) xor (h and b) xor (a and b)); c:= c + t1; g:= t1 + t2;
/// Дальше очень много кода!!!


Как вы думаете, почему автор отказался от цикла? и всатвил все напрямую ?
PM MAIL WWW ICQ Jabber   Вверх
Alix
Дата 12.10.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Цитата(Alexeis @  12.10.2007,  14:00 Найти цитируемый пост)

Проверка показала, что для стекового массива 100млн присваиваний произошли за 328мс, а для массива в куче за 406 мс, т.е. на целых 23% дольше!

ммм... а ты усреднял результаты? у меня они все время разные - то одно быстрее, то другое. Иногда в два раза. Это если с отключенной оптимизацией. Если с включенной, порядок наблюдается, но в среднем разница все же не 23%, а ~100%...


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 12.10.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(Alix @  12.10.2007,  13:41 Найти цитируемый пост)
ммм... а ты усреднял результаты?

  Я проводил несколько замеров и выбирал наименьшие. Другие результаты получаются из-за того что работу цикла прерывают другие процессы, потому верно брать не средние а именно наименьшие, т.е. те которые выполнялись непрерывно.

Добавлено через 1 минуту и 19 секунд
  Если врубить оптимизацию, то компилятор вообще может выкинуть много чего, так что такое сравнение не всегда верное.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 12.10.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



SetLength сделана для того, чтобы не делать руками освобождение, выделение, вычисление размера элементов, перенос данных, итд. в скорости чтения-записи таких массивов разницы никакой нет: кусок памяти - он и в африке кусок памяти.
PM MAIL   Вверх
Alexeis
Дата 12.10.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(dumb @  12.10.2007,  14:18 Найти цитируемый пост)
кусок памяти - он и в африке кусок памяти. 
 Ну да! Память памяти рознь. Одно дело память процессора, а другое системная память. Работают они с разной скоростью. А вот что окажется в этом кэше и когда, вот что интересно. Не зря же разница в 23%.

Добавлено через 2 минуты и 26 секунд
Упс. неправильно понял ответ. Ну да конечно между GetMem и SetLength разницы нет, память будет выделена в любом случае в куче.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 12.10.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



если говорить о разнице в скорости работы с кучей и со стеком, то у меня вырисовывается такая картинка: процессору фиолетово, что кэшировать - поэтому на довольно больших массивах разницы не будет. скорость обработки же небольших кусков данных, размещенных в стеке, обуславливается тем, что какой-то кусок стека практически постоянно пасется в кэше за счет активной работы с ним.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0988 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.