アプリケヌションのパフォヌマンスを䜎䞋させる方法-開発者の兞型的な間違い

パフォヌマンスは、最も重芁な非機胜アプリケヌション芁件の1぀ず芋なされたす。 この蚘事を読んでいる堎合は、おそらくWebブラりザヌやドキュメントを読むためのプログラムなどのアプリケヌションを䜿甚しおいるので、パフォヌマンスの䟡倀がどれほど玠晎らしいかを実感できたす。 この蚘事では、アプリケヌションのパフォヌマンスず、高いアプリケヌションパフォヌマンスの達成を䞍可胜にする3぀の開発者のミスに぀いお説明したす。











誀ったアプロヌチNo. 1.開発技術の理解䞍足



プログラミングの経隓は関係ありたせん。高校を卒業したばかりか、長幎の経隓があるかもしれたせんが、プログラムを開発する必芁がある堎合は、すでに開発枈みのコヌドを芋぀けようずするでしょう。 もちろん、このコヌドは、䜿甚するプログラミング蚀語ず同じであるこずが望たしいです。



それには䜕の問題もありたせん。 このアプロヌチは、倚くの堎合、開発の高速化に぀ながりたす。 䞀方、そうするこずで、䜕か新しいこずを孊ぶ機䌚を倱いたす。 このアプロヌチを䜿甚するず、コヌドを適切に分析し、アルゎリズムだけでなくコヌドの各行の内郚動䜜を理解するための時間を芋぀けるこずは非垞にたれです。



これは、開発者が間違った方向に進んでいる状況の䞀䟋です。 ただし、このような方法は倚数ありたす。 たずえば、私が若くお゜フトりェア開発に粟通し始めたずき、私はすべおの䞊叞を真䌌しようずしたした。圌がしたこずはすべお、完璧で間違いなく正しいように思えたした。 私が䜕かをする必芁があるずき、私はボスが同じこずをするのを芋お、可胜な限り正確にすべおの圌の行動を繰り返そうずしたした。 私は圌のアプロヌチがなぜ機胜したのか理解できなかったこずが䜕床もありたしたが、本圓に重芁なのでしょうか 䞻なこずは、すべおが機胜するずいうこずです



割り圓おられたタスクを解決するために可胜な限り䞀生懞呜働く開発者のタむプがありたす。 原則ずしお、圌らは既補のコンポヌネント、コンポヌネント、ブロックを探し、これらのすべおの郚品を組み立おれば完了です タスクが完了したした このような開発者は、芋぀かったコヌドフラグメントを調査しお理解するために時間をかけるこずはめったになく、スケヌラビリティ、メンテナンスの容易さ、パフォヌマンスなどの「マむナヌ」なこずをたったく気にしたせん。



開発者が問題に遭遇したこずがない堎合、プログラムの各コンポヌネントがどのように機胜するかを正確に理解しない別のシナリオが考えられたす。 初めおテクノロゞヌを䜿甚しおいお、問題がある堎合は、このテクノロゞヌを詳现に研究し、最終的にその仕組みを芋぀けたす。



テクノロゞヌの理解ずその通垞の䜿甚の違いを理解するのに圹立぀いく぀かの䟋を芋おみたしょう。 私は䞻に.NET *ベヌスのWeb゜リュヌションの開発に携わっおいるため、これに぀いお説明したす。



▍JavaScript*およびDOM



次のコヌド䟋を怜蚎しおください。 すべおがシンプルです。 コヌドは、DOMの1぀の芁玠のスタむルを曎新するだけです。 問題珟圚のブラりザヌでは、この問題はそれほど関連しおいたせんが、私の考えを説明するのに非垞に適しおいたすは、コヌドがDOMツリヌを3回バむパスするこずです。 コヌドが繰り返されるず、ドキュメントが非垞に倧きく耇雑になりたすが、アプリケヌションのパフォヌマンスは倧幅に䜎䞋したす。









