![]() |
|
كيف اكتب دالة سريعة التنفيذ ؟ - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15) +--- الموضوع : كيف اكتب دالة سريعة التنفيذ ؟ (/showthread.php?tid=6492) |
كيف اكتب دالة سريعة التنفيذ ؟ - ALmuhhnad - 17-10-2014 السلام عليكم ورحمة الله وبركاتة كأحد مميزات البرامج المهمة هي سرعة تنفيذ البرنامج .. والتي أتجاهلها كلياً عندما اقوم بكتابة برامجي للاسف الشديد فكل إهتمامي ينصب على اني اطبق الفكرة مهما كانت الوسيلة سؤالي كتالي : كيف أكتب دالة سريعة التنفيذ ؟ بغض النظر عن ترتيب الكود او سهولة قرائتة وحبذا تكون آلية الجواب .. مثلاً ... 1 استعمل المؤشرات .. مثال بسيط على ذلك(المؤشرات) كيف اكتب دالة سريعة التنفيذ ؟ - محمد عبد العزيز - 23-10-2014 وعليكم السلام ورحمة الله وبركاته ألق نظرة عميقة على مشروع Fastcode http://delphi4arab.net/forum/showthread.php?tid=3008 ايضا موضوع قياس الزمن http://delphi4arab.net/forum/showthread.php?tid=2748 كيف اكتب دالة سريعة التنفيذ ؟ - ALmuhhnad - 23-10-2014 سبق وأن اطلعت على تلك المواضيع لكن حبذا ذكر الخلاصة ... على شكل نقاط إن لم يكن هناك مانع كيف اكتب دالة سريعة التنفيذ ؟ - محمد عبد العزيز - 23-10-2014 الخلاصة : تسريع دالة بمعالج ما تفهم جيدا كيف يعمل ذلك المعالج تكتب الدالة بالتجميع Assembly تعمل لها optimization لتستفيد من ذلك المعالج ان كان ولا بد (كي يعمل برنامجك على كل الاجهزة) تكتب أيضا البديل في حالة وجود معالج اقدم مرجعين الاستزادة (ان لم تكن سبق وان اطلعت عليهما) agner.org/optimize mark.masmcode.com كيف اكتب دالة سريعة التنفيذ ؟ - SMP3 - 23-10-2014 الأمر متعلق بنوع المعالج الذي تستهدفه .. +ليس شرط أن تستخدم الأسمبلي . الموضوع طويل جدا .. سأحاول أن أذكر الأشياء المهمة فقط : - عليك بتجنب استعمال الحلقات و جمل الشرط : PHP كود : function BoolToStr(Value: Boolean): PChar;PHP كود : typePHP كود : function GetStr(S: string): string;- محاذات عنوان القفز في الجمل الشرطية (يمكن عملها بالأسمبلي فقط) PHP كود : procedure do_asm;PHP كود : function IsNeg(value: integer): Boolean;عند استخدامك لهذه الطريقة فسيقوم الكومبايلر باستخدام التعليمة SETcc/CMOVcc بدون تعليمة قفز ! ركز جيدا عليها ![]() - استخدام تعليمات معينة بدل التعليمات التي يستخدمها الكومبايلر : كمثال .. لو لديك بيانات بطول 64 بت فالأفضل ان تستخدم mmx على 32 بت . أما على 64 بت .. فحجم المسجلات بالفعل 64 بت .. لذلك لن تكون بحاجة الى استخدام الاسمبلي . -استخدام ال inline للدوال الصغيرة : PHP كود : function GetLowWord(W: Word): Byte;بهذه الطريقة لن يقوم الكومبايلر باضافة call الى الدالة .==> أداء أسرع .. العيب : ستواجه مشكلة في بعض الحالات (عند debuging) عن نفسي : لا أستخدمها عند ال debug : PHP كود : function FastGetLowWord(W: Word): Byte;{$IFNDEF DEBUG} inline;{$ENDIF} -استخدام ال Bit manipulation بدل التعيمات الأخرى : كمثال : هذا كود بسيط يقوم بتقريب عدد الى مضاعف 4 .. بحيث يكون ناتج القسمة على 4 = 0 PHP كود : function RoundTo4(Value: Integer): Integer;الدالة الأولى بطيئة .. ليس فقط لاستخدام if بل لأنه معروف أن التعليمة div من أبطأ تعليمات الأسمبلي . [COLOR="red"]-مع دلفي xe7 يمكنك استخدام parallel library : تسمح لك هذه الطريقة بمعالجة العديد من التعليمات في نفس الوقت .. كمثال : لديك مجموعة من السطور (نص) ستقوم باجراء بعض التعديلات عليه . لو كان في المعالج الذي تستخدمه نواتين .. فسيتم استخدامهما في نفس الوقت بحيث . النواة الأولى تقوم بمعالجة السطر n . و الثانية ستقوم بمعالجة السطر n+1 . النتيجة : أداء سريع بنسبة optimisation تصل الى 40 % أو أكثر . [/COLOR] -.... العديد من الأمور .. ان كان ليد بعض الوقت فعليك بالاطلاع على : Intel® 64 and IA-32 Architectures Optimization Reference Manual كود : http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-optimization-manual.html
الكتاب يستهدف معالجات انتل فقط .يشرح الطرق السليمة لكتابة أكواد سريعة . كيف اكتب دالة سريعة التنفيذ ؟ - ALmuhhnad - 25-10-2014 شكراً لك أخي SMP3 و B.M.AbdelAziZ نعم هذا ما كنت أقصد بالسؤال .. بعض الـ Tricks والطرق التي تجعل الكود أسرع أجابة شافية ووافية أخي SMP3 |