delphi4arab منتديات دلفي للعرب
دالة FastFillChar - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دروس دلفي للمبتدئين (https://delphi4arab.net/forum/forumdisplay.php?fid=13)
+--- الموضوع : دالة FastFillChar (/showthread.php?tid=5077)



دالة FastFillChar - SMP3 - 28-03-2013

السلام عليكم ورحمة الله وبركاته
دالة FastFillChar

PHP كود :
procedure FastFillChar(var X ;Count:integer;Value:Char);assembler;
asm
     
// BY SMP3
     
PUSH EBX
     PUSH ESI
     PUSH EDI

     CMP EDX
,8
     JLE 
@FillCarefully
     mov Ch
,cl
     MOVD MM0
,ECX

     PUNPCKLWD MM0
, MM0
     PUNPCKLDQ MM0
, MM0
@NextFill:
     
MOVQ [EAX], MM0  {Fill 8 Char}
     
ADD EAX,8
     SUB EDX
,8
     CMP EDX
,8
     JGE 
@NextFill
     EMMS
     TEST EDX
,EDX
     JNE 
@FillCarefully
     JMP 
@FIN

@FillCarefully:
{If 
Count or EDX is smal than 8 }
     
MOV [EAX],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+1],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+2],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+3],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+4],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+5],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+6],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+7],CL
     DEC EDX
     JE 
@FIN
     MOV 
[EAX+8],CL
     DEC EDX
     JE 
@FIN

 
@FIN:

     
POP EDI
     POP ESI
     POP EBX
end
;

procedure FastFillZero(var X ;Count:integer);assembler;
asm
     
XOR ECX,ECX  {Char = 0}
     
CALL FastFillChar
end
; 



دالة FastFillChar - virtual - 28-03-2013

السلام عليكم

يبدو ان Fillchar RTL اسرع

كود :
[align=left]var tt : longword; type t_rec = record x,y,z,s : integer; n,p,q : single; end; var gF_array : array[0..8374238] of t_rec; begin tt := GetTickCount(); //FillChar(gF_array,8374238*sizeof(t_rec),char(0)); FastFillZero(gF_array,8374238*sizeof(t_rec)); writeln(GetTickCount()-tt); readln end. [/align]

FastFillZero 328ms
FillChar 312ms


دالة FastFillChar - SMP3 - 28-03-2013

virtual كتب :يبدو ان Fillchar RTL اسرع
أما أني فكانت عندي النتيجة مختلفة !!!
FastFillChar 250ms
FillChar 281ms
يمكنك الاطلاع على التصوير الفلاشي .. Big Grin

الدوال السابقة التي وضعتها كلها مجربة على Code 2 Duo & XE3 .. لم أجربها على أجهزة أخرى


دالة FastFillChar - virtual - 29-03-2013

استعملت freePascal 2.6 على معالج core duo
اذا كنت تريد شىء اسرع , هناك دالة في kernel32 اسمها RtlZeroMemory
كود :
procedure ZeroMemory(Mem: Pointer; Count: LongWord); stdcall; external 'kernel32.dll' name 'RtlZeroMemory';



دالة FastFillChar - SMP3 - 29-03-2013

virtual كتب :اذا كنت تريد شىء اسرع , هناك دالة في kernel32 اسمها rtlzeromemory
أنا على علم بهذه الدالة .. لكن لا يمكنني استخدامها :d لان الهدف من المشروع كتابة خوارزميات من الصفر بلغة الأسمبلي و المشروع مفتوح المصدر .. يعني مالفائدة من استخدام دالة جاهزة في مشاريع مثل هذه !!


دالة FastFillChar - virtual - 29-03-2013

عفوا , لم اكن اعلم انه مشروع , حسبتك تبحث عن شىء اسرع
على كل حال انا مستعد للمشاركة ,
فقط ملاحظة : ممكن تكتب comment امام كل سطر بالاسمبلي توضح فيه العملية الحالية , ففط لاختصار الوقت للذي يريد ان يضيف شىء ما


دالة FastFillChar - S.FATEH - 29-03-2013

بالنسبة للذين يملكون القدرة على كتابة دوال سريعة يمكنكم المشاركة في تحديات FastCode
كود :
http://fastcode.sourceforge.net/

شرفونا Big Grin


دالة FastFillChar - SMP3 - 29-03-2013

virtual كتب :على كل حال انا مستعد للمشاركة ,
رائع جدا .. تفقد الرسائل الخاصة .. لقد أرسلت لك المشروع !!
حاليا أعتقد اني كتبت 30 دالة ..
S.FATEH كتب :
كود :
http://fastcode.sourceforge.net/
نعم لقد سبق واطلعت على المشروع .. لكن حاليا المشروغ في سبات + المشروع لا يدعم ال Unicode أو
x64


دالة FastFillChar - S.FATEH - 30-03-2013

smp3 كتب :المشروع لا يدعم ال unicode أو x64
الله اعلم لكن لاعتقد ذلك المشروع مضمن في النسخ الحديثة من دلفي على الاقل بشكل جزئي