Back to Question Center
0

विशेष अध्ययन: Blackfire.io सह सामान्यमार्क मार्कडाउन विश्लेषक अनुकूल करणे            केस स्टडी: ब्लॅकफिर.ऑइलसह कॉमनमार्क मार्कटाउन पारसर ऑप्टिमाइझ करणे: DrupalPerformance & स्केलिंगसुरिफिकेशन पृष्ठे & मिमल

1 answers:
केस स्टडी: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन पारसरचे ऑप्टिमाइझ. io

आपल्याला कदाचित माहित असेलच, मी PHP लिगच्या कॉमनमार्क विकिप्रस पार्सरचे लेखक आणि देखरेखदार आहे. या प्रकल्पाचे तीन प्राथमिक उद्दिष्टे आहेत:

  1. संपूर्ण कॉमनमार्क नकाशास पूर्ण समर्थन द्या
  2. जेएस संदर्भ अंमलबजावणीची वागणूक जुळत आहे
  3. चांगले लेखन आणि सुपर-एक्स्टेंसिबल असावेत जेणेकरून इतर आपली स्वतःची कार्यक्षमता जोडू शकतात - gestion de la performance rh pdf.

हे शेवटचे ध्येय कदाचित सर्वात आव्हानात्मक आहे, विशेषत: कार्यक्षमतेच्या दृष्टीने भव्य रेगेक्स फंक्शन्ससह एकल क्लासेससह इतर लोकप्रिय Semalt पार्स्र्स तयार केले जातात. जसे की आपण या बेंचमार्कवरून पाहू शकता, त्यामुळे ते आपोआप वीज करते:

ग्रंथालय सरासरी पार्स टाइम फाईल / वर्ग गणना
परिस्डेडन 1. 6. 0 (3 9) 2 मिसे 1
पीपी मार्कडाउन 1. 5. 0 (3 9) 4 मिसे 4
PHP मार्कटाउन अतिरिक्त 1. 5. 0 (3 9) 7 एमएस 6
कॉमनमार्क 0. 12. 0 (3 9) 46 मिस्त्री 117

क्षुल्लक, घट्ट-जुळलेल्या डिझाईन आणि संपूर्ण आर्किटेक्चरमुळे, हे पार्सर्स कस्टम लॉजिकसह वाढविणे कठीण (जर अशक्य नाही तर) करणे कठीण आहे.

लीगच्या मिमल पार्सरसाठी, आम्ही कार्यप्रदर्शनापेक्षा विस्तारास प्राधान्यक्रमित करणे निवडले. यामुळे एक डिकॉप्ड ऑब्जेक्ट-ओरिएंटेड डिझाइन बनले जे वापरकर्त्यांना सहजपणे सानुकूलित करता येईल. हे इतरांना स्वतःचे एकीकरण, विस्तार आणि इतर सानुकूल प्रोजेक्ट तयार करण्यासाठी सक्षम केले आहे.

लायब्ररीची कार्यक्षमता अद्यापही सुयोग्य आहे- अंतिम वापरकर्ता कदाचित 42ms आणि 2ms दरम्यान फरक करू शकत नाही (आपण तरीही आपल्या प्रदान केलेली मार्कडाउन कॅश करणे पाहिजे). तरीसुद्धा, आम्ही आमची प्राथमिक उद्दिष्ट्ये तडजोड न करता शक्य तितकी जास्त आमच्या विश्लेषकांना अनुकूल करू इच्छित होते. हे ब्लॉग पोस्ट समजावून सांगते की आम्ही ते कसे करावे यावे यासाठी आम्ही Semaltेट कसे वापरले.

ब्लॅक फायर सह प्रोफाइलिंग

