رمز سريع

FastCode هو مشروع برمجي مفتوح المصدر يهدف إلى توفير إجراءات مكتبة وقت التشغيل المحسّنة لـ Embarcadero Delphi و C++ Builder . بدأ هذا المشروع المجتمعي في عام 2003 على يد دينيس كير كريستنسن ، وقد ساهم منذ ذلك الحين في تحسين وظائف مكتبة وقت تشغيل Delphi ذات 32 بت (RTL).

تُنظَّم مسابقة FastCode على شكل تحديات، وتركز على تحسين وظائف محددة لتحقيق أهداف متعددة. يوفر المشروع أدوات قياس الأداء وعمليات التحقق لكل وظيفة مُساهمة. تُقيَّم المساهمات، وتُمنح النقاط بناءً على الأداء المُحقق للأهداف. تُقر شركة Embarcadero بالبرمجيات التي أنشأها فريق FastCode وتُدمجها في قاعدة بيانات Delphi الخاصة بها . معظم المشاركين في هذا المشروع هم مطورو لغة التجميع الذين يستخدمون برمجيات خاصة بالمعالج. قائمة التحديات التي يتناولها مشروع FastCode واسعة النطاق؛ فهي تغطي مجالات متنوعة تتراوح من وظائف معالجة النصوص مثل PosEx و CompareText إلى العمليات الحسابية مثل Power و Int64Mul.

بناء

يُنظّم المشروع على شكل مسابقة مُقسّمة إلى تحديات. يتناول كل تحدٍّ دالة واحدة ويُحسّنها وفقًا لعدد من الأهداف. يُوفّر المشروع أدواتٍ لتقييم كل مساهمة برمجية والتحقق من صحتها. تُمنح نقطة واحدة لكل مساهمة (بحد أقصى دالة واحدة لكل هدف)، وتُمنح عشر نقاط للفائز بالهدف. تُحفظ قائمة بجميع المساهمين ونتائجهم، وفي نهاية كل عام، حتى عام ٢٠٠٨، يُحتفى بالفائز. وقد دأبت شركات بورلاند ، وكودجير، وإمباركاديرو ، المالكة لبرنامجي دلفي وسي ++ بيلدر ، على رعاية الجوائز.

معظم المشاركين في المسابقة هم مطورو لغة التجميع الذين غالباً ما يستخدمون رمزاً خاصاً بالمعالج ذي 32 بت ومجموعات تعليمات إضافية، مثل MMX و SSE و SSE2 و SSE3 و SSSE3 و SSE4 . [ 1 ]

يحظى المشروع بدعم شركة إمباركاديرو التي تُقدّر مساهمات فريق فاست كود وتُدمج شفرتهم البرمجية في قاعدة شفرة دلفي. [ 2 ] مدير الذاكرة الافتراضي لإمباركاديرو دلفي ، فاست إم إم 4، هو الفائز في تحدي مديري الذاكرة الذي أطلقته فاست كود. [ 3 ]

استضاف موقع OptimalCode التابع لروبرت لي المشروع في البداية، وصفحة الكود المصدري الرئيسية هيتم تحديثه آخر مرة عام 2008. يحتوي الكود المصدري على كلٍ من الإجراءات المحسّنة ومجموعات الاختبار لتقييم أداء هذه الإجراءات. في عام 2017، تم نقل إجراءات التقييم الخاصة بـ Move وFillChar ومدير الذاكرة إلى أنظمة 64 بت، وهي متاحة على الرابط التالي:.

الاختبار

يولي مشروع FastCode اهتماماً بالغاً بالاختبارات، ويركز على توفير برمجيات عالية الجودة. وتنقسم الاختبارات إلى فئتين رئيسيتين: اختبار صحة البرمجيات واختبار سرعتها.

تصديق

يتم التحقق من صحة البيانات على جميع وحدات المعالجة المركزية ضمن المجموعة المستهدفة، وغالبًا ما يتم التحقق أيضًا على وحدات معالجة مركزية وأنظمة تشغيل أخرى (مثل Windows XP و Windows Vista و Windows 7 ). ويشمل التحقق العديد من مدخلات الدوال المختلفة، سواء في حالات الاستخدام العادية أو حالات الخطأ. ويتم التحقق من صحة البيانات بمقارنتها بالقيم الصحيحة المعروفة وبالتطبيقات المرجعية، مثل دوال RTL الموجودة.

المقارنة المعيارية

