Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
15-1255552208
Юрий
2009-10-15 00:30
2009.12.13
С днем рождения ! 15 октября 2009 четверг


1-1228221714
Jorjia
2008-12-02 15:41
2009.12.13
ControlGrid - найти номер строки грида по расположенному на ней к


2-1256215062
Ивутин П.
2009-10-22 16:37
2009.12.13
Поиск TColumnEh по заголовку


2-1256653014
wq
2009-10-27 17:16
2009.12.13
record или packed record


2-1256647123
Morgan128
2009-10-27 15:38
2009.12.13
Частичная блокировка клавиатуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский