دالة FastFillChar
#1
السلام عليكم ورحمة الله وبركاته
دالة 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
; 
الرد
#2
السلام عليكم

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

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


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

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


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم