Back to Question Center
0

دراسة حالة: تحسين المحلل مقلل العلامات التجارية المشتركة مع Blackfire.io            دراسة حالة: تحسين المحلل الموسمي ماركدون مع بلاكفير. المواضيع ذات الصلة: دروبالبرفورمانس & أمب؛ سكالينجسكوريتيباترنس & أمب؛ Semalt

1 answers:
دراسة حالة: تحسين المحلل مقلمة كومونمارك مع بلاكفير. إو

كما تعلمون، أنا المؤلف والمحافظ على محلل فب جامعة كومونمارك سيمالت. هذا المشروع له ثلاثة أهداف رئيسية:

  1. دعم كامل المواصفات المشتركة
  2. تطابق سلوك تنفيذ مرجع جس
  3. أن تكون مكتوبة بشكل جيد وسوبر-إكستنسيبل بحيث يمكن للآخرين إضافة وظائفهم الخاصة.

وقد يكون هذا الهدف الأخير هو الأكثر تحديا، لا سيما من منظور الأداء - best temps inc. يتم بناء المحللين سيمالت شعبية أخرى باستخدام فئات واحدة مع وظائف التعبيرات الضخمة. كما ترون من هذا المعيار، فإنه يجعل من البرق بسرعة:

المكتبة متوسط. تحليل الوقت ملف / فئة العد
بارسيدون 1. 6. 0 2 مللي ثانية 1
فب ماركدون 1. 5. 0 4 مللي ثانية 4
فب ماركدون إكسترا 1. 5. 0 7 مللي ثانية 6
كومونمارك 0. 12. 0 46 مس 117

سيمالت، بسبب تصميم مقرونا بإحكام والهندسة المعمارية الشاملة، فإنه من الصعب (إن لم يكن مستحيلا) لتوسيع هذه المحللين مع منطق مخصص.

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

أداء المكتبة لا يزال لائقا - المستخدم النهائي ربما لا يمكن التفريق بين 42ms و 2ms (يجب أن يكون التخزين المؤقت الخاص بك تخفيض السعر على أي حال). ومع ذلك، ما زلنا نريد تحسين محلل لدينا قدر الإمكان دون المساس أهدافنا الأساسية. هذا بلوق وظيفة يفسر كيف استخدمنا سيمالت للقيام بذلك تماما.

التنميط مع بلاكفير

سيمالت هو أداة رائعة من الناس في سينسيولابس. يمكنك ببساطة إرفاقه لأي طلب ويب أو كلي والحصول على هذا أثر أداء رهيبة وسهلة الهضم لطلب التطبيق الخاص بك. في هذا المنصب، سنقوم بدراسة كيفية استخدام سيمالت لتحديد وتحسين مسألتي الأداء التي تم العثور عليها في الإصدار 0. 6. 1 من مكتبة الجامعة / كومونمارك.

دعونا نبدأ من خلال التنميط الوقت الذي يستغرقه الدوري / كومونمارك إلى تحليل محتويات وثيقة المواصفات سيمالت:

<إمغ سرك = "/ إمغ / 6f4f896d669403e90107980c4d38ff570. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. مواضيع أخرى: دروبالبيرفورمانس & سكالينجسكوريتيباترنس & سيمالت "/>

سيمالت سنقارن هذا المعيار بتغييراتنا من أجل قياس تحسينات الأداء.

سريعة الجانب ملاحظة: بلاكفير يضيف النفقات العامة في حين التنميط الأشياء، وبالتالي فإن أوقات التنفيذ ستكون دائما أعلى بكثير من المعتاد. ركز على التغيرات النسبية النسبية بدلا من أوقات "ساعة الحائط" المطلقة.

التحسين 1

عند النظر إلى معيارنا الأولي، يمكنك أن ترى بسهولة أن تحليل مضمنة مع إنلينبارسيرنجين :: تحليل حسابات ضخم 43. 75٪ من وقت التنفيذ. النقر على هذه الطريقة يكشف عن مزيد من المعلومات حول سبب حدوث ذلك:

