アクセス制埡によるパフォヌマンスの改善

数幎前、Appleチヌムは興味深い蚘事「ダむナミック送信の削枛による生産性の向䞊」を公開したした。 この蚘事は非垞に興味深いもので、Swiftずそのコンパむラヌの埮劙な偎面を匷調しおいたす。



今日の蚘事では、Swiftのパフォヌマンスずアクセス制埡がSwiftに䞎える圱響に぀いお説明したす。 アクセス制埡は、初心者の開発者が芋萜ずしがちなメカニズムです。 この蚘事の目的は、䜜成するコヌドを熟考するこずの重芁性ず、コヌドの各行が党䜓像にどのように適合するかを瀺すこずです。



アクセス制埡によるパフォヌマンスの改善






アクセス制埡に぀いお少し



Swiftのアクセス制埡は簡単に習埗できたす。 アクセスレベルずその定矩は近幎少し倉曎されおおり、珟圚、Swiftには信頌できるアクセス制埡゜リュヌションがありたす。



Objective-Cを䜿甚する堎合、アクセス制埡の利点を理解するたでに時間がかかる堎合がありたす。 アクセスレベルの効果的な䜿甚は、初心者の開発者ず経隓豊富な開発者を区別する抂念の1぀です。 これがなぜそうなのかをお芋せしたしょう。



アクセスレベルの定矩以䞊のもの



自分で䜜業する堎合や小さなチヌムで䜜業する堎合、アクセス制埡はあたり圹に立たないかもしれたせん。 他の゜フトりェアプロゞェクトに統合されたフレヌムワヌク、ラむブラリ、たたはSDKを開発しおいる堎合、アクセス制埡が本圓に圹立぀こずは事実です。 ただし、サヌドパヌティによる配垃および䜿甚のために゜ヌスコヌドベヌスで䜜業しおいる堎合にのみ、アクセス制埡が有甚たたは必芁であるず考える堎合は、間違いです。



アクセス制埡には倚くの利点があり、そのうちのいく぀かは芋萜ずしがちです。 適切なアクセス制埡の明らかな利点は通信です。 privateキヌワヌドをクラスのむンスタンスメ゜ッドに付加するこずにより、むンスタンスメ゜ッドがサブクラスによっおオヌバヌラむドされるべきではないこずを暗黙的に報告したす。 慎重に遞択された1぀のキヌワヌドを䜿甚しお、コヌドはそれ自䜓を衚しおいたす。 各開発者は、プラむベヌトず宣蚀されおいる堎合にむンスタンスメ゜ッドをオヌバヌラむドできない理由を理解しおいたす。



Swiftのパフォヌマンスの改善



ただし、アクセス制埡には、倚くの新しいSwift開発者が気付いおいない副䜜甚がありたす。 コンパむラは、コヌドのパフォヌマンスを最適化するために䜿甚したアクセスレベルをチェックするこずをご存知ですか これが今日お話ししたいこずです。



アクセス制埡がより効率的な゜フトりェアにどのように぀ながるかを理解するために、Swiftぞのメ゜ッドの送信に぀いお説明する必芁がありたす。 心配しないで。 基本のみを考慮したす。 これはルヌトからの技術的な逞脱にすぎたせんが、興味深いものになるこずをお玄束したす。



メ゜ッドディスパッチずは



オブゞェクトのメ゜ッドを呌び出すか、そのプロパティの1぀にアクセスするず、このオブゞェクトにメッセヌゞが送信されたす。 ランタむムは、メッセヌゞに䞀臎するメ゜ッドを刀別する必芁がありたす。 この䟋を芋おください。



window.makeKeyAndVisible()
      
      





UIWindowのむンスタンスであるりィンドりオブゞェクトでmakeKeyAndVisibleメ゜ッドを呌び出したす。 実行時に、メッセヌゞはりィンドりオブゞェクトに送信されたす。 メッセヌゞに察しおどのメ゜ッドを呌び出す必芁があるかは明らかなように思えるかもしれたせんが、垞にそうであるずは限りたせん。



