Текущий архив: 2009.12.13;
Скачать: CL | DM;
ВнизКак быстро заполнить память однотипными значениями. Найти похожие ветки
← →
@!!ex © (2009-10-27 19:35) [0]FillMemory стандартный дельфевый умеет только байты записывать.
А мне нужно single записать. Это реально сделать сравнимо по скорости с FillMemory?
← →
Юрий Зотов © (2009-10-27 19:41) [1]CopyMemory в цикле со сдвигом адреса на размер single?
← →
@!!ex © (2009-10-27 20:19) [2]тоесть цикл на миллион итераций, с миллионом вызовов CopyMemory?
Думаю медленно будет.
Хотя подсказали идею.
Значения для звполнения одни и теже, и область одного и того же размера. Сделаю отдельную область, которую в конструкторе заполню целевыми значенями.
А в нужные моменты просто скопирую заполненнуб область на целевую.
← →
Leonid Troyanovsky © (2009-10-27 20:31) [3]
> @!!ex © (27.10.09 20:19) [2]
> Значения для звполнения одни и теже, и область одного и
> того же размера. Сделаю отдельную область, которую в конструкторе
> заполню целевыми значенями.
А зачем в конструкторе? Заведи массив констант,
а в нужный момент - им и заполнишь.
Move forever.
--
Regards, LVT.
← →
MBo © (2009-10-27 20:47) [4]
{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)
← →
Игорь Шевченко © (2009-10-27 20:52) [5]@!!ex © (27.10.09 20:19) [2]
Достаточно быстро заполняет RtlCopyMemory из ntdll.dll, да и стандартный Move тоже немедленный.
← →
Leonid Troyanovsky © (2009-10-27 20:55) [6]
> MBo © (27.10.09 20:47) [4]
> {Fills a block of memory with the given dword}
Ну, если блок, то можно даже не dword, а блоком констант.
Move forever.
--
Regards, LVT.
← →
Riply © (2009-10-27 21:41) [7]> [0] @!!ex © (27.10.09 19:35)
> FillMemory стандартный дельфевый умеет только байты записывать.
> А мне нужно single записать. Это реально сделать сравнимо по скорости с FillMemory?
RtlFillMemoryUlonglong ?
← →
@!!ex © (2009-10-27 22:23) [8]использовал [4] помогло, спасибо!
← →
Inovet © (2009-10-28 18:25) [9]> [4] MBo © (27.10.09 20:47)
mov [eax + ecx], edx
add ecx, 4
А тек не лучше?mov [eax + ecx*4], edx
inc ecx
← →
Inovet © (2009-10-28 18:39) [10]> [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 учесть не мешало
← →
MBo © (2009-10-28 18:56) [11]>Говорят stos стал медленне mov.
там, где я взял код Pierre le Riche, это обсуждалось, пишут, что бывает по-разному.
← →
Inovet © (2009-10-28 19:46) [12]> [11] MBo © (28.10.09 18:56)
> >Говорят stos стал медленне mov.
> там, где я взял код Pierre le Riche, это обсуждалось, пишут,
> что бывает по-разному.
А что о его версии заполнения, ведь наверно неспроста так, на первый взглаяд через ж, add ecx,4 и прочее сделано?
← →
MBo © (2009-10-29 06:27) [13]>ведь наверно неспроста так
я не вдавался в подробности, но думаю, что существенной разницы не должно быть.
← →
Anatoly Podgoretsky © (2009-10-29 10:20) [14]
> @!!ex © (27.10.09 20:19) [2]
Что за задача такая, что обычного цикла недостаточно
Страницы: 1 вся ветка
Текущий архив: 2009.12.13;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.008 c