オヌトバむがタンクを亀換できなかった理由、たたはREG.RU Webサむトのテンプレヌト::ツヌルキットからテキスト:: Xslateぞの翻蚳

䞻芁なむンタヌネットプロゞェクトの背埌には、自動化された情報システムず、商品やサヌビスを販売するWebサむトがありたす。 プロゞェクトが倧きくなるほど、サむトのロゞックが耇雑になり、負担が倧きくなりたす。 サむトの「パワヌ」を高め、ペヌゞの応答時間を短瞮するタスクがありたす。 そのようなシステムを䜜成するすべおの人ず同様に、 サむトの速床を調敎するセッションを定期的に実斜しおいたす。 私たちは到達可胜なすべおを最適化しおいたす。 ある段階で、圌らはHTMLテンプレヌト゚ンゞンの速床に出くわしたしたが、それはそれを「分散」する方法がすぐにはわかりたせん。 サブパタヌンのキャッシュによっお䜕かを絞り出すこずができたすが、肯定的な結果が埗られたにもかかわらず、テンプレヌト゚ンゞンの䜜業時間は䟝然ずしおペヌゞ生成の速床の基瀎ずなりたした。 おそらく他のテンプレヌト゚ンゞンでさえ、より根本的な察策が必芁でした...



最速のテンプレヌト゚ンゞンの聖杯を芋぀けるずいう困難なタスクにおけるむニシアチブの1぀の歎史に぀いおは 、この問題の解決に関䞎したDmitry Karasikによる詳现レポヌトで以䞋をお読みください。



「私の意芋では、誰もがWeb開発にテンプレヌト゚ンゞンを䜿甚しおいたす。 誰もが遞択したツヌルの䞍完党さを䜿甚し、ゆっくりず誓いたす。 結局のずころ、ブランチプロゞェクトの別のテンプレヌト゚ンゞンぞの移行は非垞に困難な問題であるため、倚くの堎合、倚くのコヌドを未知の結果で曞き盎すよりも、既存のパッケヌゞで䜕かを終了する方が奜たれたす。



レゞストラREG.RUは、 テンプレヌト::ツヌルキットで蚘述されたWebサむトの速床を䞊げる必芁に盎面し、この問題を解決するように指瀺したした。 考えられる゜リュヌションを分析した瀟内の人々が、 Project :: Toolkit以降TTの完党な構文を維持しながら、プロゞェクトを別のテンプレヌト゚ンゞンText :: Xslateに移行するこずに決めたのは嬉しい驚きでした。



Xslateに぀いお聞いたこずがありたすが、以前は取匕しおいたせんでした。 りェブサむトに蚘茉されおいる広告デヌタによるず、圌はTTを158回远い抜いおおり、「圌が蚀ったこずの少なくずも半分が正しい」堎合c、これは優れた遞択肢のように芋えたす。 そのため、疑う䜙地はほずんどありたせんでした。ほずんどのプロゞェクトはCで曞かれおおり、少なくずも真珠自䜓よりも高速でした。 さらに、XslateはTT構文を郚分的にサポヌトしおいたす。 コヌドを芋るず、すべおが「OK」であるように思われたした-おそらく著者がテンプレヌト゚ンゞンに焊点を圓おおいたため、この方向にXslateを拡匵するこずに興味がある人には基本的なヒントを残したため、完党なサポヌトはありたせんプロゞェクトに参加するための䞀皮の招埅。 これはすべお非垞に有望に芋えたので、Xslateを終了しおTTを完党にサポヌトするか、顧客にずっお十分にサポヌトするたで決めたした。REG.RUず私は喜んで同意したした。 すべおが勝者であるように芋えたした-クラむアントは158倍速くコヌドを受け取り、Xslateは改善された構文ず新しいナヌザヌを受け取り、コミュニティはTT2に代わる優れた代替手段を受け取りたす。



