都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

.NET アプリケーションの高速化について探し始めてみた - その9 - ( MPGO )

 MPGO とは、Managed Profile-Guided Optimaization の略です。Visual Studio 2012 と CLR 4.5 で導入されたツールです。実行中のアプリケーションの状態をプロファイリング、情報を生成し、その情報をアセンブリに埋め込みます。Ngen はこのプロファイリング情報を使用してアセンブリのパフォーマンスを最適化します。

ネイティブ イメージの最適化: いくつかのリリースでは、ネイティブ イメージの生成 (NGen: Native Image Generation) というツールを使用して、コードをネイティブ イメージにプリコンパイルできます。プリコンパイルされたネイティブ イメージは、通常、JIT コンパイルを使用するよりもアプリケーションの起動が大幅に速くなります。今回のリリースでは、ネイティブ イメージのレイアウトを最適化し、さらにパフォーマンスを向上できる Managed Profile Guided Optimization (MPGO) という補助ツールを導入しています。MPGO は、概念的には先ほど説明したマルチコア JIT と非常によく似た、プロファイルによるガイド付き最適化テクノロジを使用します。アプリケーションのプロファイル データには、代表的なシナリオまたは一連のシナリオが含まれています。これらのシナリオを使用すると、ネイティブ イメージのレイアウトを再変更することで、起動時に必要なメソッドとその他のデータ構造をネイティブ イメージの一部に集中的に配置できます。これにより、起動時間が短縮され、ワーキング セット (アプリケーションのメモリ使用量) が減少します。社内のテストやエクスペリエンスでは、MPGO によってメリットを得られるのは、通常、大規模マネージ アプリケーション (大規模 GUI アプリケーションなど) であることが確認されました。そのため、大規模マネージ アプリケーションでは MPGO を使用することをお勧めします。

MPGO ツールは、中間言語 (IL) DLL のプロファイル データを生成し、そのプロファイルをリソースとして IL DLL に追加します。NGen ツールを使用してプロファイリング後に IL DLL をプリコンパイルすると、プロファイル データが存在するため、NGen ツール によりさらなる最適化が行われます。このプロセス フローを図 1 に示します。

 
図 1 MPGO ツールを使用したプロセス フロー

 こんなものがあったんですね。下記のようなコマンドで実行可能です。MyTax.exe に参照設定してある、Mytax.dll, MyTaxUtil2011.dll を 15秒プロファイルし、最適化したアセンブリを C:/ Optimaized に格納するといったところでしょうか?

mpgo –scenario "C:\MyApp\MyTax.exe /params par" –AssemblyList Mytax.dll MyTaxUtil2011.dll –OutDir C:\Optimized –TimeOut 15

 あれ、制限ありますね。Windows フォームアプリとか、デスクトップ向けなのでしょうか?少し残念です。

Ngen.exeとMpgo.exeは、ASP.NETアプリケーションとWindows Communication Foundation (WCF)サービスは推奨されません。 Mpgo.exeは Windows ストア のappsをサポートしていません。

 試してみる価値はあるのでしょうか?