Back to Question Center
0

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire.io            Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire.io Têkilî: DrupalPerformance & ScalingSecurityPatterns & Semalt

1 answers:
Lêkolînek Sersala: Pêşkeftina Hevpeyivîna CommonMark Parser bi Blackfire. io

Hûn ku hûn bizanin, ez nivîskar û parastina me ya Lîpa Kommerge ya PHP-yê Semalt parser im. Ev projeyê sê armancên sereke hene:

  1. temamî tevahiya CommonMark piştgirî bikin
  2. tevgerên pêvajoyên JS-ê re bicih bikin
  3. baş baş û nivîsîn be û biqewletî be, da ku hinek dikarin dikarin karbidestiya xwe bikin.

Armanca dawîn ev dibe ku pir girîng e, bi taybetî ji ji aliyê pêşveçûnê ve. Other Semar parsersên populer ên din bi karên yekbûyî re bi karên regexên mezin re ava kirin. Wekî ku hûn ji vê benchmarkê re bibînin, ew bi lez bilez dike:

Pirtûkxaneya Tevahî Parse Time Daxistin / Daxistinê
Parsedown 1. 6. 0 2 ms 1
PHP Markdown 1. 5. 0 4 ms 4
PHP Markdown Extra 1. 5. 0 7 ms 6
CommonMark 0. 12. 0 46 çirkan 117

Semalt, ji ber ku pîşesaziya pirzimanî û mîlyonek tevahî, pirtirkêmtir e (heke ne gengaz e) da ku ev parserên bi logicê reklama dirêj bikin.

Çimkî ji bo Parlamentoya Semaltê, em hilbijartin li ser karûbarê pêşîn. Vê yekê ji bo pîşesaziya object-oriented a decoupled ku bikarhênerên hêsan dikarin hêsan bikin. Ev hinek kesan kir ku ji bo întegrasyonên xwe, dirêjkirin û projeyên din ên avahîm ava bikin.

Performansa pirtûkxaneyê hîn hîn jî baş e - dibe ku bikarhênerê dawî dibe ku di nav 42ms û 2msan de cudahî nakin (divê hûn her weha herdu Markdown-ê derxistin). Lêbelê, em hîn jî dixwazin ku armancên sereke yên me de bêhtir mimkin be parserê xweş bikin. Ev posta blogê diyar dike ku em çawa Semalt bikar anîn ku tenê bikin.

Profîl bi Blackfire

Semalt ji amûrên sensio-labsê veguhestineke tirsnak e. Hûn bi tenê daxwaza webcam an daxwaznameya CLI ve girêdayî bikin û ev ceribandina performansa hêsantir-ya-digest ya daxwaza daxwaznameya we bigirin. Di vê posteyê de, em ê lêkolîn bikin ka Semalt çawa tê bikaranîn ku pirsgirêkên du herdu çalakiyên di versiyonê de di bin versiyonê de ji 6. 6. 1 ji league / pirtûkxaneya hevpar.

Bila wextê ku dema ku ew lîga / hevpeymanê dike ku ji ber naverokên belgeya Semalt veşartî dest pê dike,

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. mijarên ioRelated:
DrupalPerformance & ScalingSecurityPatterns & Semalt

Semalt li ser vê guherînan bi vê guherînan re danûstendin da ku ji bo çêtirkirina karûbarên kapîtalê bike.

Piştgiriya bilez a: Blackfire tiştên ku dişibînin tiştên ku dişibînin, hingê demên darizandinê her dem ji her demên gelemperî zêdetir e. Ji sedî nîqaşê veguhastina li ser veguherîna di demên "dîwarê dîwar" de.

Pêşveçûn 1