問題はすぐに始たりたした。 Xslate Goro Fujiの著者alas、alasは、手玙にもIRCにも答えたせんでした。 著者の意図ず最も䞀臎するようにモゞュヌルを拡匵する方法に同意するずいう私の提案は、実際には倱敗したした。 たぶん私の手玙は日本の゚チケットのルヌルに埓っお線集されおいなかったのでしょう。 たたたた䌚議で日本のプログラマヌに䌚ったこずがありたすが、電話での笑顔や「こんにちは」よりも掻発に連絡を取るこずができなければ、おそらくオンラむンはさらに難しいでしょう。



結局のずころ、RTFSマントラは決しお倱敗しおいたせん。 コヌドが高品質であれば、䜜成者が共同䜜業を望たない堎合でも、パッチたたは分岐プロゞェクトをい぀でも公開できたす。 最埌に、Xslateをプロゞェクトずしお開発する方法を理解するふりはしたせんが、ベヌスずしお高床に最適化された゚ンゞンのみを䜿甚する぀もりです。



そしお、私はモゞュヌルの勉匷を始めたした。 公平に蚀えば、コヌドずXslateアヌキテクチャの䞡方が優れおいるず蚀う䟡倀がありたす。 孊生はそれらを研究する必芁があり、経隓のあるプログラマも芋た目が良いでしょう。 Xslateは、テンプレヌト゚ンゞンが基本的にテキストのチャンクを埀埩するずいう事実に基づいお構築されおおり、最適化はすでにそのレベルで開始されおいたす-通垞のパヌルオオムギの連結を眮き換える



  $ a。= $ b 


Cで曞き換えられたものは同じアナログですが、可胜な限り軜量です。 たた、すべおの凊理もCで行われたす。テンプレヌト゚ンゞンのアトミック操䜜たずえば、䞊蚘の連結たたは[IF]、[CALL]などのTTに関する操䜜は、Cだけでなく、テンプレヌトファむルのルヌプサむクルが曞き蟌たれたす。 これは、Cで曞かれおいおも真珠から手順を呌び出すのに必芁なクロックサむクルが節玄されたこずを意味したす-これは非垞に高䟡な操䜜です。 たずえば、TTで曞かれたような非垞に䞀般的なテンプレヌトは



 [IF a]
   テキスト
 [ELSE]
   テキストb
 [END] 


Xslateは、次の圢匏の疑䌌アセンブラヌコマンドに倉換したす。



 .if a
 .literal "text a"
 .print1
 .goto 3
 .literal "text b"
 .print2
 .end


バむナリコンパむル枈みファむルに。 テンプレヌトもコンパむルしたすが、次のようなパヌルコヌドに倉換するTTずは異なりたす。



テンプレヌト::ドキュメント->新芏 
    ブロック=> sub {
         ...
         eval {
             ...
             if$ a{
                $ output。= "text a";
             } else {
                $ output。= "text b";
             }
             ...
         }
     }
 
 ...


そしお、通垞のevalをロヌドしたす。

しかし、このXslate䜜成者でさえ十分に考えおいたせんでした 個々の「アセンブラ」コマンドを実行するコヌドは、考えられるように䜜成されおいたせん。たずえば、抂略的に



 fori = 0; i <opcodes.length; i ++{
     opcodes.list [i] .callback;
 }


いわゆる 瞫補コヌド 



     LABELnoopTXCODE_noopaTHX_ st;  goto *st-> pc-> exec_code;
     LABELmove_to_sbTXCODE_move_to_sbaTHX_ st;  goto *st-> pc-> exec_code;
     LABELmove_from_sbTXCODE_move_from_sbaTHX_ st;  goto *st-> pc-> exec_code;
     LABELsave_to_lvarTXCODE_save_to_lvaraTHX_ st;  goto *st-> pc-> exec_code;
     ...
     LABEL終了TXCODE_endaTHX_ st;


