.Net Compact Framework アプリケーションを Windows CE デバイスの SD カードに移動すると、プログラムの実行速度が内部メモリからの実行より遅くなります。
起動が遅くなるかと思いましたが、プログラム全体です。ストレージ カードへの IO はありません。
アプリケーションが非常に遅いのはなぜですか? また、コンパクト フレームワークはアセンブリをどのように処理して読み込むのですか?
.Net Compact Framework アプリケーションを Windows CE デバイスの SD カードに移動すると、プログラムの実行速度が内部メモリからの実行より遅くなります。
起動が遅くなるかと思いましたが、プログラム全体です。ストレージ カードへの IO はありません。
アプリケーションが非常に遅いのはなぜですか? また、コンパクト フレームワークはアセンブリをどのように処理して読み込むのですか?
それはデマンドページングと関係があります。SDは実行可能メディアではないため、アプリをSDカードから直接実行することはできません。そのため、実行するにはRAMにプルする必要があります。通常、Windows CEには大量のRAMが搭載されていないため、ローダーがアプリケーション全体をRAMにプルして実行することはありません。確かに、ヒープとスタックはRAMにありますが、アセンブリ自体の実際のILコードは必要に応じてページインされます。また、特定のページが不要になったとシステムが判断したときにもページアウトされます。
このページングはパフォーマンスに影響を与える可能性がありますが、アプリ自体が本当に大きくない限り(アセンブリから取得する埋め込みリソースがたくさんある場合など)、大きな影響があることに少し驚いています。
ctackeによる以前の「デマンドページング」の回答に同意します。
解決策として、実際の実行可能ファイルと DLL をカードからハードディスクにコピーする SD カードからローダ プログラムを実行し、ローダからプログラムを実行する方法があります。以降の実行では、ローダーはハードディスクのバージョンが最新かどうかを検出し、最新の場合は直接起動します。ハードディスクのバージョンが最新でない場合、ローダーは古いファイルをカードから再度コピーしてから、実際のプログラムを実行します。
以前、ネットワークのリモート ロケーションにロードされたプログラムからこれを行ったことがありますが、非常にうまく機能しました。