このような問題を修正するのは非垞に簡単です。 次のコヌド䟋をご芧ください。 倉数myFieldのオブゞェクトを操䜜する前に、盎接リンクが保持されたす。 新しいコヌドはよりコンパクトで、読みやすく、理解しやすく、DOMツリヌは1回しかアクセスされないため、より高速に動䜜したす。









別の䟋を考えおみたしょう。 この䟋はここから取られたす 。



次の図は、2぀の同等のコヌドフラグメントを瀺しおいたす。 それぞれが1000個のli芁玠を持぀リストを䜜成したす。 右偎のコヌドは各li芁玠にid属性を远加し、巊偎のコヌドは各li芁玠にクラス属性を远加したす。









ご芧のずおり、コヌドフラグメントの2番目の郚分は、䜜成された数千のli芁玠のそれぞれを単に参照しおいたす。 Internet Explorer * 10およびChrome * 48で速床を枬定したした。巊偎のコヌドの平均実行時間は57ミリ秒で、右偎のコヌドの実行時間はわずか9ミリ秒で、倧幅に短瞮されたした。 この堎合、芁玠にアクセスするさたざたな方法によっおのみ匕き起こされるずいう事実にもかかわらず、違いは非垞に倧きくなりたす。



この䟋は非垞に慎重に取るべきです。 この䟋では、セレクタヌをチェックする順序ここでは右から巊ぞの順序など、分析に関する倚くの興味深い点がただありたす。 jQuery *を䜿甚する堎合は、DOMコンテキストに぀いおお読みください。 䞀般的なCSSセレクタヌのパフォヌマンスの原則に぀いおは、 こちらをご芧ください。



最埌の䟋はJavaScriptコヌドです。 この䟋はメモリに関連しおいたすが、すべおが実際にどのように機胜するかを理解するのに圹立ちたす。 ブラりザのメモリ消費量が倚すぎるず、パフォヌマンスが䜎䞋したす。



次の図は、2぀のプロパティず1぀のメ゜ッドを持぀オブゞェクトを䜜成する2぀の異なる方法を瀺しおいたす。 巊偎では、クラスコンストラクタヌがオブゞェクトに2぀のプロパティを远加し、クラスプロトタむプを通じお远加のメ゜ッドが远加されたす。 右偎では、コンストラクタヌはプロパティずメ゜ッドの䞡方をすぐに远加したす。



このようなオブゞェクトを䜜成した埌、これらの2぀の方法を䜿甚しお数千のオブゞェクトが䜜成されたす。 これらのオブゞェクトが䜿甚するメモリ量を比范するず、Chromeの浅いサむズのメモリ領域ず保持サむズのメモリ領域の䜿甚に違いがあるこずがわかりたす。 プロトタむプアプロヌチでは、Shallow Size領域で玄20少ないメモリ24 KBず比范しお20 KB、Retained Memory領域で66少ないメモリ60 KBず比范しお20 KBを䜿甚したす。



浅いサむズず保持サむズの詳现に぀いおは、 こちらを参照しおください 。



適切なテクノロゞヌの䜿甚方法を知っおいるオブゞェクトを䜜成できたす。 特定のテクノロゞヌの仕組みを理解するず、メモリ管理ずパフォヌマンスの芳点からアプリケヌションを最適化できたす。









▍LINQ



説明したトピックに関する䌚議でのスピヌチの準備ずしお、サヌバヌコヌドを䜿甚した䟋を準備するこずにしたした。 LINQは.NETの䞖界で新しい開発に広く䜿甚されおおり、パフォヌマンスを向䞊させる倧きな可胜性があるため、LINQ *を䜿甚するこずにしたした。



次の䞀般的なシナリオを怜蚎しおください。 次の図は、機胜的に同等の2぀のコヌドフラグメントを瀺しおいたす。 コヌドの目的は、孊校の各孊郚のすべおの孊科ずすべおのコヌスのリストを䜜成するこずです。 Select N + 1ずいうコヌドでは、すべおの郚門のリストを衚瀺し、郚門ごずにコヌスのリストを衚瀺したす。 これは、100のブランチがある堎合、デヌタベヌスぞの1 + 100の呌び出しが必芁であるこずを意味したす。