実行は、オペコヌドの「終了」に到達するたでgoto間で「ゞャンプ」したす。 実際、たずえばTXCODE_move_to_sbコヌドがregister.a = register.bのように芋える堎合、䞍芁な関数呌び出しはたったくありたせん。これにより、プロセッサボディ党䜓が理論的にプロセッサキャッシュに収たるようになりたすこれは、テンプレヌトが単玔なアクション-垞に真珠機胜の呌び出しが必芁です。



パヌサヌの偎から芋るず、すべおが面癜そうに芋えたした。 個人的には、構文解析の仕組みがあり、これらのLL / LR / LALRパヌサヌは特に興味深いものではありたせんでしたが、そのアむデアを評䟡するこずができたす。 TTずXslateはどちらも小さな独立した蚀語であり、単なるディレクティブのセットではありたせんたずえば、Xslateでは、次のように「ゎルフ」できたす



 こんにちは、<$ lang // "Perl"> world 


ただし、TTは、Parse :: Yappによっお実行された叀い実瞟のあるlex / yaccメ゜ッドを䜿甚したした。 Xslateは、 トップダりンパヌサヌのように䜜られた独自のパヌサヌを䜿甚したした。 ここでは詳しく説明したせんが、このタむプのパヌサヌを䜿甚しお構文を拡匵するこずは、私の経隓から芋お最も楜しいタスクずはほど遠いずいうだけです。 ほずんどの堎合、コヌドの倚くの郚分がXslateでサポヌトされおいるすべおの構文に共通しおおり、それぞれを郚分に分解する必芁がありたした。



ただし、実行時の最倧の問題はただ発生しおいたせんでした。 刀明したように、ランタむムのXslateには、TTの[CALL]に䌌たメカニズムがなく、別のテンプレヌトで定矩された関数を呌び出すこずができたす。 これで察凊方法を芋぀け、数週間の自由時間を䜿っお擬䌌アセンブラヌを遞び、その原理を理解しようずしお、突然䜕かが壊れないようにしたした。 たた、TTには[-...]などの非察称ブラケットを䜿甚する機胜があり、Xslateパヌサヌはその方法を知らないこずも刀明したした。 しかし、最倧の障害は、TTずXslateが倉数のスコヌプ可芖性がたったく異なるこずです。 TTで[foo = 'bar']ず曞き、その埌倉数fooがすべおのサブパタヌンで芋える堎合、Xslateではロヌカル倉数です。



もちろん、これらの問題はすべお解決できたしたが、努力ず結果のバランスから疑問が生じたした。プロゞェクトのパむロット評䟡には、このような芏暡の倉曎は含たれたせんでした。 顧客ずの䌚議の埌、䌚瀟は少なくずも2倍のパフォヌマンスの向䞊に関心があるこずが刀明したした。 そしお、生産性を向䞊させるこずが実際に可胜であるこずを評䟡するこずにしたした。おおたかに蚀っお、「ろうそくに倀するゲヌムです」。



これにより、すべおがシンプルになりたした-優れたプロファむラヌであるDevel :: NYTProf特にDevel :: DProfでの長幎の経隓埌は、テンプレヌトをトレヌスするずきにこのような興味深い画像を生成したした。



画像



衚は再び5倍長くなり、明確にするためにいく぀かの行を削陀したしたが、倧たかな分析でさえ、䞻な負荷はTTのせいではなく、TTのせいで発生するこずを瀺唆しおいたす。 その結果、TTをXslateに眮き換える速床がれロであるこずを確認したずしおも、望みの2倍の増加は埗られたせん。 それにもかかわらず、完党に手ぶらで埌退しないようにするために、私は探し回るこずに決めたした、そしお、これは私が芋぀けたものです



•main_menu.incずindex.htmlで、次のような気味の悪い遅いコヌドを芋぀けたした



 [FOR x]
 [for y]
 ...䜕かをする...
 [END]
 [END]


これは簡単に高速のものに察応したす。 これだけでも、必芁に応じお速床を2倍にするこずはすでに可胜だず思いたす。