تُجرى اختبارات الأداء على جميع وحدات المعالجة المركزية (CPU) التي تُشكّل جزءًا من مجموعة الأهداف الحالية في الوقت المحدد. هذه الوحدات كانت أو ما زالت جزءًا من مجموعات الأهداف التالية: ( Intel Pentium 3 ، Intel Pentium M ، Intel Pentium 4 ، Intel Core ، Intel Core 2 ، AMD Athlon XP ، AMD Opteron ، AMD Phenom ). وقد بُذلت عناية فائقة لضمان استقرار وواقعية نتائج الاختبارات. فعلى وجه الخصوص، كان من الصعب ضمان عدالة اختبار إدارة الذاكرة، ولذلك تم جمع سجلات استخدام إدارة الذاكرة من الاستخدام العادي لتطبيقات العالم الحقيقي، ثم إعادة تشغيلها بواسطة برنامج الاختبار.

الأهداف

تم إجراء الاختبارات على مجموعة الأهداف الكاملة. تُحدد مجموعة أهداف جديدة سنويًا من خلال استطلاع رأي يُشارك فيه مجتمع FastCode. تتكون مجموعة الأهداف عادةً من ستة معالجات، أربعة منها من Intel واثنان من AMD. تم اختيار هذه النسبة لمحاكاة الحصص السوقية. بالإضافة إلى هذه المعالجات الستة، توجد عشرة أهداف مُعرّفة كمزيج من المعالجات الستة. تُسمى هذه الأهداف العشرة بالأهداف المحسوبة، ويمكن أن تكون مُخصصة للسرعة فقط أو مزيجًا من السرعة والحجم. يختلف الحد الأقصى المسموح به لمجموعة التعليمات لكل هدف. قد يكون الهدف "عقوبة حجم IA32" أو "SSE2". يتم تحديد عقوبة الحجم لكل تحدٍّ من خلال استطلاع رأي.

قائمة التحديات

