delphi4arab منتديات دلفي للعرب

نسخة كاملة : دالة FastFillChar
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله وبركاته
دالة 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
; 
السلام عليكم

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

الدوال السابقة التي وضعتها كلها مجربة على Code 2 Duo & XE3 .. لم أجربها على أجهزة أخرى
استعملت freePascal 2.6 على معالج core duo
اذا كنت تريد شىء اسرع , هناك دالة في kernel32 اسمها RtlZeroMemory
كود :
procedure ZeroMemory(Mem: Pointer; Count: LongWord); stdcall; external 'kernel32.dll' name 'RtlZeroMemory';
virtual كتب :اذا كنت تريد شىء اسرع , هناك دالة في kernel32 اسمها rtlzeromemory
أنا على علم بهذه الدالة .. لكن لا يمكنني استخدامها :d لان الهدف من المشروع كتابة خوارزميات من الصفر بلغة الأسمبلي و المشروع مفتوح المصدر .. يعني مالفائدة من استخدام دالة جاهزة في مشاريع مثل هذه !!
عفوا , لم اكن اعلم انه مشروع , حسبتك تبحث عن شىء اسرع
على كل حال انا مستعد للمشاركة ,
فقط ملاحظة : ممكن تكتب comment امام كل سطر بالاسمبلي توضح فيه العملية الحالية , ففط لاختصار الوقت للذي يريد ان يضيف شىء ما
بالنسبة للذين يملكون القدرة على كتابة دوال سريعة يمكنكم المشاركة في تحديات FastCode
كود :
http://fastcode.sourceforge.net/

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