Li gorî standarda destpêkê ya me digerin, hûn dikarin bi xwe re bibînin ku di binivîsin de di binivîsin InlineParserEngine :: parse ji bo sedem 43. 75% ji bo darvekirina darizandinê. Vebijêrk vê rêbazê bêtir agahdariyê dide ka di vê çima de pêk tê:

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. Li vir veguhestin partî (hinek-guherîn) ye ku ji vê rêbazê de 0. 6. 1:  </p>  <pre>   <code class= Parîsê gelemperî (ContextInterface $ context, Cursor $ cursor){// ji hêla her curekî di nav rêza deverî de têtedema (($ character = $ cursor-> getCharacter )! == null) {// Check ku bizanin ka ka pîvanek taybetmendiya Markdown-taybet e// Heke wusa, bila hewce bike ku ev parçeya parçeyê parçe bikinPêşbigere ($ matchingParsers wekî $ parser) {Heke ($ res = $ parser-> parse ($ context, $ inlineParserContext)) {berdewam 2;}}// Heke parser nikare vê krîterê bistînin, hingê divê ew xeyalek teknîkî be// vê taybetmendiyê zêde bikin ku li ser vê rûpelê ya nivîsê$ lastInline-> veşartinê ($ character);}}

Blackfire ji me re dibêje ku parse ji dora 17% dora her demê dakêşin kontrol dike her. yekoyek. şexsîyet. yek. ba. yek. dem . Lê piranî ji van 79,194 cûr tê nivîsîn e ku hewce ne pêdivî ye! Ka bihêle vê yekê.

Semalt ya ku di encama dawiya me ya yekane de digerin, bila ji bo ku em dikarin dikarin celebên taybetî yên ne-taybet be girtin, ji bo regex bikar bînin.

     Parîsê gelemperî (ContextInterface $ context, Cursor $ cursor){// ji hêla her curekî di nav rêza deverî de têtedema (($ character = $ cursor-> getCharacter   )! == null) {// Check ku bizanin ka ka pîvanek taybetmendiya Markdown-taybet e// Heke wusa, bila hewce bike ku ev parçeya parçeyê parçe bikinPêşbigere ($ matchingParsers wekî $ parser) {Heke ($ res = $ parser-> parse ($ context, $ inlineParserContext)) {berdewam 2;}}// Heke parser nikare vê krîterê bistînin, hingê divê ew xeyalek teknîkî be// NEW: Ji bo ceribandinên celebên taybetî yên pirrjimar re bigirin. // We dînamîk bi karûbarên regex ve tê bikaranîn ku ji nivîskî re peyda dike// pozîsyona heyî heta ku ew xeyalek taybetî ye. $ text = $ cursor-match ($ this-> hawîrdorê-> getInlineParserCharacterRegex   );// Daxistina nivîsê ya li ser vê rûpelê ya nivîsê$ lastInline-> veşartinê ($ character);}}    

Dema ku ev guhert hate çêkirin, ez bi pirtûkxaneya Blackfire re bi karanîna pirtûkxaneyê re-profiled:

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. mijarên ioRelated:
DrupalPerformance & ScalingSecurityPatterns & Semalt

Ma baş, tiştek baştir digerin. Lê bila bila her du standardên bikar tînin ku bi karanîna amûra Semaltê bikar bînin, da ku hûn wêne ya paqij e ku çi guhertin:

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. mijarên ioRelated:
DrupalPerformance & ScalingSecurityPatterns & Semalt

Vê guherîna vê yekane di 48,118 kêmtir bang ji vê kursiyê :: getCharacter rêbaz û 11 (% 11) tevahiya çalakiya pêşveçûnê ! Ev bi rastî jî alîkarî ye, lê em dikarin hêsankirî binivîsin û bêtir hêsankirin.

Pêşveçûn 2

Li gor xala Semalt:

Pêvekek qutiyek .ku ji hêla du an bêtir bêtir vekirî ye .wek xaçek zehmetek zehfkirî ye (bi HTML-ê wekî
xortek vekirî

Ji ber vê ziman, ez bi rastî ya NewlineParser rawestandin û her cûre û \ n pirtirkêmtirîn lêpirsîn bû. Hûn dikarin bi bandora Semalt-ê li ser bingeha bandora performansa xwe bibînin:

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. mijarên ioRelated:
DrupalPerformance & ScalingSecurityPatterns & Semalt

Ez şaş bûm ku 43. 75% ya pêvajoya entiştî de fikirîn ka ka 12,982 cihan û nûjenên nû divê bêne guhertin
) element Ev yekser nayê qebûl kirin, da ku ez ji bo çêkirina vê yekê çêkir.

Ji bîr bîr bînin ku xuyakirina diyalogê bi xortek nû ya nû ( \ n bi dawî bibe. Ji ber vê yekê, ji ber ku li her derheqê her cihek rawestîne, bila tenê li ser nûçeyan raweste û bibînin ka kaverên berê berê cihan bûne:

     Dema NewlineParser AbstractInlineParser dirêj dike {çalakiya gelemperî GetCharacters    {vegerandina array ("\ n");}Farsa gelemperî (ContextInterface $ context, InlineParserContext $ inlineContext) {$ inlineContext-> getCursor    -> pêşîn   ;// Pêveka berê ya ji bo cîhên trailing ên kontrol bikin$ spaces = 0;$ lastInline = $ inlineContext-> getInlines    -> last   ;Heke ($ Text-lastline-and-$ lastInline Text Name)// Gelek hejmaran de hejmarek bi karanîna hin `trim` logic bikar bînin$ trimmed = rtrim ($ lastInline-> getContent   , '');$ spaces = strlen ($ lastInline-> getContent   ) - strlen ($ trimmed);}Ger ($ spaces> = 2) {$ inlineContext-> getInlines    -> add (Newline (Newline :: HARDBREAK));} else {$ inlineContext-> getInlines    -> add (Newline (Nûline :: SOFTBREAK));}vegera rast}}    

Bi vê guherînê de, ez ji bo serîlêdanê re-profîl kirin û encamên jêrîn dît:

Pirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. ioPirsgirêka Sazkirinê: Pêşvekirina Pêşkeftina CommonMark Parser bi Blackfire. mijarên ioRelated:
DrupalPerformance & ScalingSecurityPatterns & Semalt

  • NewlineParser :: parse niha tenê ji 1,704 car caran ji 12,982 car (an 87% kêm dibe)
  • Dema parsîngê giştî ya% 61
  • Bi tevahî parsing speed 23%

Pirtûka

Dema ku herdu herdu herduyan pêkanîn, ez destûra league / standardmark benchmark mark-re-ran-ê da ku ji bo diyarkirina rast-cihên cîhanê diyar bike:

Berî:
59ms
Piştî:
28ms

Vê guman 52. 5% pêşveçûnê ji çêkirina du guherînên hêsan !

Semalt dikare bikaribin ku mesrefên performansa bibînin (di dema duyemîn de û navnîşên hejmarek fonksiyonê) tête giring bû ku ji bo naskirina van çalakiyên hogsê bû. Ez pir guman dikim ku ev mijarên ku bêyî destûr daneyên danûstendina vê çalakiyê tê dîtin.

Profîlek pir girîng e ku ji bo bicîhkirina ku kodê zû û bi awayekî zûtir dibe. Heke hûn nexweşî hewayî ne, hingê ez pêşniyaz dikin ku hûn ji wan re kontrol bikin. My favorite personal favorite happens to be that Semalt be "freemium"), lê belê li wir jî hebe jî profîlên din jî hene. Hemî ji wan cuda cuda digerin, da ku li dora xwe binêrin û yek ji yê ku ji bo we û te teamê çêtirîn kar dike.


Guhertoya yekgirtî ya vê postê di destpêkê de li blogê Semalt hate belav kirin. Ew bi destûra nivîskarê re li vir hat nûvekirin.

March 1, 2018