البرنامج التعليمي لتحسين كود دلفي:
تحسين السلسلة
لدى دلفي ثلاثة أنواع من السلاسل: سلسلة قصيرة (string[n], n=1..255) يتم تخصيص مساحة التخزين بشكل ثابت ويتم تحديد الحجم في وقت الترجمة. وهذا موروث من bp for نوع dos (pchar) مخصص بشكل أساسي للتوافق مع واجهات برمجة التطبيقات المختلفة، وقد ظهر في bp7 ويستخدم الآن على نطاق أوسع في دلفي، ويمكن تخصيص مساحة التخزين الخاصة به بشكل ثابت باستخدام مصفوفة الأحرف أو تخصيصها يدويًا باستخدام getmem سلسلة الأحرف الطويلة (Ansistring) فريدة من نوعها بالنسبة لدلفي، حيث يتم تخصيص مساحة التخزين الخاصة بها ديناميكيًا في وقت التشغيل، وهي الأكثر مرونة والأكثر عرضة لإساءة الاستخدام.
سيتم تهيئة نوع سلسلة AnsiString الافتراضي في دلفي تلقائيًا ليصبح فارغًا دون تكرار التهيئة. الكود التالي:
لدى دلفي ثلاثة أنواع من السلاسل: سلسلة قصيرة (string[n], n=1..255) يتم تخصيص مساحة التخزين بشكل ثابت ويتم تحديد الحجم في وقت الترجمة. وهذا موروث من bp for نوع dos (pchar) مخصص بشكل أساسي للتوافق مع واجهات برمجة التطبيقات المختلفة، وقد ظهر في bp7 ويستخدم الآن على نطاق أوسع في دلفي، ويمكن تخصيص مساحة التخزين الخاصة به بشكل ثابت باستخدام مصفوفة الأحرف أو تخصيصها يدويًا باستخدام getmem سلسلة الأحرف الطويلة (Ansistring) فريدة من نوعها بالنسبة لدلفي، حيث يتم تخصيص مساحة التخزين الخاصة بها ديناميكيًا في وقت التشغيل، وهي الأكثر مرونة والأكثر عرضة لإساءة الاستخدام.
فار: سلسلة؛
يبدأ
ق:=;
…
نهاية؛
س:=; غير ضروري. ولكن تجدر الإشارة إلى أن هذا ليس له أي تأثير على نتيجة قيمة إرجاع الدالة. بشكل عام، تمرير وسيطات var أسرع من إرجاع قيمة سلسلة.
يعد استخدام SetLength للتخصيص المسبق لسلسلة طويلة (AnsiString) لتخصيص الذاكرة ديناميكيًا من المزايا الرئيسية لـ AnsiString، ولكن يمكن أن يكون ذلك بمثابة هزيمة ذاتية بسهولة، والمثال النموذجي هو كما يلي:
s2:= ;
for i:=2 to length(s1) do s2:=s2+s1[i];
ناهيك عن أنه يمكن استبداله بالحذف. المشكلة الرئيسية هي أن مساحة الذاكرة s2 يتم تخصيصها بشكل متكرر في حلقة المثال أعلاه، وهو ما يستغرق وقتًا طويلاً. الطريقة البسيطة والفعالة هي كما يلي:
setlength(s2,length(s1)-1);
for i:=2 to length(s1) do s2[i-1]:=s1[i];
بهذه الطريقة، سيتم إعادة تخصيص ذاكرة s2 مرة واحدة فقط.
سلامة السلاسل والمصفوفات الديناميكية قبل دلفي 5، كانت هذه الاستدعاءات غير الآمنة للسلاسل للعمليات على المصفوفات الديناميكية والسلاسل الطويلة تستخدم العد المرجعي للتعامل مع مشكلاتها الحرجة، ومع ذلك، منذ دلفي 5، تم تغييرها مباشرة إلى بعض العمليات. قم بوضع بادئة للتعليمات الهامة مع تعليمات القفل لتجنب هذه المشكلة. لسوء الحظ، هذا التعديل مكلف للغاية، لأن تعليمات القفل في معالج Pentium II تستغرق وقتًا طويلاً للغاية، وتستغرق حوالي 28 دورة تعليمات إضافية لإكمال هذه العملية، وبالتالي يتم تقليل الكفاءة الإجمالية بمقدار النصف على الأقل. هناك طريقة واحدة فقط لحل هذه المشكلة، وهي تعديل الكود الأساسي لـ delphi rtl. بعد عمل نسخة احتياطية من الملف الأصلي، استبدل جميع الأقفال في source/rtl/sys/system.pas بـ {lock} بالطبع، يجب استبدال الكلمة بأكملها. لم يتم تحسين هذا بشكل كامل حتى الآن، والخطوة التالية هي إزالة تعليمات xchg المضمنة أيضًا في مكتبة وقت تشغيل delphi4 نظرًا لأن هذه التعليمات تحتوي على بادئة قفل ضمنية، يجب أن يكون xchg edx في عمليات _lstrasg و_strlasg في system.pas. سيتم حذفه واستبدال [eax] بالكود التالي:
موف إي إكس، [إياكس]
موف [إيكس]، إدكس
موف إدكس، إيكس
حسنًا، لقد انتهيت، ما عليك سوى تجميعه والكتابة فوق system.dcu. بهذه الطريقة، ستكون كفاءة التنفيذ أعلى بـ 6 مرات من دلفي 5 ومرتين من دلفي 4.