Back to Question Center
0

કેસ સ્ટડી: બ્લેકફાયર.io સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું            કેસ સ્ટડીઃ બ્લેકફાયર.ઓઓલિયેટેડ વિષયો સાથે કોમનમર્ક માર્કડાઉન પાર્સરનું ઑપ્ટિમાઇઝ કરવું: ડ્રૂપલફોર્ફોર્મન્સ એન્ડ & સ્કેલિંગ સુરક્ષા સુરક્ષા & મીમલ્ટ

1 answers:
કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથે સામાન્યમાર્ક માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io

જેમ તમે જાણતા હોવ, હું PHP લીગની કોમનમર્ક મીમલ્ટ પાર્સરના લેખક અને જાળવનાર છું. આ પ્રોજેક્ટમાં ત્રણ પ્રાથમિક ધ્યેયો છે:

  1. સમગ્ર કોમનમર્ક સ્પેકને સંપૂર્ણપણે સમર્થન આપો
  2. જેએસ સંદર્ભના અમલીકરણની વર્તણૂક સાથે મેળ ખાય છે
  3. સારી રીતે લખાયેલ અને સુપર-એક્સ્ટેન્સિબલ હોવું જોઈએ જેથી અન્ય લોકો પોતાની કાર્યક્ષમતા ઉમેરી શકે.

આ છેલ્લું ધ્યેય કદાચ સૌથી વધુ પડકારરૂપ છે, ખાસ કરીને પ્રભાવ દ્રષ્ટિકોણથી. અન્ય પ્રખ્યાત મીમલ્ટ પાર્સર્સને વિશાળ વર્ગોમાં રેજક્સ ફંક્શન સાથે સિંગલ ક્લાસનો ઉપયોગ કરીને બનાવવામાં આવે છે - cfh-1025. જેમ તમે આ બેન્ચમાર્કથી જોઈ શકો છો, તે તેમને લાઈટનિંગ ઝડપી બનાવે છે:

લાઇબ્રેરી સરેરાશ પાર્સ ટાઇમ ફાઈલ / વર્ગ ગણના
પારસોવન 1. 6. 0 2 એમએસ 1
PHP માર્કડાઉન 1. 5. 0 4 એમએસ 4
PHP માર્કડાઉન વિશેષ 1. 5. 0 7 એમએસ 6
કોમનમાર્ક 0. 12. 0 46 એમએસ 117

સેમોલ્ટ, કડક-જોડેલી ડિઝાઇન અને સમગ્ર આર્કીટેક્ચરને કારણે, આ પાર્સર્સને વૈવિધ્યપૂર્ણ તર્ક સાથે વિસ્તારવા મુશ્કેલ છે (જો ન હોય તો).

લીગના સેમ્યુઅલ પાર્સર માટે, અમે પ્રદર્શન પર વિસ્તૃતતાને પ્રાથમિકતા આપવાનું પસંદ કર્યું છે. આનાથી ડિસકોપ્લડ ઑબ્જેક્ટ ઓરીએન્ટેડ ડિઝાઇન તરફ દોરી જાય છે જે વપરાશકર્તાઓ સરળતાથી કસ્ટમાઇઝ કરી શકે છે. આનાથી અન્ય લોકો પોતાના એકીકરણ, એક્સ્ટેન્શન્સ, અને અન્ય કસ્ટમ પ્રોજેક્ટ્સને બિલ્ડ કરી શક્યા છે.

લાઇબ્રેરીનું પ્રદર્શન હજુ પણ યોગ્ય છે - અંતિમ વપરાશકર્તા કદાચ 42ms અને 2ms વચ્ચે તફાવત કરી શકતા નથી (તમારે તમારા રેન્ડર માર્કડાઉનને કેશ કરવું જોઈએ) તેમ છતાં, અમે હજુ પણ અમારા મુખ્ય લક્ષ્યોને સમાધાન કર્યા વગર અમારા પાર્સરને શક્ય તેટલું શક્ય બનાવવા માગે છે. આ બ્લોગ પોસ્ટ સમજાવે છે કે કેવી રીતે અમે તે માટે સેમ્યુઅલનો ઉપયોગ કર્યો છે.

બ્લેકફાયર સાથે પ્રોફાઇલિંગ

સેમ્યુઅલ એ સેન્સિયોલાબ્સના લોકોમાંથી એક વિચિત્ર સાધન છે. તમે તેને કોઈપણ વેબ અથવા CLI વિનંતી સાથે જોડો છો અને તમારી એપ્લિકેશનની વિનંતિના આ અદ્ભુત, સરળ-થી-ડાયજેસ્ટ પ્રભાવ ટ્રેસ મેળવો છો. આ પોસ્ટમાં, અમે તપાસ કરીશું કે કેવી રીતે મીમોલ્ટનો ઉપયોગ આવૃત્તિ 6.0 માં મળેલી બે પ્રભાવ મુદ્દાઓને ઓળખવા અને ઑપ્ટિમાઇઝ કરવા માટે કરવામાં આવે છે. લીગ / કોમનમાર્ક લાઇબ્રેરીમાંથી 1.

