アプリ起動に限ればクアントアプリは今のところx86ターゲットのほうが良いのか?
64bitOS上の.NET上で動作するプログラムの起動が遅くて我慢できないという報告を受けたので、調べた時のログです。
.NET 4.5現在では、アプリケーションの起動に限って言えば、ビルドターゲットをx86にしておいたほうが起動時間を短縮できます。起動後の動作速度を多少犠牲にしてもよいのであれば、アプリケーションのビルドターゲットをx86でビルドすることを検討してみましょう。
どこが遅いの?
とりあえず、遅いアプリをdotTraceで計測してみるとメインフォームのコンストラクター、またはInitializeComponentの呼び出しでふんづまっているようです。起動に20秒程度かかっているうち、フォームのコンストラクター呼び出しに17秒かかっていました。
顧客の情報を縦長の画面でサマリー表示していくような画面だったのでコントロールが多いのか?とも思ったんですが、グリッドが3つあるとはいえ、ラベルとテキストボックスなどのコントロール数は200前後でそこまで重くなるとは考えにくいなーと思います。
うーん、とりあえずビルドターゲットをx86にしてみる。
そういえば、前もAny CPUからx86にして、WOW64にしたほうが起動が早くなったことがあったなーと思い、なんとなくビルドターゲットをAnyCPU → x86に変更して起動してみると、全体1秒以内に起動するようになり、問題があったコンストラクター部分も0.4秒で起動してきました。
あっ、そういえば、少し前に64bit OS上だとJITのパフォーマンスが悪くなるという記事を見たような。
- マイクロソフト、.NETアプリを数倍高速化する64ビット用JITコンパイラ「RyuJIT」をテクニカルプレビューで公開。由来は「龍神」(publickey)
- 64ビット(x64)環境でWindowsアプリケーションを実行した場合、初回起動に時間がかかる(GrapeCity)
64bitでも早いPCがあるらしい
気になることとしては、.NET Framework 4.5.1がインストールされていない環境では、早いという報告もありWebを検索するとMSDNフォーラムでこんなのが見つかりました。こちらも64bit環境ではJITが遅いことがあるみたいなことが書いてありますが、.NET Framework 4.5.1の何が問題かまでは言及されていないですね。
- Framework 4.5 64 bit speed issue
WOW64って実際にどのぐらいのハンディがあるんだろう
と思ってパフォーマンス測定をしてみようかと思ったんだけれど、画面→Webサービス→DB登録みたいな流れが主な業務アプリケーションで、どの程度有効なテストが作れるか疑問だったので、今回は影響が少なそうな奴から逐次実践投入をさせてみようかと思います。
- まぁ実際のところ、Visual Studioでデバックを行うときはWOW64上で動作してるんだから、パフォーマンスに限って言えばそこまで困ったことにはならないと思うんですよね。