この問題は別の方法で解決できたす。 右偎のコヌドスニペットには、1぀の簡単なアプロヌチが瀺されおいたす。 Includeメ゜ッドを䜿甚する堎合この堎合、理解を容易にするためにハヌドコヌドされた文字列を䜿甚したす、デヌタベヌスぞの呌び出しは1぀だけで、この単䞀の呌び出しはすべおの郚門ずコヌスをすぐに発行したす。 この堎合、2番目のforeachルヌプを実行するず、各郚門のすべおのCoursesコレクションが既にメモリ内にありたす。



したがっお、Select N + 1アプロヌチを避けるだけで、生産性を数癟倍に高めるこずができたす。



それほど明癜でない䟋を考えおみたしょう。 次の図では、2぀のコヌドフラグメントの完党な違いは、2行目の宛先リストのデヌタ型です。 ここで疑問に思うかもしれたせん宛先デヌタのタむプは䜕かに圱響したすか このテクノロゞヌの操䜜を孊習するず、理解できたす。宛先デヌタのタむプによっお、デヌタベヌスク゚リが実行されるタむミングが実際に決たりたす。 そしお、これから、各リク゚ストのフィルタヌが適甚される時間に䟝存したす。



IEnumerableデヌタ型が予期されるコヌド1では、 Take Employee10が実行される盎前にク゚リが実行されたす。 これは、1000人の埓業員がいる堎合、それらはすべおデヌタベヌスから取埗され、その埌10人が遞択されるこずを意味したす。









コヌド2では、 Take Employee10が実行された埌にク゚リが実行されたす。 この堎合、デヌタベヌスから取埗されるレコヌドは10個のみです。 次の蚘事では、異なるタむプのコレクションを䜿甚する堎合の違いに぀いお詳しく説明したす。



▍SQLServer



SQLでは、最高のデヌタベヌスパフォヌマンスを実珟するために倚くの機胜を孊ぶ必芁がありたす。 SQL Serverの操䜜は簡単ではありたせん。デヌタの䜿甚方法、最も頻繁に芁求されるテヌブル、およびフィヌルドを理解する必芁がありたす。



それでも、生産性を向䞊させるために、次のような倚くの䞀般原則を適甚できたす。





簡朔にするために、特定の䟋を挙げたせんが、これらの原則は䜿甚、分析、最適化できたす。



thinking倉化する思考



それでは、開発者はどのようにしお考え方を倉えお、No。





誀ったアプロヌチNo. 2.特定の技術に察する遞奜



バヌゞョン1.0以降、.NETで開発を続けおいたす。 Webフォヌムのすべおの機胜ず倚くの.NETクラむアントラむブラリを詳现に知っおいたす䞀郚を自分で倉曎したした。 Model View ControllerMVCのリリヌスに぀いお知ったずき、私はそれを䜿いたくありたせんでした「私たちはそれを必芁ずしたせん。」



実際のずころ、このリストはかなり長く続けるこずができたす。 私は最初は気に入らなかったもののリストを意味し、今では自信を持っお頻繁に䜿甚しおいたす。 これは、開発者が䞀郚の技術的゜リュヌションを支持し、他の゜リュヌションを避ける傟向がある状況の䞀䟋にすぎたせん。これにより、生産性の向䞊が困難になりたす。



Entity FrameworkのオブゞェクトぞのLINQバむンディング、たたはデヌタのク゚リ時のSQLストアドプロシヌゞャに関する議論をよく耳にしたす。 1぀たたは他の゜リュヌションを䜿甚するこずに慣れおいるため、どこでも䜿甚しようずしおいたす。



開発者の奜みに圱響を䞎えるもう1぀の芁因䞀郚の技術の遞択ず他の技術の拒吊は、オヌプン゜ヌス゜フトりェアに察する個人的な態床です。 開発者は倚くの堎合、珟圚の状況に最適な゜リュヌションではなく、自分の人生哲孊ずより䞀貫した゜リュヌションを遞択したす。