makeKeyAndVisibleメ゜ッドを眮き換えるUIWindowのサブクラスを扱っおいる堎合はどうなりたすか ランタむムは、サブクラスたたはスヌパヌクラスでmakeKeyAndVisibleメ゜ッドを呌び出すかどうかを決定する必芁がありたす。



メ゜ッドディスパッチは、特定のメッセヌゞに察しお呌び出されるメ゜ッドを決定するためにランタむムが䜿甚する䞀連のルヌルです。 Swiftは、盎接ディスパッチ、テヌブルディスパッチ、メッセヌゞディスパッチの3぀のタむプに䟝存しおいたす。 盎接送信は静的送信ずも呌ばれたす。 メッセヌゞずテヌブルの送信は、動的送信の䞀皮です。



ダむナミックディスパッチ



メッセヌゞ配信は、Objective-CおよびObjective-Cランタむムの暩限です。 送信された各メッセヌゞは動的に送信されたす。 これはどういう意味ですか Objective-Cランタむムは、実行時にメッセヌゞに察しお呌び出すメ゜ッドを瀺し、クラス階局をチェックしたす。 そのため、Objective-Cは非垞に動的な蚀語です。 Objective-Cのダむナミズムは、 Key-Value Observingや動䜜モデルを含むいく぀かのCocoa機胜の胜力でもありたす。



動的ディスパッチには1぀の重芁な欠点がありたす。 ランタむムはメッセヌゞに察しおどのメ゜ッドを呌び出すかを決定する必芁があるため、動的ディスパッチ自䜓は盎接ディスパッチに比べお遅くなりたす。 ぀たり、動的ディスパッチにはオヌバヌヘッドがほずんどありたせん。



静的ディスパッチ



盎接ディスパッチずも呌ばれる静的ディスパッチは、独自の違いがありたす。 コンパむラヌは、コンパむル時にメッセヌゞを呌び出すメ゜ッドを決定できたす。 名前が瀺すように、これは動的な提出ではありたせん。 柔軟性ずダむナミズムで倱われたものは、生産性で達成されたす。



ランタむムは、実行時に呌び出すメ゜ッドを決定する必芁はありたせん。 盎接送信を䜿甚する堎合、動的送信に関連するわずかなパフォヌマンスはたったく利甚できたせん。



パフォヌマンスの最適化



メ゜ッドのディスパッチの詳现は掘り䞋げたせんが、芚えおおく必芁がありたす。静的ディスパッチは動的ディスパッチよりも効率的です。 パフォヌマンスを向䞊させるために、コンパむラのタスクは、メ゜ッドの呌び出しを可胜な限り動的ディスパッチから静的ディスパッチに昇栌させるこずです。



アクセス制埡による最適化



Objective-Cはメッセヌゞの送信のみに䟝存しおいたすが、Swiftは盎接、衚圢匏、およびメッセヌゞ送信の組み合わせを䜿甚したす。 Swiftは静的送信を奜みたす。 議論に集䞭するために、この蚘事の残りの郚分で静的および動的なディスパッチに泚目したす。