نفّذ مشروع FastCode التحديات التالية:

  • معيار التشفير المتقدم (AES )
  • AnsiStringReplace (يستبدل حالات ظهور سلسلة فرعية داخل سلسلة نصية.)
  • ArcCos (يحسب معكوس جيب التمام. إصدارات محملة بشكل زائد للدقة الفردية والمزدوجة والممتدة.)
  • ArcSin (يحسب الجيب العكسي. إصدارات محملة بشكل زائد للدقة المفردة والمزدوجة والممتدة.)
  • Ceil32 (إرجاع أكبر عدد صحيح قريب من 32 بت.)
  • Ceil64 (إرجاع أكبر عدد صحيح قريب من 64 بت.)
  • CharPos (يبحث عن أول ظهور لحرف في سلسلة نصية. ويعيد موضع هذا الظهور.)
  • CharPosIEx (بحث غير حساس لحالة الأحرف عن أول ظهور لحرف في سلسلة نصية بدءًا من فهرس يتم تمريره كمعامل. ويعيد موضع هذا الظهور.)
  • CharPosEy (يبحث عن الظهور رقم n لحرف في سلسلة نصية بدءًا من فهرس يتم تمريره كمعامل. ويعيد موضع هذا الظهور.)
  • CharPosRev (يبحث عن آخر ظهور لحرف في سلسلة نصية. ويعيد موضع هذا الظهور.)
  • CompareMem (يقارن بين كتلتين من الذاكرة.)
  • CompareStr (يقارن بين سلسلتين نصيتين من نوع AnsiString.)
  • CompareText (يقارن بين سلسلتين نصيتين.)
  • Fillchar (يملأ قسمًا من مخزن التخزين المؤقت بنفس البايت أو الحرف FillValue FillCount مرات.)
  • Floor32 (إرجاع أصغر عدد صحيح قريب من 32 بت.)
  • Floor64 (إرجاع أصغر عدد صحيح قريب من 64 بت.)
  • GCD32 (القاسم المشترك الأكبر 32 بت)
  • تحويل جيب التمام المنفصل العكسي (IDCT)
  • Int64Div (يقسم عددين صحيحين من 64 بت)
  • Int64Mul (يضرب عددين صحيحين من 64 بت)
  • IntToStr (يحول عددًا صحيحًا إلى سلسلة نصية)
  • IsPrime (اختبار أولية عدد صحيح مكون من 32 بت)
  • LowerCase (يحول سلسلة نصية إلى أحرف صغيرة)
  • MaxFP (إرجاع القيمة القصوى من بين قيمتين من نوع Single أو Double أو Extended float point)
  • MaxInt (إرجاع القيمة القصوى من بين قيمتين صحيحتين)
  • MaxInt64 (إرجاع القيمة القصوى من بين قيمتين صحيحتين 64 بت)
  • مدير الذاكرة
  • MinFP (إرجاع الحد الأدنى من قيمتين من نوع Single أو Double أو Extended float point)
  • MinInt (إرجاع أصغر قيمة من بين قيمتين صحيحتين)
  • MinInt64 (إرجاع أصغر قيمة من بين قيمتين صحيحتين 64 بت)
  • نقل (نسخ N بايت من المصدر إلى الوجهة)
  • جمع الأعداد المركبة القطبية
  • طرح الأعداد المركبة القطبية
  • ضرب الأعداد المركبة القطبية
  • قسمة الأعداد المركبة القطبية
  • تحويل التنسيق القطبي إلى تنسيق مستطيل
  • Pos (يبحث عن أول ظهور لسلسلة فرعية في سلسلة نصية. ويعيد موضع هذا الظهور.)
  • PosEx (يبحث عن أول ظهور لسلسلة فرعية في سلسلة نصية بدءًا من فهرس يتم تمريره كمعامل. ويعيد موضع هذا الظهور.)
  • PosIEx (بحث غير حساس لحالة الأحرف عن أول ظهور لسلسلة فرعية في سلسلة نصية بدءًا من فهرس يتم تمريره كمعامل. ويعيد موضع هذا الظهور.)
  • القوة (تعيد الأساس مرفوعًا إلى الأس)
  • جمع الأعداد المركبة المستطيلة
  • طرح الأعداد المركبة المستطيلة
  • ضرب الأعداد المركبة المستطيلة
  • قسمة الأعداد المركبة المستطيلة
  • تحويل التنسيق المستطيل إلى التنسيق القطبي
  • تحويل تنسيق RGBA إلى BGRA (تنسيق الصورة النقطية)
  • دالة التقريب (التقريب المصرفي على أساس القيمة المفردة أو المزدوجة أو الموسعة. تُرجع عددًا صحيحًا من 64 بت)
  • RoundToEx (يقرب قيمة الفاصلة العائمة ذات الدقة الموسعة إلى رقم محدد أو قوة من قوى العشرة باستخدام "تقريب المصرفيين").)
  • Round32 (تقريب مصرفي على قيمة مفردة أو مزدوجة أو موسعة. يُرجع عددًا صحيحًا من 32 بت)
  • تصغير الحجم (تغيير حجم الصورة النقطية)
  • نوع
  • StrComp (يقارن سلسلتين نصيتين تنتهيان بـ null، مع مراعاة حالة الأحرف)
  • StrCopy (ينسخ سلسلة نصية منتهية بـ null إلى أخرى)
  • StrIComp (يقارن سلسلتين نصيتين تنتهيان بـ null، دون مراعاة حالة الأحرف)
  • StrLen (تعيد طول سلسلة نصية تنتهي بـ null)
  • StrLComp (يقارن سلسلتين نصيتين تنتهيان بـ null حتى طول معين، مع مراعاة حالة الأحرف)
  • StrLIComp (يقارن سلسلتين نصيتين تنتهيان بـ null حتى طول معين، دون مراعاة حالة الأحرف)
  • StrToInt32 (يحول سلسلة نصية إلى عدد صحيح 32 بت)
  • تقليم (يزيل الأحرف الفارغة وأحرف التحكم من بداية ونهاية السلسلة النصية)
  • TList.Sort
  • دالة Trunc (تقوم باقتطاع قيمة مفردة أو مزدوجة أو موسعة. وتعيد عددًا صحيحًا من 64 بت)
  • Trunc32 (يقوم باقتطاع قيمة أحادية أو مزدوجة أو موسعة. ويعيد عددًا صحيحًا من 32 بت)
  • UpperCase (يحول سلسلة نصية إلى أحرف كبيرة)
  • فال

المساهمات في لغة ترميز اللغة الحقيقية (RTL) لدلفي

وظائف FastCode المضمنة في لغة وصف الأجهزة (RTL) الخاصة بـ Delphi:

  • دلفي 2005: مقارنة النص، قسمة الأعداد الصحيحة 64 بت، وتعبئة الأحرف.
  • دلفي 2006: [ 4 ] CompareText، Int64Div وFillChar، مدير الذاكرة FastMM4. [ 3 ]
  • دلفي 2007 - دلفي XE: ArcCos، ArcSin، Power، PosEx، Move، Memory Manager، FillChar، Pos، __lldiv، LowerCase، UpperCase، CompareStr، CompareMem، CompareText، StrLen، StrCopy، StrComp. [ 5 ]