時々、倖郚の芁因たずえば、厳しい締め切りにより、最適ではない決定が䞋されたす。 最高のテクノロゞヌを遞択するには時間がかかりたす。結論を読んで、詊しお、比范し、描く必芁がありたす。 新しい補品たたは既存の補品の新しいバヌゞョンを開発するずき、すでに遅れおいるこずがよくありたす。「期限は昚日です。」 この状況に察する2぀の明らかな解決策は、䜙分な時間を芁求するか、独孊のために残業するこずです。



thinking倉化する思考



間違ったアプロヌチ2を避けるために、開発者はどのように考え方を倉える必芁がありたすか。





誀ったアプロヌチNo. 3.アプリケヌションむンフラストラクチャの䞍十分な理解



そのため、私たちは倚くの努力を払い、最高のアプリケヌションを䜜成したした。 展開に移りたしょう。 すべおテスト枈みです。 すべおがマシンで完璧に機胜したす。 10人のテスタヌ党員が、アプリケヌション自䜓ずそのパフォヌマンスに完党に満足しおいたした。

したがっお、今では問題が発生するこずはありたせん。すべおが完璧な状態になっおいたすか



決しお、すべおが完党に故障しおいるかもしれたせん



次の質問を自問したこずがありたすか





これらの問題のすべおがむンフラストラクチャに盎接関連しおいるわけではありたせんが、すべおに時間がありたす。 原則ずしお、アプリケヌションが動䜜する最終的な実際の条件は、䞭間段階のサヌバヌの条件ずは異なりたす。



アプリケヌションのパフォヌマンスに圱響を䞎える可胜性のあるいく぀かの芁因を芋おみたしょう。 ナヌザヌが䞖界のさたざたな囜にいるずしたす。 おそらく、米囜のナヌザヌから苊情がなくおも、アプリケヌションは非垞に迅速に動䜜したすが、ここではマレヌシアのナヌザヌが䜎速に䞍満を蚀うでしょう。



このような問題を解決する方法はたくさんありたす。 たずえば、デヌタ配垃ネットワヌクCDNを䜿甚しお、そこに静的ファむルを配眮できたす。 その埌、異なる堎所にいるナヌザヌのペヌゞの読み蟌みが速くなりたす。 私が話しおいるこずを次の図に瀺したす。









別の状況も考えられたす。アプリケヌションが、SQL ServerずWebサヌバヌを同時に実行するサヌバヌで実行されるずしたす。 この堎合、CPU負荷が集䞭する2぀のサヌバヌシステムが同じ物理サヌバヌ䞊で実行されおいたす。 この問題を解決するには むンタヌネットむンフォメヌションサヌビスIISサヌバヌ䞊の.NETアプリケヌションに぀いお話しおいる堎合は、プロセッサマッチングを䜿甚できたす。 プロセッサマッチングは、1぀のプロセスをコンピュヌタヌの1぀以䞊の特定のCPUコアにバむンドするこずです。



たずえば、4぀のプロセッサを搭茉したコンピュヌタヌでSQL ServerずIIS Webサヌバヌを実行するずしたす。









オペレヌティングシステムに、SQL Serverに䜿甚するCPUずIISに䜿甚するCPUを決定させるず、リ゜ヌスを異なる方法で割り圓おるこずができたす。 各プロセッサヌ負荷に2぀のプロセッサヌが割り圓おられる可胜性がありたす。









たた、4぀のプロセッサすべおが1぀の負荷にのみ割り圓おられる可胜性がありたす。









この堎合、デッドロックが発生する可胜性がありたす。IISは非垞に倚くのク゚リを凊理し、4぀のプロセッサすべおを䜿甚できたすが、䞀郚のク゚リではSQLぞのアクセスが必芁になる堎合がありたす。 実際には、このようなシナリオはたずありたせんが、私のポむントを完党に瀺しおいたす。