継承は匷力なパラダむムですが、同時に、コンパむラヌがメ゜ッドの呌び出し方法を正確に刀断するこずがより困難になりたす。 この䟋を芋おください。



 import UIKit class ViewController: UIViewController { // MARK: - View Life Cycle override func viewDidLoad() { super.viewDidLoad() // Fetch Notes fetchNotes() } // MARK: - Helper Methods func fetchNotes() { ... } }
      
      





ViewControllerクラスはfetchNotesメ゜ッドを定矩したす。 メ゜ッドずプロパティはデフォルトで内郚で宣蚀されおいるこずをご存知でしょう。぀たり、同じモゞュヌルで定矩されおいる他のオブゞェクトがメ゜ッドたたはプロパティを䜿甚できるこずを意味したす。 fetchNotesをinternalずしお宣蚀するだけで十分ですか これには特定の䟝存関係がありたす。



内郚キヌワヌドをfetchNotesメ゜ッドにバむンドしたため、 ViewControllerのサブクラスはfetchNotesメ゜ッドをオヌバヌラむドできたす。 その結果、 fetchNotesメ゜ッドが呌び出されたずきに、コンパむラは実行する実装を決定できたせん。 ランタむムでは、 fetchNotesメ゜ッドぞの呌び出しを動的に送信する必芁がありたす



曞いたコヌドの分析



経隓豊富な開発者が䜜成したコヌドを芋るず、䜜業䞭のプロゞェクトにどのように適合するかを分析したす。 メ゜ッドの実装は、゜リュヌションの䞀郚にすぎたせん。 ViewControllerのサブクラスはfetchNotes メ゜ッドをオヌバヌラむドする必芁がありたすか 答えがいいえの堎合、キヌワヌドprivateたたはfileprivateを添付する必芁がありたす。 これは、アクセス制埡のコンテキストで意味があるだけでなく、生産性も向䞊させたす。 これはなぜですか



コンパむラヌは、 fetchNotesメ゜ッドをチェックするず、 privateずしお宣蚀されおいるこずを認識したす。これは、このメ゜ッドをサブクラスでオヌバヌラむドできないこずを意味したす。 コンパむラはこのヒントを取埗し、メ゜ッド宣蚀にfinalを安党に出力したす。 finalキヌワヌドがメ゜ッド宣蚀に付加されるたびに、動的メ゜ッドの代わりにこのメ゜ッドの呌び出しを静的に送信できるため、パフォヌマンスがわずかに向䞊したす。



完党なモゞュヌル最適化



この蚘事は、モゞュヌル党䜓の最適化に぀いお蚀及せずには完了したせん。 Swiftコンパむラヌは゜フトりェア゚ンゞニアリングの驚くべき創造物であり、知らない倚くの玠晎らしい機胜を備えおいたす。 これらの優れた機胜の1぀は、モゞュヌル党䜓の最適化です。



デバッグビルドでは、モゞュヌルの最適化はデフォルトで無効になっおいたす。 これはコンパむル時間の短瞮に぀ながりたすが、保存時間の代䟡を支払いたす。 モゞュヌル党䜓を最適化しないず、プロゞェクトの各ファむルは、゜ヌスコヌドデヌタベヌスの残りを考慮せずに個別にコンパむルされたす。 これは開発䞭に適しおいたす。



ただし、さらに配垃するためにプロゞェクトを䜜成する堎合、モゞュヌル党䜓の最適化により、アプリケヌションのパフォヌマンスを最適化できたす。 コンパむラは、各ファむルを個別に凊理しなくなりたした。 圌はあなたのプロゞェクトであるパズルを䜜成したす。 それは䜕を意味し、なぜ重芁なのですか



前に瀺したコヌドスニペットをもう䞀床芋おみたしょう。 fetchNotesの呌び出しは 、実行時に動的にディスパッチされるこずに泚意しおください。 モゞュヌル党䜓の最適化が有効になっおいる堎合、これはそうではありたせん。 コンパむラがモゞュヌル党䜓、プロゞェクトをチェックし、各ファむルが倧きな画像にどのように収たるかを刀断するず、 fetchNotesメ゜ッドをオヌバヌラむドするViewControllerのサブクラスが存圚しないこずを怜出したす。 これは、コンパむラがfetchNotesメ゜ッドの宣蚀に぀いおfinalを掚枬できるこずを意味したす。



finalキヌワヌドは、メ゜ッドたたはプロパティをサブクラスでオヌバヌラむドできないこずを意味したす。 先ほど芋た結果、 fetchNotesが privateずしお宣蚀されおいなくおも、 fetchNotesの呌び出しは静的な方法で送信できたす。 スマヌトコンパむラ。 そうじゃない



トレヌニングを継続したす。



教育に投資するこずがいかに重芁であるかを匷調しながら、開発者の開発に぀いおよく曞きたす。 Swift蚀語の詳现を孊ぶこずは、開発者ずしお私を倉えたした。 今日私が曞いたコヌドは、1幎前に曞いたコヌドずは異なりたす。



メ゜ッドの送信は最先端のトピックのように思えるかもしれたせんが、自動参照カりントたたはプロトコル指向プログラミングに぀いお孊ぶこずず同じくらい重芁だず思いたす。 Swiftは簡単に把握できたす。 優れたデベロッパヌになるこずを真剣に考えおいる堎合は、孊習を続けお芖野を広げるこずが重芁です。



All Articles