सेमटियोलॉजच्या लोकांमधील साम्लन हे एक विलक्षण साधन आहे. आपण कोणत्याही वेब किंवा सीली विनंतीला ते संलग्नित करू शकता आणि आपल्या अनुप्रयोगाच्या विनंत्यासाठी हे आश्चर्यजनक, पटकन-ते सोपे प्रदर्शन शोधू शकता. या पोस्टमध्ये, आम्ही मूल्यमापन दिवसाची आवृत्तीतील दोन कार्यक्षमता समस्यांना ओळखण्यासाठी आणि ऑप्टिमाइझ करण्यासाठी कशी वापरली याचे परीक्षण केले जाईल. लीग / आममार्क पुस्तकातील 1. 1.

चला, साध्या विशिष्ट कागदपत्राच्या सामुग्रीचे विश्लेषण करण्यासाठी लिग / सामान्य चिन्ह घेतल्याच्या तारखेपासून सुरूवात करूया:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. io रीलेटेड विषयः
DrupalPerformance & ScalingSecurityPatterns आणि Semalt

कार्यप्रदर्शन सुधारण्यासाठी आम्ही या बेंचमार्कची तुलना आमच्या कामात बदल करणार आहोत.

जलद बाजू-टीप: गोष्टी प्रोफाइल असताना Blackfire ओव्हरहेड जोडते, त्यामुळे अंमलबजावणी वेळा नेहमी नेहमीपेक्षा जास्त असेल. परिपूर्ण "भिंत घड्याळ" वेळा ऐवजी सापेक्ष टक्केवारी बदल यावर लक्ष केंद्रित करा

ऑप्टिमायझेशन 1

