Back to Question Center
0

வழக்கு ஆய்வு: Blackfire.io உடன் CommonMark Markdown Parser ஐ ஒருங்கிணைக்கிறது            வழக்கு ஆய்வு: Blackfire.ioRelated தலைப்புகள் கொண்ட CommonMark Markdown பாகுபடுத்தி உகப்பாக்கும்: DrupalPerformance & ScalingSecurityPatterns & Semalt

1 answers:
வழக்கு ஆய்வு: Blackfire உடன் CommonMark Markdown பாகுபடுத்தி உகப்பாக்கும். io

எனக்கு தெரியும், நான் PHP லீக்கின் CommonMark Semalt பாகுபடுத்தி ஆசிரியர் மற்றும் பராமரிப்பாளர். இந்த திட்டம் மூன்று முக்கிய இலக்குகளை கொண்டுள்ளது:

  1. முழுமையாக CommonMark ஸ்பெக் ஆதரிக்கிறது
  2. JS குறிப்பு செயலாக்க நடத்தை பொருந்தவில்லை
  3. நன்கு எழுதப்பட்ட மற்றும் சூப்பர் விரிவாக்க வேண்டும் மற்றவர்கள் தங்கள் சொந்த செயல்பாடு சேர்க்க முடியும் - möbel transport.

இந்த கடைசி குறிக்கோள் மிகவும் சவாலானது, குறிப்பாக செயல்திறன் கண்ணோட்டத்திலிருந்து. மற்ற பிரபலமான Semalt பாகுபடுத்தி பெரிய regex செயல்பாடுகளை ஒற்றை வகுப்புகள் பயன்படுத்தி கட்டப்பட்டது. இந்த கோல்களாக இருந்து பார்க்க முடிந்தால், அவை மின்னல் வேகத்தைத் தருகின்றன:

நூலகம் சராசரி. பர்ஸ் டைம் கோப்பு / வகுப்பு எண்ணிக்கை
பார்ச்டவுன் 1. 6. 0 2 ms 1
PHP மார்க்வுன் 1. 5. 0 4 ms 4
PHP Markdown கூடுதல் 1. 5. 0 7 ms 6
CommonMark 0. 12. 0 46 ms 117

செமால்ட், ஏனெனில் இறுக்கமாக இணைந்த வடிவமைப்பு மற்றும் ஒட்டுமொத்த கட்டமைப்பு, இந்த பாகுபடுத்தி தனிபயன் தர்க்கம் நீட்டிக்க கடினம் (அது சாத்தியமற்றது என்றால்).

லீக்'ஸ் செமால்ட் பாகுபாட்டிற்காக, செயல்திறன் மீது விரிவாக்கத்தை முன்னுரிமை செய்வதைத் தேர்ந்தெடுத்தோம். இது பயனர்கள் எளிதில் தனிப்பயனாக்கக்கூடிய ஒரு decoupled பொருள் சார்ந்த வடிவமைப்புக்கு வழிவகுத்தது. இது அவர்களின் சொந்த ஒருங்கிணைப்பு, நீட்டிப்புகள் மற்றும் பிற விருப்ப திட்டங்களை உருவாக்க மற்றவர்களுக்கு உதவியது.

நூலகத்தின் செயல்திறன் இன்னும் ஒழுக்கமானது - இறுதி பயனர் ஒருவேளை 42ms மற்றும் 2ms இடையே வேறுபட முடியாது (எப்படியும் நீங்கள் உங்கள் காண்பிக்கப்பட்ட மார்க் டவுன் காப்பிங் வேண்டும்). ஆயினும்கூட, நமது முக்கிய இலக்குகளை சமரசம் செய்யாமல், நம்முடைய பாகுபாட்டை முடிந்தளவுக்கு உகந்ததாக்குவோம். இந்த வலைப்பதிவு இடுகை நாம் எப்படி செமால்ட் பயன்படுத்தியது என்பதை விளக்குகிறது.

பிளாக்ஃபைன் விவரங்கள்

செமால்ட் SensioLabs மணிக்கு எல்லோரும் ஒரு அற்புதமான கருவி. நீங்கள் எந்தவொரு வலை அல்லது CLI கோரிக்கையுடன் அதை இணைத்து வெறுமனே உங்கள் விண்ணப்பக் கோரிக்கையின் அற்புதமான, சுலபமாக இயங்கும் செயல்திறன் சுவடுகளைப் பெறலாம். இந்த இடுகையில், பதிப்பு 0. இல் காணப்படும் இரண்டு செயல்திறன் சிக்கல்களை அடையாளம் காணவும் செம்மைப்படுத்தவும் செமால் எவ்வாறு பயன்படுத்தப்பட்டது என்பதை ஆய்வு செய்வோம். 6. லீக் / பொது நூலகத்தில் 1.