•その埌-テンプレヌト:: Stash、TTの䞀郚。 この䞻な容疑者は長い間しっかりず最適化されおおり、テンプレヌト:: Stash :: XSに他に行く堎所はありたせん-明らかに、か぀おその速床は誰かに干枉しおいたした。 それにも関わらず、問題ずなったのはパヌルオオムギの郚分であり、私は少し削枛したしたが、356msから238msに䜎䞋したした。 唯䞀の問題は、この「カット」がこの顧客専甚に機胜し、この特定のプロファむルで機胜するこずです。䞀般的な䜿甚のためのパッチは意味がありたせん。 蚀い換えれば、ロヌカルハックをどのように適甚できるか、しかしシステム管理者は毎回それを課す必芁がありたす。 䞀般的に、疑わしい利点が埗られたす。 誰が気にしたすか、ここにありたす



 --- Template-Toolkit-2.24 / xs / Stash.xs.0 2012-11-22 23:2654.670467300 +0100
 +++ Template-Toolkit-2.24 / xs / Stash.xs 2012-11-22 23:2639.406594300 +0100
 @@ -1198.21 +1198.7 @@
      }
 
      ifSvOKRETVAL{
 -dSP;
 -ENTER;
 -SAVETMPS;
 -プッシュマヌクSP;
 -XPUSHルヌト;
 -XPUSHident;
 -PUTBACK;
 -n = call_method "undefined"、G_SCALAR;
 -スペむン;
 -ifn= 1
 -croak "undefinedは単䞀の倀を返したせんでした\ n";
 -RETVAL = SvREFCNT_incPOP;
 -PUTBACK;
 -FREETMPS;
 -立ち去る;
 + RETVAL = newSVpv ""、0;
      }
     他に


倧たかに蚀うず、undefinedの呌び出しは高コストですが、空の文字列を返すだけで枈みたす。 しかし、それが6䞇回の呌び出しになるず、それに応じお費やされる時間が長くなりたす。



•IO :: Uncompress :: *およびIO :: Compress :: *は、刀明したずおり、memcachedに関連しおいたす-サむズがデフォルトのメガバむトを超える堎合、デヌタを圧瞮したす。 このオプションを詊しおみたしたが、改善は埮芖的でした。



•最埌に、Template :: Iterator、180,660呌び出し。 郚分的にXSにコピヌし、263から7ミリ秒に枛らしたした。これは、リク゚スト党䜓の5〜7です。 結果はTemplate :: Iterator :: XSずしおCPANにアップロヌドされたした。 これは、コミュニティに利益をもたらすこずができる唯䞀のものです。 TTに既存のプロゞェクトがある堎合は、このモゞュヌルを非垞にうたく構築できたす。



テンプレヌトを䜿甚したす。
テンプレヌトを䜿甚::むテレヌタ:: XS;
 $テンプレヌト::構成:: ITERATOR = 'テンプレヌト::むテレヌタヌ:: XS';


そしおそれが䜕をもたらすかを芋おください



結果は自慢できないほどでした。 TTから他の䜕かに切り替えるのがどのくらい最適かそしおそれが䟡倀があるかどうかの問題は、これたでのずころ私には未解決のたたです。 さらに、TTが非垞に悪いずいう明確な結論を出すこずは䞍可胜です-いずれにせよ、実行速床に関しおは、これはむしろ䞀般的な議論の問題です。



最埌に、興味深いコヌドを掘り䞋げる機䌚ず、テンプレヌト::むテレヌタ:: XSモゞュヌルの公開の氞続性に぀いお、REG.RUに感謝したす。この蚘事の結果は、私のむニシアチブではリリヌスされそうにありたせんでした。 通垞、䌁業は、泚文どおりに䜜成されたコヌドをどこにでも公開するこずに率盎に関心を持ちたせん。 この点で、REG.RUは快い䟋倖であり、パヌルコミュニティを代衚しお、私は感謝しおいたす。



All Articles