ما هو البرنامج الفعال؟ لا يجب أن يعمل البرنامج الفعال بشكل أسرع من البرنامج الذي يؤدي نفس الوظيفة فحسب، بل يجب أيضًا أن يستهلك موارد نظام أقل. تجمع هذه المقالة بعض الخبرات التي تراكمت لدى المؤلف عند استخدام لغة VB لتطوير البرمجيات، وتستخدم بعض الأمثلة البسيطة لتوضيح كيفية كتابة كود VB فعال. يحتوي على بعض التقنيات التي قد تكون مفيدة جدًا لمبرمجي VB. قبل أن أبدأ، اسمحوا لي أن أوضح بعض المفاهيم.
دع الكود يتشكل مرة واحدة: من بين المبرمجين الذين تواصلت معهم، يحب العديد من الأشخاص كتابة الكود أولاً وفقًا للمتطلبات الوظيفية، ثم تحسين الكود على هذا الأساس. وفي النهاية، وجدوا أنه من أجل تحقيق التحسين، كان عليهم إعادة كتابة التعليمات البرمجية. لذا أقترح عليك أن تفكر في مشكلات التحسين قبل كتابة التعليمات البرمجية.
فهم العلاقة بين نتائج التحسين والعمل المطلوب: عادة عند اكتمال جزء من التعليمات البرمجية، تحتاج إلى فحصه وتعديله. في عملية فحص الكود، قد تجد أن كفاءة الكود في بعض الحلقات يمكن تحسينها بشكل أكبر. في هذه الحالة، العديد من المبرمجين الذين يسعون إلى الكمال قد يقومون بتعديل التعليمات البرمجية على الفور. اقتراحي هو أنه إذا كان تغيير هذا الرمز سيؤدي إلى تقصير وقت تشغيل البرنامج بمقدار ثانية واحدة، فيمكنك تغييره. إذا كان بإمكانه فقط تحقيق تحسين الأداء بمقدار 10 ميلي ثانية، فلن يتم إجراء أي تغييرات. وذلك لأن إعادة كتابة جزء من التعليمات البرمجية ستؤدي حتمًا إلى ظهور أخطاء جديدة، ومن المؤكد أن تصحيح أخطاء التعليمات البرمجية الجديدة سيستغرق قدرًا معينًا من الوقت. يجب على المبرمجين إيجاد توازن بين أداء البرنامج وحجم العمل المطلوب لتطوير البرنامج، و10 ميلي ثانية هي فارق لا يمكن للمستخدمين تقديره.
حاول استخدام الأساليب الموجهة للكائنات عندما تحتاج إلى استخدامها؛ الآلية التي يوفرها VB لا تدعم بشكل كامل التصميم والتشفير الموجه للكائنات، لكن VB يوفر فئات بسيطة. يعتقد معظم الناس أن استخدام الكائنات سيؤدي إلى تعليمات برمجية أقل كفاءة. أنا شخصياً لدي بعض الآراء المختلفة حول هذه النقطة؛ لا يمكن تقييم كفاءة التعليمات البرمجية من منظور سرعة التشغيل فقط، كما تعد الموارد التي يشغلها البرنامج أحد العوامل التي يجب أخذها في الاعتبار. يمكن أن يساعدك استخدام الفئات في تحسين الأداء العام لبرنامجك، وهو ما سأشرحه بالتفصيل في الأمثلة اللاحقة.
عندما تكتب كود VB، آمل أن تتمكن من استخدام النقاط المذكورة أعلاه كمبادئ لتوجيه عملية الترميز الخاصة بك. لقد قسمت المقالة إلى قسمين: كيفية تحسين سرعة تشغيل الكود وتحسين التجميع.
كيفية جعل التعليمات البرمجية الخاصة بك تعمل بشكل أسرع
يمكن أن تساعدك الطرق التالية على تحسين سرعة التعليمات البرمجية الخاصة بك:
1. استخدم الأعداد الصحيحة (عدد صحيح) والأعداد الصحيحة الطويلة (طويلة)
أسهل طريقة لجعل التعليمات البرمجية الخاصة بك تعمل بشكل أسرع هي استخدام أنواع البيانات الصحيحة. قد لا تصدق ذلك، ولكن اختيار نوع البيانات الصحيح يمكن أن يؤدي إلى تحسين أداء التعليمات البرمجية الخاصة بك بشكل كبير. في معظم الحالات، يمكن للمبرمجين استبدال متغيرات النوع الفردي والمزدوج والعملة بمتغيرات النوع الصحيح أو الطويل، لأن قدرة VB على التعامل مع العدد الصحيح والطويل أعلى بكثير من قدرة أنواع البيانات الأخرى.
في معظم الحالات، يكون سبب اختيار المبرمجين لاستخدام Single أو Double هو قدرتهم على حفظ الكسور العشرية. ولكن يمكن أيضًا تخزين الكسور العشرية في متغيرات من النوع Integer. على سبيل المثال، إذا كان هناك ثلاث منازل عشرية متفق عليها في البرنامج، فأنت تحتاج فقط إلى تقسيم القيمة المخزنة في المتغير الصحيح على 1000 للحصول على النتيجة. من خلال تجربتي، يمكن تشغيل التعليمات البرمجية بشكل أسرع بحوالي 10 مرات باستخدام عدد صحيح وطويل بدلاً من المفرد والمزدوج والعملة.
2. تجنب استخدام المتغيرات
بالنسبة لمبرمج VB، هذا أمر واضح. تتطلب متغيرات أنواع المتغيرات 16 بايت من المساحة لتخزين البيانات، بينما يتطلب العدد الصحيح (Integer) 2 بايت فقط. عادةً ما يكون الغرض من استخدام الأنواع المتغيرة هو تقليل عبء عمل التصميم وكمية التعليمات البرمجية، ويستخدمها بعض المبرمجين أيضًا لتوفير المتاعب. ولكن إذا تم تصميم البرنامج وترميزه بشكل صارم وفقًا للمواصفات، فيمكن تجنب استخدام الأنواع المتغيرة تمامًا.
بالمناسبة، نفس المشكلة موجودة أيضًا بالنسبة لكائنات الكائنات. يرجى إلقاء نظرة على الكود أدناه:
mFSO
SetFSO=NewScripting.FileSystemObject
أو
DimFSOasobject
SetFSO=NewScripting.FileSystemObject
نظرًا لأن الكود أعلاه لا يحدد نوع البيانات عند الإعلان، فسيتم إهدار الذاكرة ووقت وحدة المعالجة المركزية أثناء التعيين. يجب أن يبدو الرمز الصحيح كما يلي:
DimFSOasNewFileSystemObject
3. حاول تجنب استخدام السمات
في الكود اليومي، الكود غير الفعال الأكثر شيوعًا هو الاستخدام المتكرر للخصائص (الخاصية) عندما يكون من الممكن استخدام المتغيرات، خاصة في الحلقات. يجب أن تعلم أن سرعة الوصول إلى المتغيرات تبلغ حوالي 20 مرة سرعة الوصول إلى السمات. الكود التالي يستخدمه العديد من المبرمجين في برامجهم:
DimintConasInteger
ForintCon=0toUbound(SomVar())
Text1.Text=Text1.Text&vbcrlf&SomeVar(intCon)
NextintCon
يتم تنفيذ الكود أدناه أسرع 20 مرة من الكود أعلاه.
DimintConasInteger
DimsOutputasString
ForintCon=0toUbound(SomeVar())
sOutput=sOutput&vbCrlf&
SomeVar(intCon)
التالي
Text1.Text=sOutput
4. حاول استخدام المصفوفات وتجنب استخدام المجموعات
ما لم يكن من الضروري استخدام مجموعة، يجب عليك دائمًا استخدام مصفوفة. وفقًا للاختبارات، يمكن أن تصل سرعة الوصول إلى المصفوفات إلى 100 ضعف سرعة الوصول إلى المجموعات. يبدو هذا الرقم صادمًا بعض الشيء، ولكن إذا اعتبرت أن المجموعة هي شيء، فسوف تفهم سبب وجود الفرق الكبير جدًا.
5. قم بتوسيع جسم الحلقة الصغيرة
عند البرمجة، قد تواجه هذا الموقف: سيتم تكرار نص الحلقة مرتين أو ثلاث مرات فقط، ويتكون نص الحلقة من عدة أسطر من التعليمات البرمجية. في هذه الحالة، يمكنك فتح الحلقة. والسبب هو أن الحلقة تستهلك وقتًا إضافيًا لوحدة المعالجة المركزية. ولكن إذا كانت الحلقة أكثر تعقيدًا، فلن تحتاج إلى القيام بذلك.
6. تجنب استخدام الوظائف القصيرة جدًا
كما هو الحال مع استخدام الحلقات الصغيرة، من غير الاقتصادي استدعاء دالة تحتوي على بضعة أسطر فقط من التعليمات البرمجية - قد يستغرق استدعاء الوظيفة وقتًا أطول من تنفيذ التعليمات البرمجية في الوظيفة. في هذه الحالة، يمكنك نسخ التعليمات البرمجية الموجودة في الدالة إلى المكان الذي تم استدعاء الدالة فيه في الأصل.
7. تقليل الإشارات إلى الكائنات الفرعية
في VB، يتم تنفيذ مراجع الكائنات باستخدام . على سبيل المثال:
Form1.Text1.Text
في المثال أعلاه، يشير البرنامج إلى كائنين: Form1 وText1. الاقتباس باستخدام هذه الطريقة غير فعال. لكن لسوء الحظ، لا توجد وسيلة لتجنب ذلك. الشيء الوحيد الذي يمكن للمبرمج فعله هو استخدام الكائن الفرعي (النص 1) أو حفظه مع كائن آخر.
ملحوظة: استخدم مع
معfrmMain.Text1
.نص = "تعلم VB"
.المحاذاة=0
.العلامة = "إتسمي لايف"
.BackColor=vbBlack
.ForeColor=vbWhite
نهاية مع
أو
ملاحظة: استخدم كائنًا آخر لحفظ الكائن الفرعي
DimtxtTextBoxasTextBox
SettxtTextBox=frmMain.Text1
TxtTextBox.Text="تعلم VB"
TxtTextBox.Alignment=0
TxtTextBox.Tag="Itsmylife"
TxtTextBox.BackColor=vbBlack
TxtTextBox.ForeColor=vbWhite
لاحظ أن الطريقة المذكورة أعلاه تنطبق فقط عندما تحتاج إلى العمل على كائنات فرعية لكائن ما. الكود التالي غير صحيح:
مع النص1
.نص = "تعلم VB"
.المحاذاة=0
.العلامة = "إتسمي لايف"
.BackColor=vbBlack
.ForeColor=vbWhite
نهاية مع
لسوء الحظ، يمكننا غالبًا العثور على تعليمات برمجية مشابهة لما ورد أعلاه في التعليمات البرمجية الفعلية. سيؤدي القيام بذلك إلى جعل تنفيذ التعليمات البرمجية أبطأ. والسبب هو أن الكتلة With ستشكل فرعًا بعد التجميع، مما سيضيف أعمال معالجة إضافية.
8. تحقق مما إذا كانت السلسلة فارغة
يستخدم معظم المبرمجين الطريقة التالية عند التحقق مما إذا كانت السلسلة فارغة:
إذاText1.Text = "" ثم
ملاحظة: تنفيذ إجراء
إنديف
لسوء الحظ، يتطلب إجراء مقارنات السلسلة معالجة أكثر من قراءة الخصائص. لذلك أقترح عليك استخدام الطريقة التالية:
IfLen(Text1.Text)=0ثم
ملاحظة: تنفيذ إجراء
إنديف
9. اسم المتغير بعد إزالة الكلمة الأساسية التالية
ستؤدي إضافة اسم المتغير بعد الكلمة الأساسية التالية إلى انخفاض كفاءة الكود. لا أعرف لماذا يحدث هذا، إنها مجرد تجربة. لكنني أعتقد أن عددًا قليلًا جدًا من المبرمجين قد يذهبون إلى حد إضافة معلومات زائدة عن الحاجة، ففي نهاية المطاف، معظم المبرمجين هم أشخاص يعتزون بكلمات مثل الذهب.
التعليق: رمز خاطئ
فوريكونت = 1 إلى 10
ملاحظة: تنفيذ إجراء
NextiCount
ملاحظة: الكود الصحيح
فوريكونت = 1 إلى 10
ملاحظة: تنفيذ إجراء
التالي
10. استخدم المصفوفات بدلاً من المتغيرات المتعددة
عندما يكون لديك متغيرات متعددة تحتوي على بيانات متشابهة، فكر في استبدالها بمصفوفة. في VB، تعد المصفوفات واحدة من أكثر هياكل البيانات كفاءة.
11. استخدم المصفوفات الديناميكية بدلاً من المصفوفات الثابتة
لن يكون لاستخدام المصفوفات الديناميكية تأثير كبير على سرعة تنفيذ التعليمات البرمجية، ولكن في بعض الحالات يمكن أن يوفر الكثير من الموارد.
12. تدمير الأشياء
بغض النظر عن نوع البرنامج المكتوب، يحتاج المبرمجون إلى التفكير في تحرير مساحة الذاكرة التي يشغلها البرنامج بعد أن يقرر المستخدم إنهاء البرنامج. لكن لسوء الحظ، يبدو أن العديد من المبرمجين لا يهتمون كثيرًا بهذا الأمر. الطريقة الصحيحة هي تدمير الكائنات المستخدمة في البرنامج قبل الخروج من البرنامج. على سبيل المثال:
DimFSOasNewFileSystemObject
ملاحظة: تنفيذ إجراء
ملاحظة: تدمير الكائن
SetFSO=لا شيء
بالنسبة للنماذج، يمكنك إلغاء تثبيت:
UnloadfrmMain
أو
SetfrmMain=لا شيء
13. سلاسل متغيرة الطول وثابتة الطول
من الناحية الفنية، تتطلب السلاسل ذات الطول الثابت وقت معالجة ومساحة أقل من السلاسل ذات الطول المتغير. ومع ذلك، فإن عيب السلاسل ذات الطول الثابت هو أنه في كثير من الحالات، تحتاج إلى استدعاء الدالة Trim لإزالة الحرف الفارغ في نهاية السلسلة، مما سيؤدي إلى تقليل كفاءة التعليمات البرمجية. لذلك ما لم يتغير طول السلسلة، استخدم سلاسل متغيرة الطول.
14. استخدم وحدات الفئة بدلاً من عناصر تحكم ActiveX
ما لم تتضمن عناصر تحكم ActiveX واجهات مستخدم، حاول استخدام كائنات خفيفة مثل الفئات. هناك فرق كبير في الكفاءة بين الاثنين.
15. استخدم الأشياء الداخلية
عندما يتعلق الأمر باستخدام عناصر تحكم ActiveX وملفات DLL، يحب العديد من المبرمجين تجميعها ثم إضافتها إلى المشروع. أنصحك بعدم القيام بذلك لأن الاتصال بكائن خارجي من VB يتطلب الكثير من قوة معالجة وحدة المعالجة المركزية. في كل مرة تقوم فيها باستدعاء طريقة ما أو الوصول إلى خاصية ما، فإنك تهدر الكثير من موارد النظام. إذا كان لديك التعليمات البرمجية المصدر لعنصر تحكم ActiveX أو DLL، فاجعلها كائنات خاصة في المشروع.
16. تقليل عدد الوحدات
يحب بعض الأشخاص الاحتفاظ بالوظائف المشتركة في الوحدات، وأنا أتفق مع ذلك. لكن كتابة عشرين أو ثلاثين سطرًا فقط من التعليمات البرمجية في وحدة نمطية أمر مثير للسخرية بعض الشيء. إذا لم تكن بحاجة حقًا إلى وحدة نمطية، فحاول عدم استخدامها. والسبب في ذلك هو أن لغة VB تقوم بتحميل الوحدات النمطية إلى الذاكرة فقط عند استدعاء الوظائف أو المتغيرات الموجودة في الوحدة النمطية؛ ويتم إلغاء تحميل هذه الوحدات النمطية من الذاكرة عند خروج تطبيق VB. إذا كانت هناك وحدة نمطية واحدة فقط في الكود، فسيقوم VB بإجراء عملية تحميل واحدة فقط، وبالتالي سيتم تحسين كفاءة الكود، وعلى العكس من ذلك، إذا كانت هناك وحدات متعددة في الكود، فسيقوم VB بإجراء عمليات تحميل متعددة، وكفاءة سيتم تخفيض الكود.
17. استخدم صفائف الكائنات
عند تصميم واجهات المستخدم، يجب على المبرمجين محاولة استخدام صفائف الكائنات لعناصر تحكم من نفس النوع. يمكنك إجراء تجربة: قم بإضافة 100 PictureBoxes إلى النافذة، لكل منها اسم مختلف، وقم بتشغيل البرنامج. ثم أنشئ مشروعًا جديدًا، وأضف أيضًا 100 PictureBoxes إلى النافذة، ولكن هذه المرة استخدم مصفوفة كائنات، وقم بتشغيل البرنامج، يمكنك ملاحظة الفرق في وقت تحميل البرنامجين.
18. استخدم طريقة النقل
عند تغيير موضع كائن ما، يفضل بعض المبرمجين استخدام خصائص العرض والارتفاع والأعلى واليسار. على سبيل المثال:
الصورة 1. العرض = 100
الصورة 1. الارتفاع = 100
الصورة1.الأعلى=0
الصورة 1. اليسار = 0
في الواقع، هذا غير فعال للغاية، لأن البرنامج يقوم بتعديل أربع خصائص، وبعد كل تعديل، سيتم إعادة رسم النافذة. الطريقة الصحيحة هي استخدام طريقة النقل:
Image1.Move0,0,100,100
19. التقليل من استخدام الصور
ستستهلك الصور قدرًا كبيرًا من الذاكرة، وستستهلك معالجة الصور أيضًا الكثير من موارد وحدة المعالجة المركزية. في البرامج، إذا أمكن، فكر في استخدام ألوان الخلفية بدلاً من الصور - بالطبع هذا مجرد وجهة نظر شخص تقني حول هذه المشكلة.
20. استخدم ActiveXDLL بدلاً من عناصر تحكم ActiveX
إذا كان كائن ActiveX الذي تقوم بتصميمه لا يتضمن واجهة مستخدم، فاستخدم ActiveXDLL.
الأمثل تجميع
العديد من مبرمجي VB الذين التقيت بهم لم يستخدموا أبدًا خيارات الترجمة أو حاولوا معرفة الاختلافات بين الخيارات. دعونا نلقي نظرة على المعنى المحدد لكل خيار.
1.P-code (الكود الكاذب) والكود الأصلي
يمكنك اختيار ترجمة البرنامج إلى P-code أو الكود الأصلي. الخيار الافتراضي هو الكود الأصلي. إذن ما هو P-code والرمز الأصلي؟
P-code: عند تنفيذ التعليمات البرمجية في VB، يقوم VB أولاً بتجميع التعليمات البرمجية إلى P-code، ثم يفسر وينفذ كود P المترجم. في بيئة مترجمة، يكون استخدام هذا الرمز أسرع من التعليمات البرمجية الأصلية. بعد تحديد P-Code، يقوم VB بوضع الكود الكاذب في ملف EXE عند التحويل البرمجي.
الكود الأصلي: الكود الأصلي هو خيار تم تقديمه فقط بعد VB6. عند تجميعها في ملف EXE، يتم تنفيذ التعليمات البرمجية الأصلية بشكل أسرع من P-code. بعد تحديد التعليمات البرمجية الأصلية، يستخدم VB تعليمات الجهاز لإنشاء ملف EXE عند التحويل البرمجي.
عند التجميع باستخدام التعليمات البرمجية الأصلية، أجد أنه في بعض الأحيان يتم تقديم أخطاء لا يمكن تفسيرها. يتم تنفيذ التعليمات البرمجية الخاصة بي بشكل صحيح تمامًا في بيئة الترجمة، ولكن ملف EXE الذي تم إنشاؤه باستخدام خيار التعليمات البرمجية الأصلية لا يتم تنفيذه بشكل صحيح. يحدث هذا عادةً عند إلغاء تحميل نافذة أو ظهور نافذة طباعة. لقد قمت بحل هذه المشكلة عن طريق إضافة عبارة DoEvent إلى الكود. بالطبع، احتمال حدوث ذلك نادر جدًا، ربما لم يواجهه بعض مبرمجي VB من قبل، لكنه موجود.
هناك أيضًا العديد من الخيارات في الكود الأصلي:
أ) تحسين سرعة التعليمات البرمجية: يمكن لهذا الخيار تجميع ملف قابل للتنفيذ بشكل أسرع، ولكن الملف القابل للتنفيذ أكبر. مُستَحسَن
ب) تحسين حجم الكود: يمكن لهذا الخيار تجميع ملف أصغر قابل للتنفيذ، ولكن على حساب السرعة، لا يوصى به.
ج) لا يوجد تحسين: يقوم هذا الخيار فقط بتحويل رمز P إلى رمز أصلي دون أي تحسين. يمكن استخدامها عند تصحيح التعليمات البرمجية.
د) مُحسّن لـ Pentium Pro: على الرغم من أن هذا الخيار ليس هو الخيار الافتراضي في التعليمات البرمجية الأصلية، إلا أنني عادةً ما أستخدم هذا الخيار. يمكن أن يعمل البرنامج القابل للتنفيذ الذي تم تجميعه باستخدام هذا الخيار بشكل أسرع على PentiumPro وPentium2 أو الأجهزة الأعلى، ولكنه سيكون أبطأ قليلاً على الأجهزة الأقدم. وبالنظر إلى أن استخدام Pentium2 أصبح قديما الآن، فمن المستحسن أن يستخدم الجميع هذا الخيار.
هـ) إنشاء معلومات تصحيح رمزية: يقوم هذا العنصر بإنشاء بعض معلومات التصحيح أثناء عملية الترجمة، مما يسمح للمستخدمين باستخدام أدوات مثل Visual C++ لتصحيح التعليمات البرمجية المترجمة. يؤدي استخدام هذا الخيار إلى إنشاء ملف بتنسيق pdf الذي يسجل معلومات العلامة في الملف القابل للتنفيذ. يكون هذا الخيار مفيدًا عندما يحتوي البرنامج على وظائف API أو استدعاءات DLL.
2. التحسين المتقدم
يمكن أن تساعدك الإعدادات الموجودة في Advanced Optimization على تحسين سرعة برنامجك، ولكنها قد تؤدي في بعض الأحيان إلى ظهور بعض الأخطاء، لذا أوصي باستخدامها بعناية قدر الإمكان. إذا كانت هناك أجسام حلقة كبيرة نسبيًا أو عمليات رياضية معقدة في الكود، فإن تحديد عناصر معينة في التحسين المتقدم سيؤدي إلى تحسين أداء الكود بشكل كبير. إذا كنت تستخدم ميزات التحسين المتقدمة، فإنني أوصي باختبار الملفات المجمعة بدقة.
أ) بافتراض عدم وجود اسم مستعار: يمكن أن يحسن كفاءة تنفيذ التعليمات البرمجية في نص الحلقة، ولكن إذا تم تغيير قيمة المتغير من خلال مرجع المتغير، مثل استدعاء الطريقة، يتم استخدام مرجع المتغير كمعلمة للطريقة، وتغيير قيمة المتغير في قيمة الطريقة، سيظهر خطأ. قد يكون الأمر مجرد أن النتيجة التي تم إرجاعها خاطئة، أو قد يكون خطأً خطيرًا يتسبب في مقاطعة البرنامج.
ب) إلغاء التحقق من ربط المصفوفة، وإلغاء التحقق من تجاوز الأعداد الصحيحة، وإلغاء التحقق من خطأ النقطة العائمة: عند تشغيل البرنامج، إذا تم العثور على أخطاء من خلال عمليات التحقق هذه، فسيقوم رمز معالجة الأخطاء بمعالجة هذه الأخطاء. ولكن إذا تم إلغاء هذه الفحوصات، فلن يتمكن البرنامج من معالجة الخطأ. يجب عليك استخدام هذه الخيارات فقط إذا كنت متأكدًا من عدم حدوث الأخطاء المذكورة أعلاه في التعليمات البرمجية الخاصة بك. سوف يقومون بتحسين أداء البرنامج بشكل كبير.
ج) السماح بعمليات الفاصلة العائمة دون التقريب: يتيح تحديد هذا الخيار للبرنامج المترجم معالجة عمليات الفاصلة العائمة بشكل أسرع. عيبه الوحيد هو أنه قد يؤدي إلى نتائج غير صحيحة عند مقارنة رقمين عائمين.
د) إلغاء فحص أمان PentiumFDIV: تم تعيين هذا الخيار لبعض شرائح Pentium القديمة ويبدو الآن أنه قديم