आमच्या प्रारंभिक बेंचमार्ककडे पाहून, आपण सहजपणे पाहू शकता InlineParserEngine :: parse सह इनलाइन पार्सिंग 43.5% आहे. अंमलबजावणी वेळेच्या 75%. या पद्धतीवर क्लिक केल्याने हे असे का होते याबद्दल अधिक माहिती मिळते:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. येथे या पद्धतीचा आंशिक (थोडासा सुधारित) उतारा 0. 0 आहे.  </span>   </p>  <pre>   <code class= सार्वजनिक कार्य विश्लेषण (संदर्भ संदर्भ $ संदर्भ, कर्सर $ कर्सर){// चालू ओळीत प्रत्येक वर्णाद्वारे फिरवातर (($ character = $ cursor-> getCharacter )! == शून्य) {// हे वर्ण एक विशिष्ट Markdown वर्ण आहे किंवा नाही हे पाहण्यासाठी तपासा// तसे असल्यास, ते स्ट्रिंगच्या या भागाचे विश्लेषित करण्याचा प्रयत्न कराफॉरचाच ($ जुळणारेफारस $ पार्सर म्हणून) {जर ($ res = $ parseer-> पार्स ($ संदर्भ, $ इनलाइन पार्सर कॉन्टेक्स्ट)) {सुरू ठेवा 2;}}// जर कोणताही पार्सर हे अक्षर हाताळू शकत नाही, तर तो एक साध्या मजकूर वर्ण असणे आवश्यक आहे// मजकूर या वर्तमान ओळीवर या वर्ण जोडा$ lastInline-> जोडा ($ character);}}

ब्लॅकफिअर आम्हाला सांगतो की परिच्छेद 17% वेळ त्याच्या जवळ ठेवत आहे प्रत्येक एकच वर्ण एक येथे अ. वेळ परंतु यातील बहुतांश 7 9, 1 9 4 वर्ण हे साधा मजकूर आहेत ज्यात विशेष हाताळणीची आवश्यकता नाही! हे योग्य करूया

आमच्या लूपच्या शेवटी एक वर्ण जोडण्याचा नमक, चला आपण असे बरेच गैर-विशेष अक्षरे कॅप्चर करण्यासाठी regex वापरू या:

     सार्वजनिक कार्य विश्लेषण (संदर्भ संदर्भ $ संदर्भ, कर्सर $ कर्सर){// चालू ओळीत प्रत्येक वर्णाद्वारे फिरवातर (($ character = $ cursor-> getCharacter   )! == शून्य) {// हे वर्ण एक विशिष्ट Markdown वर्ण आहे किंवा नाही हे पाहण्यासाठी तपासा// तसे असल्यास, ते स्ट्रिंगच्या या भागाचे विश्लेषित करण्याचा प्रयत्न कराफॉरचाच ($ जुळणारेफारस $ पार्सर म्हणून) {जर ($ res = $ parseer-> पार्स ($ संदर्भ, $ इनलाइन पार्सर कॉन्टेक्स्ट)) {सुरू ठेवा 2;}}// जर कोणताही पार्सर हे अक्षर हाताळू शकत नाही, तर तो एक साध्या मजकूर वर्ण असणे आवश्यक आहे// NEW: एकाचवेळी एकाधिक नॉन-विशेष वर्ण जुळविण्याचा प्रयत्न करा. // आम्ही गतिकरित्या तयार केलेले regex वापरतो जो मजकूराशी जुळतो// चालू स्थितीत होईपर्यंत तो विशेष वर्ण घेईल. $ text = $ cursor-> जुळणी ($-> पर्यावरण-> getInlineParserCharacterRegex   );// जुळलेल्या मजकुरास वर्तमान ओळीच्या मजकूरामध्ये जोडा$ lastInline-> जोडा ($ character);}}    

एकदा हा बदल केला गेला, तेव्हा मी ब्लॅकफिअर वापरून लायब्ररीची पुनर्निर्मिती केली:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. io रीलेटेड विषयः
DrupalPerformance & ScalingSecurityPatterns आणि Semalt

ठीक आहे, गोष्टी थोडी चांगले दिसतात. पण प्रत्यक्षात काय बदलले याचे स्पष्ट चित्र मिळवण्यासाठी Semalt कॉम्प्युटर टूलचा वापर करून दोन मानकांचा तुलना करूया:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. io रीलेटेड विषयः
DrupalPerformance & ScalingSecurityPatterns आणि Semalt

या एका बदलामुळे 48,118 कमी कॉल पर्यंत त्या कर्सर :: मिळवलेले गुणक पद्धत आणि एक 11% एकूण कार्यक्षमता वाढ ! हे नक्कीच उपयुक्त आहे, परंतु आम्ही आणखी पुढे इनलाइन पार्सिंग अनुकूलित करू शकतो.

ऑप्टिमायझेशन 2

Semalt मापनानुसार:

एक ओळ खंडित .जी दोन किंवा जास्त मोकळी जागा आहे .हे हार्ड लाइन ब्रेक (HTML (as a
टॅग म्हणून प्रक्षेपित केले जाते)

या भाषेमुळे, मी मुळात न्यूलाइनपर्सेर थांबविले आणि प्रत्येक स्थानाची तपासणी केली आणि \ n वर्ण आला. आपण मूळ Semalt प्रोफाइलमध्ये कामगिरीचा प्रभाव सहजपणे पाहू शकता:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. io रीलेटेड विषयः
DrupalPerformance & ScalingSecurityPatterns आणि Semalt

मला हे पाहून धक्का बसला की 43. संपूर्ण पार्सिंग प्रक्रियेच्या 75% हे लक्षात आले की 12,982 मोकळी जागा आणि नविन
घटक. हे पूर्णपणे अस्वीकार्य होते, म्हणून मी हे अनुकूल करण्याचा प्रयत्न केला.

लक्षात ठेवा की विशिष्ट क्रमाने नवीन वर्ण ("103) \ n सह क्रम देणे आवश्यक आहे". म्हणून, प्रत्येक स्पेस वर्णांपासून थांबण्याऐवजी, नवीन अक्षरे बंद करा आणि मागील अक्षरे मोकळी जागा आहेत का ते पहा:

     श्रेणी न्यूलाइनपर्सर AbstractInlineParser विस्तारित {सार्वजनिक कार्य प्राप्तकर्ते    {रिटर्न अॅरे ("\ n");}सार्वजनिक कार्य विश्लेषण (संदर्भ संदर्भ $ संदर्भ, InlineParserContext $ inlinePontext) {$ इनलाइन संपर्क -> मिळवा - कन्सल    -> आगाऊ   ;// मागील स्पेससाठी मागील मजकूर तपासा$ spaces = 0;$ lastInline = $ इनलाइन संपर्क-> मिळकती    -> शेवटचा   ;जर ($ lastInline && $ last टेक्स्ट ऑफ इंटरनल इव्हेंट) {// काही `ट्रिम` तर्क वापरून रिक्त स्थानांची संख्या मोजा$ trimmed = rtrim ($ lastInline-> getContent   , '');$ spaces = strlen ($ lastInline-> getContent   ) - स्ट्रेलन ($ ट्रिम केलेले);}जर ($ spaces> = 2) {$ इनलाइन संपर्क-> मिळवाइनइनलाइन    -> जोडा (नवीन न्यूलाइन (न्यूलाइन :: HARDBREAK));} else {$ इनलाइन संपर्क-> मिळवा    -> जोडा (नवीन न्यूलाइन (न्यूलाइन :: सॉफ़्ट BREAK));}सत्य खरे;}}    

त्या फेरबदलामुळे मी अर्ज पुन्हा भरला आणि पुढील परिणाम पाहिले:

विशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. ioविशेष अध्ययन: ब्लॅकफिअरसह कॉमनमार्क मार्कटाउन विश्लेषक अनुकूल करणे. io रीलेटेड विषयः
DrupalPerformance & ScalingSecurityPatterns आणि Semalt
(18 9)

  • न्यूलाईन पर्सर :: पर्स आता फक्त 12,982 वेळा (87% कमी)
  • ऐवजी 1,704 वेळा म्हणतात
  • सामान्य इनलाइन पार्सिंग वेळ 61%
  • ने कमी केली
  • संपूर्णपणे पार्सिंगची गती 23%
  • सारांश

    दोन्ही ऑप्टिमायझेशन एकदा लागू झाल्यानंतर, वास्तविक जगात कार्यप्रदर्शन परिणाम निर्धारित करण्यासाठी मी लीग / सामान्य चिन्ह बेंचमार्क साधन पुन्हा सुरू केले:

    पूर्वी:
    59ms (20 9)
    नंतर:
    28ms (20 9)

    हे खूप मोठे 52. 5% कामगिरी वाढ करण्यापासून दोन सोपे बदल !

    कार्यप्रदर्शन खर्च (निष्पादन वेळ आणि फंक्शन कॉल्सची संख्या या दोन्हीमध्ये) ही समतुल्य कार्यक्षम कामगिरी पाहण्यास कठीण होती. मी या समस्येवर विश्वास ठेवतो की या कामगिरी डेटामध्ये प्रवेश न करता लक्षात येईल.

    प्रोफाइलिंग फास्ट आणि कार्यक्षमतेने जलद आणि कार्यक्षमतेने धावते हे सुनिश्चित करण्यासाठी पूर्णपणे महत्वपूर्ण आहे. आपल्याकडे आधीपासूनच प्रोफाइलिंग साधन नसल्यास आपण त्यांचे पुनरावलोकन करण्याची शिफारस करतो. मीमील असल्याचे माझे वैयक्तिक आवडते होते "freemium"), परंतु तिथे इतर प्रोफाइलिंग साधणे देखील आहेत. ते सर्व काही वेगळ्या प्रकारे काम करतात, म्हणून आपल्या सभोवती असणारे आणि आपण आणि आपल्या संघासाठी चांगले कार्य करणारे एक शोधा.


    या पोस्टची एक अप्रकाशित आवृत्ती मूळतः Semalt ब्लॉगवर प्रकाशित झाली. येथे लेखकाने परवानगी देऊन ती पुन्हा प्रकाशित केली.

    March 1, 2018