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

نسخة كاملة : أسرع طريقة للحصول على طول سلسلة نصية FastStrLen
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم و رحمة الله وبركاته

كنت قد كتبت قبل أيام دالة تقوم بجلب طول سلسلة نصية FastStrLen
PHP كود :
function FastStrLen(const _Str:String):Integer;assembler;
 
//---> BY SMP3 <---
asm
 
XOR EDI,EDI
 TEST EAX
,EAX
 JE 
@NUll
 
@Loop:
 
MOV CL,BYTE PTR [EAX]
 {
$IFDEF Unicode}
 
ADD EAX,2
 
{$ELSE}
 
INC EAX
 
{$ENDIF}
 
INC EDI
 TEST CL
,CL
 JNE 
@Loop
 JMP 
@FIN
 
@NUll:
 
INC EDI
 
@FIN:
 
PUSH EDI
 POP EAX
 DEC EAX
end
; 
.. لكن حين تنقيحي لبعض المشاريع ب Olly , اكتشفت أنه توجد طريقة أسهل و أسرع للحصول على الطول
[attachment=2490]
لو رجعنا للوراء ب 4 بايت من موقع السلسلة سنشاهد طول السلسلة النصية بالهكس .

في هذا المثال :
Length('Sample Text')= $B = 11
الدالة تصبح بالشكل التالي :

PHP كود :
function FastStrLen (s:string):integer;assembler;
asm
 MOV EAX
,DWORD PTR DS :[EAX-4]
end; 
أكيد ستكون باأسمبلي أسرع لأن الدوال الاخرى تفوم بمجموعة نت التحققات و المقارنات و لكن يمكن القول ان درجة السرعة طفيفة أما عن الطريقة الثانية فهذه تعمل فقط مع النوع String لأن هذا النوع مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي في حد ذاته يستعمل هذه الطريقة لجلب طول اي نص :p
DeadC0der كتب :مختلف عن Pchar حيث يتم تخزين الطول في [Address -4[ و الدلفي ...

نعم .. هذا صحيح @+ أحب أن أضيف أن هذه الطريقة تصلح مع دلفي فقط !!
بالنسبة للأنواع الأخرى مثل PChar فيمكن استعمال الدالة الأولى Big Grin