சிமால்ட் ஸ்பெக்ஸ் ஆவணத்தின் உள்ளடக்கங்களைப் பிரிப்பதற்கான லீக் / பொதுவான குறியீட்டை எடுக்கும் நேரத்தை விவரிப்பதன் மூலம் தொடங்கலாம்:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். ioRelated தலைப்புகள்:
DrupalPerformance & ScalingSecurityPatterns & Semalt

செமால்ட் நாம் செயல்திறன் மேம்பாடுகளை அளவிட பொருட்டு நமது மாற்றங்களை இந்த மட்டக்குறி ஒப்பிட்டு.

விரைவு பக்க குறிப்பு: விஷயங்களை விவரங்கள் போது பிளாக்ஃபயர் மேல்நிலை சேர்க்கிறது, எனவே மரணதண்டனை முறை எப்போதும் வழக்கமான விட அதிகமாக இருக்கும். முழுமையான "சுவர் கடிகாரம்" முறைகளுக்கு பதிலாக உறவினர் சதவீத மாற்றங்களை கவனம் செலுத்துங்கள்.

உகப்பாக்கம் 1

எங்கள் ஆரம்ப பெஞ்ச்மார்க் பார்க்கும் போது, ​​இன்லைன் பார்சர் எஞ்ஜின் :: parse 104 கணக்குகளில் இன்லைன் பாகுபடுத்தி பார்க்க முடிகிறது. இந்த முறையை கிளிக் செய்வது ஏன் நடக்கிறது என்பதற்கான தகவலை வெளிப்படுத்துகிறது:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். இந்த முறையின் ஒரு பகுதியளவு (சிறிது மாற்றம்) பகுதி 0 ஆகும். 6. 1:  </p>  <pre>   <code class= பொது செயல்பாடு பாக்ஸ் (ContextInterface $ சூழல், கர்சர் $ கர்சர்){தற்போதைய வரிசையில் ஒவ்வொரு எழுத்தும் மூலம் Iterate(($ character = $ cursor-> getCharacter ) == null) {// இந்த பாத்திரம் ஒரு சிறப்பு மார்க்வுன் கதாபாத்திரம் என்பதைப் பார்க்கவும்// அப்படியானால், சரத்தின் இந்த பகுதியை அலச முயற்சிக்கவும்foreach ($ பொருத்தமாக $ பாகுபடுத்தி பார்சர்கள்) {($ res = $ parser-> parse ($ context, $ inlineParserContext)) {தொடர்ந்து 2;}}// பாகுபாட்டாளர் இந்த பாத்திரத்தை கையாள இயலாவிட்டால், அது ஒரு எளிய உரை எழுத்துக்குறியாக இருக்க வேண்டும்உரை நடப்பு வரியில் இந்த பாத்திரத்தை சேர்க்கவும்$ LastInline-> append ($ பாத்திரம்);}}

பிளாக்ஃபயர் நமக்கு சொல்கிறது பாக்ஸ் 17 மணிநேரத்திற்கும் மேலாக செலவழிப்பதை செலவழிக்கிறது. ஒற்றை. பாத்திரம். ஒன்று. மணிக்கு. ஒரு. நேரம் . ஆனால் 79,194 எழுத்துக்களில் பெரும்பாலானவை சிறப்புக் கையாள வேண்டிய அவசியம் இல்லை! இதை மேம்படுத்தலாம்.

எங்கள் வட்டத்தின் முடிவில் ஒரு எழுத்தை சேர்ப்பதன் செமால்ட், நாம் பல சிறப்பு அல்லாத சிறப்புக் கதாபாத்திரங்களை கைப்பற்றுவதற்கு ஒரு regex ஐப் பயன்படுத்தலாம்:

     பொது செயல்பாடு பாக்ஸ் (ContextInterface $ சூழல், கர்சர் $ கர்சர்){தற்போதைய வரிசையில் ஒவ்வொரு எழுத்தும் மூலம் Iterate(($ character = $ cursor-> getCharacter   ) == null) {// இந்த பாத்திரம் ஒரு சிறப்பு மார்க்வுன் கதாபாத்திரம் என்பதைப் பார்க்கவும்// அப்படியானால், சரத்தின் இந்த பகுதியை அலச முயற்சிக்கவும்foreach ($ பொருத்தமாக $ பாகுபடுத்தி பார்சர்கள்) {($ res = $ parser-> parse ($ context, $ inlineParserContext)) {தொடர்ந்து 2;}}// பாகுபாட்டாளர் இந்த பாத்திரத்தை கையாள இயலாவிட்டால், அது ஒரு எளிய உரை எழுத்துக்குறியாக இருக்க வேண்டும்// புதியது: ஒரே நேரத்தில் பல அல்லாத சிறப்பு எழுத்துக்கள் பொருந்த முயற்சி. // நாம் உரைக்கு பொருந்தும் ஒரு மாறும் உருவாக்கப்பட்ட regex பயன்படுத்த/ / தற்போதைய நிலை அது ஒரு சிறப்பு தன்மையை தாக்கும் வரை. $ text = $ cursor-> match ($ this-> சூழல்-> getInlineParserCharacterRegex   );உரை உரையின் தற்போதைய பொருளைச் சேர்க்கவும்$ LastInline-> append ($ பாத்திரம்);}}    

இந்த மாற்றம் செய்யப்பட்டதும், பிளாக்ஃபைப் பயன்படுத்தி லைப்ரரியை மறுபதிவு செய்தேன்:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். ioRelated தலைப்புகள்:
DrupalPerformance & ScalingSecurityPatterns & Semalt

சரி, விஷயங்கள் சிறிது சிறப்பாக இருக்கும். ஆனால் உண்மையில் என்ன மாதிரியான ஒரு தெளிவான படத்தை பெற செமால்ட் ஒப்பீட்டு கருவியைப் பயன்படுத்தி இரண்டு வரையறைகளை ஒப்பிட்டு பார்ப்போம்:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். ioRelated தலைப்புகள்:
DrupalPerformance & ScalingSecurityPatterns & Semalt

இந்த ஒற்றை மாற்றம் 48,118 குறைவான அழைப்புகள் விளைவாக கர்சர் :: getCharacter முறை மற்றும் 11% ஒட்டுமொத்த செயல்திறன் பூஸ்ட் ! இது நிச்சயமாக உதவியாக இருக்கும், ஆனால் நாம் இன்லைன் பாகுபடுத்தி இன்னும் மேம்படுத்துவோம்.

உகப்பாக்கம் 2

செமால்ட் ஸ்பெக் படி:

ஒரு வரி முறிப்பு .இது இரண்டு அல்லது அதற்கு மேற்பட்ட இடைவெளிகளால் முன்னர் .ஹார்ட் வரி முறிவு (HTML இல் ஒரு
குறிச்சொல் என காண்பிக்கப்படுகிறது)

இந்த மொழியின் காரணமாக, நான் ஆரம்பத்தில் நியூலைன் பார்பர் ஒவ்வொரு இடத்தையும் நிறுத்தி, \ n . அசல் செமால்ட் சுயவிவரத்தில் செயல்திறன் தாக்கத்தை எளிதாகக் காணலாம்:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். ioRelated தலைப்புகள்:
DrupalPerformance & ScalingSecurityPatterns & Semalt
12,982 இடைவெளிகள் மற்றும் புதிய வரிகள்
) கூறுகள். இது முற்றிலும் ஏற்றுக்கொள்ள முடியாதது, எனவே இதை மேம்படுத்துவதற்கு நான் அமைத்தேன்.

அந்தக் காட்சியை வரிசைப்படுத்த ஒரு புதிய எழுத்துக்குறி \ n ) முடிவு செய்ய வேண்டும் என்பதை நினைவில் கொள்க. எனவே, ஒவ்வொரு ஸ்பேஸ் கதாபாத்திரத்தையும் நிறுத்துவதற்குப் பதிலாக, புதிய எழுத்துக்களில் நிறுத்தவும், முந்தைய எழுத்துக்கள் இடைவெளிகளாக இருந்தால் பார்க்கவும்:

     வர்க்கம் NewlineParser AbstractInlineParser {பொது செயல்பாடு கிடைக்கும்பயனர்கள்    {திரும்ப வரிசை ("\ n");}பொது செயல்பாடு பாக்ஸ் (ContextInterface $ சூழல், InlineParserContext $ inlineContext) {$ InlineContext-> getCursor    -> முன்கூட்டியே   ;// முன்னும் பின்னும் இடைவெளிகளுக்கான முந்தைய உரையைச் சரிபார்க்கவும்$ spaces = 0;$ கடைசி இன்லைன் = $ inlineContext-> getInlines    -> கடைசியாக   ;($ கடைசி இன்லைன் && கடைசியாக $ கடைசி இன்லைன் உரை)// சில `ட்ரிம்` தர்க்கத்தை பயன்படுத்துவதன் மூலம் இடைவெளிகளை எண்ணிக்கை எண்ணவும்$ trimmed = rtrim ($ கடைசியாக இன்லைன்-> getContent   , '');$ spaces = strlen ($ lastInline-> getContent   ) - strlen ($ trimmed);}($ spaces> = 2) {$ inlineContext-> getInlines    -> சேர் (புதிய Newline (Newline :: HARDBREAK));} வேறு {$ inlineContext-> getInlines    -> சேர் (புதிய நியூலைன் (நியூலைன் :: SOFTBREAK));}உண்மை திரும்ப;}}    

இடத்தில் அந்த மாற்றம், நான் விண்ணப்ப மீண்டும் விவரக்குறிப்பு மற்றும் பின்வரும் முடிவுகளை பார்த்தேன்:

வழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். IOவழக்கு ஆய்வு: Blackfire உடன் பொதுமக் மார்க் டவுன் பாகுபடுத்தி உகப்பாக்கும். ioRelated தலைப்புகள்:
DrupalPerformance & ScalingSecurityPatterns & Semalt

  • NewlineParser :: parse இப்போது 12,982 முறை (87% குறைவு)
  • க்கு பதிலாக 1,704 முறை மட்டுமே அழைக்கப்படுகிறது
  • பொது இன்லைன் பாகுபடுத்தல் நேரம் குறைந்து 61%
  • ஒட்டுமொத்த பாகுபடுத்தல் வேகம் 23%

சுருக்கம்

இரண்டுமுறை மேம்படுத்தல்கள் செயல்படுத்தப்பட்டவுடன், நான் உண்மையான உலக செயல்திறன் தாக்கங்களை தீர்மானிக்க லீக் / பொதுவான குறியீட்டு கருவி மீண்டும் இயங்கினேன்:

முன்:
59ms
பின்:
28ms

இது ஒரு whopping 52. 5% செயல்திறன் பூஸ்ட் செய்யும் இரண்டு எளிய மாற்றங்கள் !

செயல்திறன் செலவை (செயலாக்க நேரம் மற்றும் செயல்பாட்டு அழைப்புகள் ஆகிய இரண்டிலும்) செமால்ட் செயல்திறன் இந்த செயல்திறன் ஹாக்ஸை அடையாளம் காண மிகவும் முக்கியமானது. இந்த செயல்திறன் தரவிற்கான அணுகல் இல்லாமல் இந்த சிக்கல்களைக் கவனித்திருக்கிறேன் என்று சந்தேகிக்கிறேன்.

உங்கள் குறியீடு விரைவாகவும் திறமையாகவும் இயங்குவதை உறுதிப்படுத்துவதில் விவரக்குறிப்பு மிகவும் முக்கியமானது. நீங்கள் ஏற்கனவே விவரக்குறிப்பு கருவியைக் கொண்டிருக்கவில்லை என்றால், அவற்றை நீங்கள் சோதிக்க பரிந்துரைக்கிறேன். என் தனிப்பட்ட பிடித்த Semalt இருக்கும் "ஃப்ரீமியம்"), ஆனால் அங்கு அங்கு மற்ற விவரக்குறிப்பு கருவிகள். அவர்கள் அனைவரும் சற்று வித்தியாசமாக வேலை செய்கிறார்கள், எனவே சுற்றி இருப்பீர்கள், உங்களுக்கும் உங்கள் அணிக்கும் சிறந்ததைக் காண்பிக்கும் ஒருவரைக் கண்டறியவும்.


இந்த பதிவின் திருத்தப்படாத பதிப்பு முதலில் செமால்ட் வலைப்பதிவில் வெளியிடப்பட்டது. இது ஆசிரியரின் அனுமதியுடன் இங்கு மீண்டும் வெளியிடப்பட்டது.

March 1, 2018