こんばんは、Ngenについて勉強中のmeitanteiです。
最近の僕のお仕事はもっぱら.NETを使用したアプリの開発となっている。
おそらく腕が悪いので、毎回レスポンスに難があり、こっそり陰で泣いている。
「使いやすい!」と思われるためには高速なレスポンスが不可欠。
いつもこんな風に頭を悩ませている↓
レスポンス、パフォーマンスの問題はシステム開発で避けては通れない。
— meitantei👻 (@kimiHaMeitantei) 2021年4月23日
大抵はリリース後に問題視される、はよ言え。
ロジックの見直し、フレームワークの修正を余儀なくされるため、影響がでかい。まあバグる。
バグる。
バグる。#ブログ初心者と繋がりたい #駆け出しエンジニアと繋がりたい
.NETで作ったアプリが遅いよ~><という方は本記事をチェキラ
.NET素人は以下の記事もチェキ。
Ngen導入の経緯
サードパーティ製品と組み合わせて.NETを使用したアプリを作ってみたが初回起動が遅い。
いくらなんでも遅すぎる。画面によっては30秒近く待たされる。
ロジックの見直し、SQLのチューニング等で5秒ほど改善したがまだ遅い。
藁にも縋る思いでNgen.exeに頼った。
Ngen(ネイティブイメージジェネレーター)とは?
その名の通り、ネイティブイメージをジェネレートするもの。(説明下手
前提知識として、exeは以下の感じで動いている。(かなりざっくり)
①.NETのソースコードをビルドしてexeファイルを生成。
→この時、exeファイルは共通中間言語(MSIL)でコンパイルされている。
②exe実行時に共通中間言語(MSIL)をJITコンパイラがネイティブ・コードに変換。
今回やりたいことはNgen.exeを使用して、②のタイミングで行っているコンパイルを事前に行い、ネイティブ・コードをあらかじめアセンブリに覚えておく。
つまり「exeを起動したときにやってる処理を事前にやっといて処理時間を減らそう!」という先ヅモ的なツールだ。
Ngenはどこにあるのか?
作ったexeのターゲットプラットフォームに合わせて、32/64を使いましょう。(急な先生感)
<32bit版> C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe
<64bit版> C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe
Ngenの使い方
至ってシンプルで素人にも助かる。俺はプロやけど。
コマンドプロンプトで以下のコマンドを叩いてやれば実行できる。
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe install notepad.exe
※notepad.exeの部分はngenしたいexe名に変えてね。
Ngenがクリアされるタイミングがある?
俺の経験上、以下の3つのタイミングでクリアされていた。
他にもあるかもしれんので詳しい方は教えて。
①Windows更新(大幅なやつ)した後
②exeを上書きした後
③exeを移動した後
少なからずクリアされるタイミングがあるので、運用上は使いにくいのが正直なところ。
今回はWindows更新を検知して、全てのexeにngenを実行する仕組みで構築した。
まとめ
Ngen.exeを使ったら、パフォーマンス改善が出来た。ユーザーも大喜び。
ケースによってはできないこともあるらしいが、そん時はそん時だ。
システム開発は一難去ってまた一難を永久に繰り返す仕事なので、辛いこともあるがひたむきに頑張ろ。
ではごきげんよう。
[.NET Framework]バージョンの確認をしよう
[.NET Framework]pdbファイルを簡単に解説