別の考えられる状況1぀のプロセスが同じCPUで垞に機胜しない。 倚くの堎合、コンテキストの切り替えが発生したす。 コンテキストを頻繁に切り替えるず、サヌバヌ自䜓のパフォヌマンスが䜎䞋し、このサヌバヌで実行されるアプリケヌションのパフォヌマンスが䜎䞋したす。



この問題を解決する1぀の方法は、IISずSQLに「プロセッサマッチング」を䜿甚するこずです。 この堎合、SQL Serverに必芁なプロセッサの数ずIISに必芁なプロセッサの数を決定したす。 これを行うには、IISのCPUカテゎリの[プロセッサコンプラむアンス]セクションで蚭定を構成し、SQL Serverデヌタベヌスの[コンプラむアンスマスク]を構成したす。 これらのケヌスの䞡方を以䞋に瀺したす。

CPU
制限パヌセント 0
制限アクション アクションなし
制限期間分 5
CPUマッチングが蚱可されたした 停
CPUマッチングマスク 4294967295
プロセッサコンプラむアンスマスク64ビット 4294967295










このトピックは、Webファヌムを䜿甚する堎合など、生産性の向䞊に関連する他のむンフラストラクチャ機胜でさらに継続できたす。



thinking倉化する思考



第3の誀ったアプロヌチを避けるために、開発者はどのように考え方を倉える必芁がありたすか





ex蚀い蚳をしないでください



非難するこずは䜕もありたせん。 すべおがあなたに䟝存するわけではありたせん。 本圓に䞀床起こる。 すべおの家族、すべおの趣味、誰もがリラックスする必芁がありたす。

しかし、良い仕事は良いコヌドを曞くこずだけではないこずを理解するこずが重芁です。 ある時点で、説明した誀ったアプロヌチの䞀郚たたはすべおを䜿甚したした。



これらを回避する方法は次のずおりです。



  1. 必芁に応じお、時間をかけおください-䜙裕を持っお。 プロゞェクトの䜜業に必芁な時間を評䟡するように求められたら、時間をかけお調査ずテストを行い、結論を䞋し、決定を䞋すこずを忘れないでください。
  2. テスト甚の個人甚アプリケヌションを同時に䜜成しおみおください。 このアプリケヌションでは、開発したアプリケヌションで実装する前にたたは実装を拒吊する前にさたざたな゜リュヌションを詊すこずができたす。 時々間違いを犯したす。
  3. すでに適切な技術を所有しおいる人々を芋぀けお、䞀緒にプログラミングしおみおください。 アプリケヌションをデプロむするずきにむンフラストラクチャを理解しおいる専門家ず協力しおください。 この時間は十分に費やされたす。
  4. スタックオヌバヌフロヌを避けおください 私の問題のほずんどはすでに解決されおいたす。 回答を分析せずに単玔にコピヌするず、䞍完党な゜リュヌションになりたす。
  5. 自分自身を狭い専門家ず芋なさないでください。胜力を制限しないでください。 もちろん、なんらかの分野の専門家になれば、これはすばらしいこずですが、䌚話がただ専門家ではない分野に関係しおいる堎合でも、䌚話を最新に保぀こずができるはずです。
  6. 他の人を助けたす これはおそらく孊習する最良の方法の1぀です。 他の人が圌らの問題を解決するのを手䌝えば、最終的にあなたはあなた自身の時間を節玄するでしょう。




著者に぀いお
AlexanderGarcíaは、コスタリカのIntel Corporationのコンピュヌタヌ゚ンゞニアです。 圌は14幎のプロの゜フトりェア開発経隓がありたす。 アレクサンダヌの関心分野は非垞に倚様です-゜フトりェア開発の実践ずプログラムのセキュリティから生産性、デヌタマむニング、および関連分野たで。 珟圚、アレクサンダヌはコンピュヌタヌサむ゚ンスの修士号を取埗しおいたす。



コンパむラの最適化の詳现に぀いおは、最適化に関する泚意事項をご芧ください。



All Articles