يحتوي كتاب " إتقان دلفي" لماركو كانتو على فصل حول FastCode يسرد المساهمات في لغة وصف دلفي. [ 6 ]

مكتبة FastCOD

جميع الفائزين في المسابقة مُدرجون في مكتبة FastCode ( https://fastcode.sourceforge.net/challenge_content/rtl_replcmnt_pkg.html ). هذه المكتبة مفتوحة المصدر ، ومُرخصة بموجب رخصة MPL . يمكن استخدام المكتبة بطريقتين: 1) استدعاء الدوال مباشرةً، و2) استخدام خاصية التعديل.

عند استدعاء الدوال مباشرة، فإن الأمر متروك تمامًا لمطور التطبيق لاستدعاء إصدار الدالة الذي يعتقد أنه الأسرع.

عند استخدام وظيفة التصحيح، تقوم المكتبة تلقائيًا باكتشاف نوع وحدة المعالجة المركزية عند تحميل التطبيق، وتستخدم هذه المعلومات لإعادة توجيه جميع استدعاءات الوظائف إلى وظيفة FastCode الفائزة لتلك الوحدة المعالجة المركزية المحددة.

مدير الذاكرة FastMM4

يُعدّ مدير الذاكرة FastMM، المستخدم في Delphi وC++ Builder منذ عام 2006، الفائز أيضًا في مسابقة FastCode. [ 7 ] وقد حلّ محلّ مدير الذاكرة القياسي في Delphi، وهو ليس فقط أقل عرضةً لتجزئة الذاكرة، بل يوفر أيضًا إمكانيات محسّنة لتصحيح الأخطاء ، مثل القدرة على الإبلاغ عن تسريبات الذاكرة عند إغلاق التطبيق، [ 8 ] واكتشاف استخدام الذاكرة بعد تحريرها أو عمليات التحرير المزدوجة.

يُستخدم FastMM4 أيضًا كمدير للذاكرة للتطبيقات المطورة في Lazarus. [ 9 ]

غالباً ما يتم إدراج FastMM4 كأداة "لا غنى عنها" لمطوري Delphi. [ 10 ]

يأتي Nexus DB مزودًا بتكامل FastMM4 لفحص التسريبات. [ 11 ]

تم توثيق استخدام FastMM في "مدير الذاكرة الجديد في BDS 2006". [ 12 ]

التطبيقات التي تستخدم FastCode

عادةً ما يستخدم التطبيق المُطوَّر باستخدام دلفي أو سي++ بيلدر مدير الذاكرة الافتراضي FastMM4. وقد تم اختيار دوال FastCode في مكتبة RTL لتكون الأكثر استخدامًا، وعادةً ما يستخدم التطبيق بعضًا منها، خاصةً عند معالجة النصوص. لذلك، تستخدم معظم تطبيقات دلفي/سي++ بيلدر شيفرةً برمجيةً طُوِّرت بواسطة مشروع FastCode. ومن الأمثلة على ذلك Skype و FL Studio و RAD Studio من Embarcadero . تشرح مدونة Hallvard استخدام FastMM4 وسبب استخدامه كمدير للذاكرة في تطبيق "The Online Trader" .

مراجع

  1. "كيفية تحسين أداء تطبيق دلفي إلى أقصى حد باستخدام مكتبة FastCode" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  2. "نيك هودجز" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  3. 1 2 "عرافة دلفي" . مؤرشف من الأصل في 12 أغسطس 2015. تم الاطلاع عليه في 3 سبتمبر 2015 .
  4. لونغ، برايان وسوارت، بوب، "مراجعة برنامج Borland Developer Studio 2006"، مجلة دلفي، العدد 124، ديسمبر 2005
  5. "مساهمات المجتمع تُحسّن أداء دلفي 2007 في اتجاه الكتابة من اليمين إلى اليسار" . مؤرشف من الأصل في 6 مارس 2016. تم الاطلاع عليه في 3 سبتمبر 2015 .
  6. "تحديث إتقان دلفي لإصدار دلفي 2006" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  7. غابرييلتشيتش، بريموز، "إدارة الذاكرة"، مجلة دلفي، العدد 126، فبراير 2006
  8. "FastMM4" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  9. "لازاروس فري باسكال" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  10. "أدوات جيدة لمطوري دلفي" . برمجة دلفي . تم الاطلاع عليه في 3 سبتمبر 2015 .
  11. "NexusDB" . تم الاطلاع عليه بتاريخ 3 سبتمبر 2015 .
  12. "مدير الذاكرة الجديد في BDS 2006 - بقلم بيير لو ريش" . تم الاطلاع عليه في 3 سبتمبر 2015 .