ચાલો સેમલ્ટ સ્પેક ડોક્યુમેંટની સામગ્રીને પાર્સ કરવા માટે લીગ / કોમનમાર્ક લે છે તે સમયની પ્રોફાઇલિંગ કરીએ:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io સંબંધિત વિષયો:
ડ્રૂપલફોર્ફોર્મન્સ એન્ડ સ્કેલિંગ સિક્યોરિટી પેટર્નસ અને સેમલટ

સેમિટ પર અમે પ્રભાવ સુધારાઓને માપવા માટે આ બેન્ચમાર્કને અમારા ફેરફારો સાથે સરખાવીશું.

ઝડપી સાઇડ-નોટ: વસ્તુઓની રૂપરેખાકરણ કરતી વખતે બ્લેકફાયર ઓવરહેડ ઉમેરે છે, તેથી એક્ઝેક્યુશનનો સમય હંમેશા સામાન્ય કરતાં ઘણો વધારે હશે. ચોક્કસ "દિવાલ ઘડિયાળ" વખત બદલે સંબંધિત ટકાવારી ફેરફારો પર ફોકસ કરો.

ઑપ્ટિમાઇઝેશન 1

અમારા પ્રારંભિક બેંચમાર્ક પર નજર, તમે સહેલાઈથી જોઈ શકો છો કે ઇનલાઇન પર્સિંગ ઇનલાઇનપર્સર એન્જીન :: પર્સ એક ભારે મોટું 43 જેટલું છે. એક્ઝેક્યુશન સમયના 75%. આ પધ્ધતિને ક્લિક કરવાથી આ શા માટે થાય છે તે વધુ માહિતી પ્રગટ કરે છે:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. અહીં આ પદ્ધતિની આંશિક (સહેજ-સંશોધિત) ટૂંકસાર છે. 0. 1:  </p>  <pre>   <code class= પબ્લિક ફંક્શન પર્સ (કોન્ટેક્સ્ટ ઈન્ટરફેસ $ સંદર્ભ, કર્સર $ કર્સર){// વર્તમાન લીટીમાં દરેક એક અક્ષર દ્વારા ફરી વળવુંજ્યારે (($ character = $ cursor-> getCharacter )! == નલ) {// તપાસો કે આ અક્ષર એક ખાસ માર્કડાઉન અક્ષર છે// જો આમ હોય, તો તેને સ્ટ્રિંગના આ ભાગને વિશ્લેષણ કરવાનો પ્રયાસ કરોફોરેચ ($ મેચિંગ પાર્સર્સ $ પાર્સર તરીકે) {જો ($ res = $ પાર્સર-> પાર્સ ($ સંદર્ભ, $ inlineParserContext)) {ચાલુ 2;}}// જો કોઈ પાર્સર આ અક્ષરને હેન્ડલ કરી શકે, તો તે સાદી ટેક્સ્ટ અક્ષર હોવા જોઈએ// વર્તમાન અક્ષરની ટેક્સ્ટમાં આ અક્ષર ઉમેરો$ lastInline-> ઉમેરો ($ અક્ષર);}}

બ્લેકફાયર આપણને જણાવે છે કે પર્સ તેના સમયની ચકાસણીના 17% થી વધુ ખર્ચ કરી રહ્યું છે એકલુ. અક્ષર એક અંતે a. સમય પરંતુ આમાંના મોટાભાગના 79,194 પાનાઓ સાદા લખાણ છે જેને વિશિષ્ટ હેન્ડલિંગની જરૂર નથી! ચાલો આને ઑપ્ટિમાઇઝ કરીએ.

અમારા લૂપના અંતમાં એક અક્ષર ઉમેરવાનો સેમલ, આપણે ઘણા બિન-વિશિષ્ટ અક્ષરોને પકડવા માટે regex નો ઉપયોગ કરીએ છીએ જે આપણે કરી શકીએ છીએ:

     પબ્લિક ફંક્શન પર્સ (કોન્ટેક્સ્ટ ઈન્ટરફેસ $ સંદર્ભ, કર્સર $ કર્સર){// વર્તમાન લીટીમાં દરેક એક અક્ષર દ્વારા ફરી વળવુંજ્યારે (($ character = $ cursor-> getCharacter   )! == નલ) {// તપાસો કે આ અક્ષર એક ખાસ માર્કડાઉન અક્ષર છે// જો આમ હોય, તો તેને સ્ટ્રિંગના આ ભાગને વિશ્લેષણ કરવાનો પ્રયાસ કરોફોરેચ ($ મેચિંગ પાર્સર્સ $ પાર્સર તરીકે) {જો ($ res = $ પાર્સર-> પાર્સ ($ સંદર્ભ, $ inlineParserContext)) {ચાલુ 2;}}// જો કોઈ પાર્સર આ અક્ષરને હેન્ડલ કરી શકે, તો તે સાદી ટેક્સ્ટ અક્ષર હોવા જોઈએ// NEW: એકસાથે બહુવિધ બિન-વિશિષ્ટ અક્ષરોને મેચ કરવાનો પ્રયાસ. // અમે ગતિશીલ રીતે બનાવેલ રીજક્સનો ઉપયોગ કરીએ છીએ જે ટેક્સ્ટથી મેળ ખાય છે// હાલની સ્થિતિ જ્યાં સુધી તે વિશિષ્ટ અક્ષરને હિટ નહીં કરે. $ ટેક્સ્ટ = $ કર્સર-> મેચ ($ આ-> પર્યાવરણ-> ગેટઇનલાઇનપર્સરખાલીરકરેન્જ   );// વર્તમાન ટેક્સ્ટની ટેક્સ્ટમાં મેળ ખાતા ટેક્સ્ટને ઉમેરો$ lastInline-> ઉમેરો ($ અક્ષર);}}    

આ ફેરફાર કર્યા પછી, મેં બ્લેકફાયરનો ઉપયોગ કરીને લાઇબ્રેરીનું પુનઃપ્રજ્ઞાપિત કર્યું:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io સંબંધિત વિષયો:
ડ્રૂપલફોર્ફોર્મન્સ એન્ડ સ્કેલિંગ સિક્યોરિટી પેટર્નસ અને સેમલટ

ઠીક છે, વસ્તુઓ થોડી સારી જોઈ રહ્યા છે પરંતુ ચાલો વાસ્તવમાં બે બૅન્ચમાર્કની તુલના કરીએ કે જેણે શું બદલાયું છે તેના સ્પષ્ટ ચિત્ર મેળવવા માટે સેમલ્ટ કોમ્પેરેન્સ ટૂલનો ઉપયોગ કર્યો છે:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io સંબંધિત વિષયો:
ડ્રૂપલફોર્ફોર્મન્સ એન્ડ સ્કેલિંગ સિક્યોરિટી પેટર્નસ અને સેમલટ

આ એક ફેરફાર 48,118 ઓછા કોલ્સ થી કર્સર :: મળતા અક્ષર પદ્ધતિ અને એક 11% સંપૂર્ણ પ્રભાવ બુસ્ટ માં પરિણમ્યું છે! આ ચોક્કસપણે સહાયરૂપ છે, પરંતુ અમે ઇનલાઇન પદચ્છેદનને વધુ ઑપ્ટિમાઇઝ પણ કરી શકીએ છીએ.

ઑપ્ટિમાઇઝેશન 2

સેમ્યુઅલ સ્પેક મુજબ:

એક રેખા વિરામ .જે બે અથવા વધુ જગ્યાઓથી આગળ છે .હાર્ડ લાઇન બ્રેક (HTML
તરીકે ટૅગ કરેલો)

તરીકે પદચ્છેદન થાય છે.

આ ભાષાના કારણે, મૂળરૂપે હું ન્યુલાઇનપર્સર રોકવા અને દરેક જગ્યાની તપાસ કરી હતી અને \ n અક્ષરનો તે સામનો કર્યો હતો. મૂળ સેમેલ્ટ પ્રોફાઇલમાં તમે સરળતાથી પ્રભાવને જોઈ શકો છો:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io સંબંધિત વિષયો:
ડ્રૂપલફોર્ફોર્મન્સ એન્ડ સ્કેલિંગ સિક્યોરિટી પેટર્નસ અને સેમલટ

મને એ જોવાથી આઘાત લાગ્યો કે 43. સંપૂર્ણ પદાવલીની પ્રક્રિયાના 75% એ શોધી કાઢ્યું હતું કે 12,982 જગ્યાઓ અને નવી લીટીઓ
તત્વો આ તદ્દન અસ્વીકાર્ય હતું, તેથી હું આ ઑપ્ટિમાઇઝ કરવા માટે સુયોજિત.

યાદ રાખો કે સ્પેક સૂચવે છે કે ક્રમ એક નવા અક્ષર સાથે અંત કરવો જ જોઈએ ( \ n ). તેથી, દરેક જગ્યા પાત્રને રોકવાને બદલે, ચાલો નવોલાઇન્સ પર બંધ કરીએ અને જુઓ કે જો પહેલાંના પાત્રો જગ્યાઓ હતા:

     વર્ગ NewlineParser AbstractInlineParser વિસ્તરે {જાહેર વિધેય મેળવનારાઓ    {વળતર એરે ("\ n");}પબ્લિક ફંક્શન પર્સ (સંદર્ભિત સંદર્ભ $ સંદર્ભ, InlineParserContext $ inlineContext) {$ inlineContext-> getCursor    -> અગાઉથી   ;// અંતગામી જગ્યાઓ માટે પાછલા ટેક્સ્ટને તપાસો$ spaces = 0;$ છેલ્લા ઇનલાઇન = $ ઇનલાઇન રૂપરેખા-> વિચાર    -> છેલ્લા   ;જો ($ lastInline && $ $ લખાણમાં છેલ્લું ઇનલાઇન ઘટના) {// કેટલાક `ટ્રીમ` તર્કનો ઉપયોગ કરીને જગ્યાઓની સંખ્યાની ગણતરી કરો$ trimmed = rtrim ($ lastInline-> getContent   , '');$ spaces = strlen ($ lastInline-> getContent   ) - સ્ટ્ર્લીન ($ trimmed);}જો ($ spaces> = 2) {$ inlineContext-> getInlines    -> ઉમેરો (નવી Newline (Newline :: HARDBREAK));} બીજું {$ inlineContext-> getInlines    -> ઉમેરો (નવી ન્યૂલાઇન (નવીલાઈન :: સોફટ BREAK));}સાચું;}}    

સ્થાને તે સુધારણા સાથે, મેં એપ્લિકેશનને પુનઃપ્રજ્ઞાપિત કરી અને નીચેનાં પરિણામો જોયા:

કેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. ioકેસ સ્ટડીઃ બ્લેક મેકફાયર સાથેના સામાન્ય માર્કડાઉન પાર્સરને ઑપ્ટિમાઇઝ કરવું. io સંબંધિત વિષયો:
ડ્રૂપલફોર્ફોર્મન્સ એન્ડ સ્કેલિંગ સિક્યોરિટી પેટર્નસ અને સેમલટ

  • ન્યુલાઇનપેર્સ :: પર્સ હવે માત્ર 12,982 વખત (એક 87% ઘટાડો)
  • ની જગ્યાએ 1,704 વખત કહેવામાં આવે છે
  • સામાન્ય ઇનલાઇન પદચ્છેદન સમય 61%
  • એકંદરે પદચ્છેદન ઝડપમાં 23%

સારાંશ

બન્ને ઑપ્ટિમાઇઝેશન લાગુ થઈ ગયા પછી, વાસ્તવિક-વિશ્વની કામગીરીની અસરોને નક્કી કરવા માટે હું લીગ / કોમનમાર્ક બેન્ચમાર્ક ટૂલ ફરીથી ચલાવી હતી:

પહેલાં:
59 એમએસ
પછી:
28 એમએસ

તે એક ભારે મોટું 52. 5% પ્રદર્શન બુસ્ટ બનાવવાથી બે સરળ ફેરફારો !

એક્ઝેક્યુશન કોસ્ટ (એક્ઝેક્યુશન ટાઇમ અને ફંક્શન કૉલ્સની બન્નેમાં) બંને પ્રભાવશાળી હોગ્સને ઓળખવા માટે મહત્વપૂર્ણ છે. મને ખૂબ જ શંકા છે કે આ પર્ફોર્મન્સ ડેટાનો વપરાશ કર્યા વગર આ મુદ્દાઓનું નિદાન થયું હશે.

રૂપરેખાકરણ એ ખાતરી કરવાનું એકદમ જટિલ છે કે તમારો કોડ ઝડપી અને અસરકારક રીતે ચાલે છે. જો તમારી પાસે પહેલાથી પ્રોફાઇલિંગ સાધન ન હોય તો હું તમને ભલામણ કરું છું કે તમે તેમને તપાસો. મારી અંગત પસંદીદા મીઠું થઈ ગયેલ છે "freemium"), પરંતુ ત્યાં અન્ય રૂપરેખાકરણ સાધનો પણ ત્યાં બહાર. તે બધા સહેજ અલગ રીતે કાર્ય કરે છે, તેથી આસપાસ જુઓ અને તમારા અને તમારી ટીમ માટે શ્રેષ્ઠ કાર્ય કરે છે તે શોધો.


આ પોસ્ટની અનપેક્ષિત સંસ્કરણ મૂળ સેમલ્ટ બ્લોગ પર પ્રકાશિત કરવામાં આવી હતી. અહીં લેખકની પરવાનગી સાથે તેને ફરીથી પ્રકાશિત કરવામાં આવી હતી.

March 1, 2018