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

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

Как быстро заполнить память однотипными значениями.


@!!ex ©   (2009-10-27 19:35:00) 

FillMemory стандартный дельфевый умеет только байты записывать.
А мне нужно single записать. Это реально сделать сравнимо по скорости с FillMemory?


Anatoly Podgoretsky   (2009-10-29 10:20:00) [1]


> @!!ex ©   (27.10.09 20:19) [2]

Что за задача такая, что обычного цикла недостаточно


MBo   (2009-10-29 06:27:00) [2]

>ведь наверно неспроста так
я не вдавался в подробности, но думаю, что существенной разницы не должно быть.


Inovet   (2009-10-28 19:46:00) [3]

> [11] MBo ©   (28.10.09 18:56)
> >Говорят stos стал медленне mov.
> там, где я взял код Pierre le Riche, это обсуждалось, пишут,
> что бывает по-разному.

А что о его версии заполнения, ведь наверно неспроста так, на первый взглаяд через ж, add ecx,4 и прочее сделано?


MBo   (2009-10-28 18:56:00) [4]

>Говорят stos стал медленне mov.
там, где я взял код Pierre le Riche, это обсуждалось, пишут, что бывает по-разному.


Inovet   (2009-10-28 18:39:00) [5]

> [4] MBo ©   (27.10.09 20:47)
> procedure FillDWord(var Dest; Count, Value: Integer); register;
>
> asm
> XCHG  EDX, ECX
> PUSH  EDI
> MOV   EDI, EAX
> MOV   EAX, EDX
> REP   STOSD
> POP   EDI
> end;
>
> (grids.pas)

Говорят stos стал медленне mov.

{On Entry: eax = AAddress
edx = DWordValue
ecx = ADWordCount}
test ecx, ecx
jns @Done
@FillLoop:
mov [eax + ecx*4], edx
dec ecx
js @FillLoop
@Done:

Ещё бы на границу кратную 4 учесть не мешало


Inovet   (2009-10-28 18:25:00) [6]

> [4] MBo ©   (27.10.09 20:47)

mov [eax + ecx], edx
add ecx, 4

А тек не лучше?

mov [eax + ecx*4], edx
inc ecx


@!!ex   (2009-10-27 22:23:00) [7]

использовал [4] помогло, спасибо!


Riply   (2009-10-27 21:41:00) [8]

> [0] @!!ex ©   (27.10.09 19:35)
> FillMemory стандартный дельфевый умеет только байты записывать.
> А мне нужно single записать. Это реально сделать сравнимо по скорости с FillMemory?

RtlFillMemoryUlonglong ?


Leonid Troyanovsky   (2009-10-27 20:55:00) [9]


> MBo ©   (27.10.09 20:47) [4]

> {Fills a block of memory with the given dword}

Ну, если блок, то можно даже не dword, а блоком констант.
Move forever.

--
Regards, LVT.


Игорь Шевченко   (2009-10-27 20:52:00) [10]

@!!ex ©   (27.10.09 20:19) [2]

Достаточно быстро заполняет RtlCopyMemory из ntdll.dll, да и стандартный Move тоже немедленный.


MBo   (2009-10-27 20:47:00) [11]


{Fills a block of memory with the given dword}
procedure FillDWord(AAddress: Pointer; ADWordValue: integer; ADWordCount:
integer);
asm
{On Entry: eax = AAddress
edx = DWordValue
ecx = ADWordCount}
neg ecx
jns @Done
shl ecx, 2
sub eax, ecx
@FillLoop:
mov [eax + ecx], edx
add ecx, 4
js @FillLoop
@Done:
end;

(Pierre le Riche)


procedure FillDWord(var Dest; Count, Value: Integer); register;
asm
 XCHG  EDX, ECX
 PUSH  EDI
 MOV   EDI, EAX
 MOV   EAX, EDX
 REP   STOSD
 POP   EDI
end;

(grids.pas)


Leonid Troyanovsky   (2009-10-27 20:31:00) [12]


> @!!ex ©   (27.10.09 20:19) [2]

> Значения для звполнения одни и теже, и область одного и
> того же размера. Сделаю отдельную область, которую в конструкторе
> заполню целевыми значенями.

А зачем в конструкторе? Заведи массив констант,
а в нужный момент - им и заполнишь.
Move forever.

--
Regards, LVT.


@!!ex   (2009-10-27 20:19:00) [13]

тоесть цикл на миллион итераций, с миллионом вызовов CopyMemory?
Думаю медленно будет.
Хотя подсказали идею.
Значения для звполнения одни и теже, и область одного и того же размера. Сделаю отдельную область, которую в конструкторе заполню целевыми значенями.
А в нужные моменты просто скопирую заполненнуб область на целевую.


Юрий Зотов   (2009-10-27 19:41:00) [14]

CopyMemory в цикле со сдвигом адреса на размер single?


Наверх

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