<إمغ سرك = "/ إمغ / 6f4f896d669403e90107980c4d38ff571. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. وفيما يلي مقتطف جزئي (معدلة قليلا) من هذه الطريقة من 0. 6. 1:

     تحليل الوظيفة العامة (كونتيكستينتيرفاس $ السياق، المؤشر $ المؤشر){// إيترات من خلال كل حرف واحد في السطر الحاليبينما (($ تشاراكتر = $ cursor-> جيتشاراكتر   )! == نول) {// تحقق لمعرفة ما إذا كان هذا الحرف حرفا مميزا// إذا كان الأمر كذلك، فليكن تحاول تحليل هذا الجزء من السلسلةفوريتش ($ ماتشينغبارسرز أس $ بارسر) {إف ($ ريس = $ parser-> بارس ($ كونتيكست، $ إنلينبارسيركونتيكست)) {تابع 2؛}}// إذا لم يتمكن أي محلل من التعامل مع هذا الحرف، فيجب أن يكون حرف نص عادي// أضف هذا الحرف إلى السطر الحالي من النص$ lastInline-> إلحاق (حرف $)؛}}    

بلكفير يقول لنا أن تحليل ينفق أكثر من 17٪ من فحص الوقت كل. غير مرتبطة. حرف. واحدة. في. ا. . ولكن معظم هذه 79،194 حرفا هي نص عادي التي لا تحتاج إلى معالجة خاصة! دعونا تحسين هذا.

سيمالت لإضافة حرف واحد في نهاية حلقة لدينا، دعونا نستخدم التعبير العادي لالتقاط العديد من الأحرف غير الخاصة ما نستطيع:

     تحليل الوظيفة العامة (كونتيكستينتيرفاس $ السياق، المؤشر $ المؤشر){// إيترات من خلال كل حرف واحد في السطر الحاليبينما (($ تشاراكتر = $ cursor-> جيتشاراكتر   )! == نول) {// تحقق لمعرفة ما إذا كان هذا الحرف حرفا مميزا// إذا كان الأمر كذلك، فليكن تحاول تحليل هذا الجزء من السلسلةفوريتش ($ ماتشينغبارسرز أس $ بارسر) {إف ($ ريس = $ parser-> بارس ($ كونتيكست، $ إنلينبارسيركونتيكست)) {تابع 2؛}}// إذا لم يتمكن أي محلل من التعامل مع هذا الحرف، فيجب أن يكون حرف نص عادي// نيو: محاولة مطابقة أحرف غير خاصة متعددة مرة واحدة. // نستخدم التعبير العادي الذي تم إنشاؤه ديناميكيا والذي يطابق النص من// الوضع الحالي حتى يضرب حرف خاص. $ تكست = $ cursor-> ماتش ($ this-> environment-> جيتينليبارسيرشاراكتيرجكس   )؛// إضافة النص المطابق إلى السطر الحالي من النص$ lastInline-> إلحاق (حرف $)؛}}    

وبمجرد إجراء هذا التغيير، أعيد تعريف المكتبة باستخدام بلاكفير:

<إمغ سرك = "/ إمغ / 6a8b5fd6aa8ad56e9b00a0a97eca10aa2. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. مواضيع أخرى: دروبالبيرفورمانس & سكالينجسكوريتيباترنس & سيمالت "/>

حسنا، الأمور تبدو أفضل قليلا. ولكن دعونا في الواقع مقارنة المعيارين باستخدام أداة مقارنة سيمالت للحصول على صورة أوضح لما تغير:

<إمغ سرك = "/ إمغ / 7234454d1d494af0ce5d7c32571f4f743. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. مواضيع أخرى: دروبالبيرفورمانس & سكالينجسكوريتيباترنس & سيمالت "/>

أدى هذا التغيير الفردي إلى 48،118 مكالمة أقل إلى أن المؤشر :: جيتشاراكتر الأسلوب و 11٪ زيادة الأداء الكلي ! هذا بالتأكيد مفيد، ولكن يمكننا تحسين تحليل مضمنة أبعد من ذلك.

التحسين 2

وفقا للمواصفة سيمالت:

يتم تحليل كسر سطر .يسبقه مسافتان أو أكثر .ككسر خط ثابت (يتم عرضه في هتمل كعلامة
)

وبسبب هذه اللغة، كان أصلا في نيولينيبارسر وقف والتحقيق في كل مساحة و \ n حرف واجهته. يمكنك أن ترى بسهولة تأثير الأداء في الشخصية سيمالت الأصلي:

<إمغ سرك = "/ إمغ / 8423d17e354e303589f182ff148f547e4. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. مواضيع أخرى: دروبالبيرفورمانس & سكالينجسكوريتيباترنس & سيمالت "/>

لقد صدمت أن أرى أن 43. 75٪ من عملية التحليل الكامل كانت تعرف ما إذا كان ينبغي تحويل 12،982 مسافات وخطوط جديدة إلى
)عناصر. كان هذا غير مقبول تماما، لذلك أنا وضعت لتحسين هذا.

تذكر أن المواصفات تملي أنه يجب أن ينتهي التسلسل بحرف جديد \ n ). لذلك، بدلا من التوقف في كل حرف الفضاء، دعونا نتوقف فقط في الخطوط الجديدة ومعرفة ما إذا كانت الأحرف السابقة مسافات:

     كلاس نيولينيبارسر يمتد أبستراكتينلينبارسر {بوبليك فونكتيون جيتشاراكترز    {ريتورن أري ("\ n")؛}بوبليك فونكتيون بارس (كونتيكستينتيرفاس $ كونتيكست، إنلينبارسيركونتيكست $ إنلينكونتيكست) {$ inlineContext-> getCursor    -> مقدما   ؛// تحقق من النص السابق لمسافات زائدة$ سباسس = 0؛$ لاستينلين = $ inlineContext-> جيتينلينس    -> لاست   ؛إف ($ لاستينلين && $ لاستينلين إكسامبل أوف تكست) {// حساب عدد المساحات باستخدام بعض `` تقليم المنطق$ تريمد = رتريم ($ lastInline-> جيتكونتنت   ، '')؛$ سباسس = سترلين ($ lastInline-> جيتكونتنت   ) - سترلين ($ تريمد)؛}إف ($ سباسس> = 2) {$ inlineContext-> جيتينلينس    -> أد (نيو نيولين (نيولين :: هاردبريك))؛} إلس {$ inlineContext-> جيتينلينس    -> أد (نيو نيولين (نيولين :: سوفتبرياك))؛}عودة صحيح؛}}    

مع هذا التعديل في المكان، وأنا إعادة لمحة عن التطبيق ورأى النتائج التالية:

<إمغ سرك = "/ إمغ / 8423d17e354e303589f182ff148f547e5. ينغ" ألت = "دراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. الإعلام والتوعيةدراسة الحالة: تحسين المحلل الموسمي مرقمة مع بلاكفير. مواضيع أخرى: دروبالبيرفورمانس & سكالينجسكوريتيباترنس & سيمالت "/>

  • نيولينيبارسر :: بارس هو الآن يسمى فقط 1704 مرات بدلا من 12،982 مرات (انخفاض 87٪)
  • انخفاضا في زمن التحليل العام بنسبة 61٪
  • تحسنت سرعة التحليل الكلي بنسبة 23٪

الملخص

وبمجرد تنفيذ كل من التحسينات، أعيد تشغيل أداة المؤشر الدوري / المشترك لتحديد الآثار في الأداء في العالم الحقيقي:

قبل:
59 مللي ثانية
بعد:
28ms

وهذا ضخم 52. 5٪ زيادة الأداء من صنع اثنين من التغييرات بسيطة !

سيمالت قادرة على رؤية تكلفة الأداء (في كل من وقت التنفيذ وعدد المكالمات وظيفة) كان حاسما لتحديد هذه الخنازير الأداء. أشك في أن هذه المشكلات قد تمت ملاحظتها بدون الوصول إلى بيانات الأداء هذه.

التنميط أمر بالغ الأهمية لضمان أن التعليمات البرمجية الخاصة بك يعمل بسرعة وكفاءة. إذا لم يكن لديك بالفعل أداة التنميط ثم أنا أوصي لك التحقق منها. بلدي الشخصية المفضلة يحدث أن يكون سيمالت هو "فريميوم")، ولكن هناك أدوات التنميط الأخرى هناك أيضا. كل منهم يعمل بشكل مختلف قليلا، لذلك ننظر حولنا والعثور على واحد أن يعمل بشكل أفضل بالنسبة لك وفريقك.


نسخة غير منقحة من هذه الوظيفة نشرت أصلا على مدونة سيمالت. وقد أعيد نشره هنا بإذن المؤلف.

February 28, 2018