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