2017-06-19 7 views
0

テストプログラムは "HelloWorld"クラスです。
ケース1:プログラムは単独でコンパイルされます。最終的なdllコンパイルサイズは〜数バイトです。
ケース2:HelloWorld main()が参照していないクラスがあります。最終的なdllコンパイルサイズは50MBです。アプリケーションサイズは起動速度とメモリサイズに影響します

質問:両方のプロジェクトが同じであるか:
1)実行時のメモリフットプリント? (C#は、起動する前にメモリ内のDLL全体をロードする必要がありますか?)
2)起動時間(プログラムがディスクからメモリにロードされる時間)?
3)同じコンパイル速度ですか?

あなたはこれが早すぎる最適化だと言います。死んだ/到達できないコードを最適化するideはないことを理解してください。だから私は "リリース"にそれを含める必要があるかどうかを知りたい。

+0

もちろん、そうではありません。私たちはJITを持っています。 JITは、最初にアクセスしたときにアクセスしたすべての機能をコンパイルします。これは、巨大な初期化フェーズを持つアプリケーションを持っている場合、ロードする単純なアプリケーションよりも時間がかかることを意味します –

答えて

1

まあ、私はC#でのLoadLibrary

    1. 、コメントから出てくると答えを書くことにしましたが、C/C++とは異なります。 C#では、すべてのdllのメタデータが型解決などのために起動時に読み込まれます。しかし、実行時にアクセスがあるまで、すべての型はJittedされません。 (もっと知りたいのであれば、OlyDBGとWinDBGを使って、メモリフットプリントとロード時間を見ることができます)

    2. C#では、メソッドは最初のアクセス時にコンパイルされます。もちろんRuntimeHelpers.PrepareMethod関数JITにメソッドを要求するためのものですが、開発者が行うことはまれなことです)。そのため、起動時に多数のサービスを初期化する必要があるアプリケーションを使用する場合は、起動時にJIT要件が少なくても、同じサイズのアプリケーションではなく、起動に時間がかかります(https://blogs.msdn.microsoft.com/clrcodegeneration/2007/09/15/to-ngen-or-not-to-ngen/ コンパイル速度は、入力プロジェクト、最適化レベルなどのいくつかの要因です。C#では、コンパイラはすべてのコードをコンパイルします。ここでのリフレクションを使用して、アセンブリ内のすべてのコードにアクセスできます。 (http://www.c-sharpcorner.com/UploadFile/a8024d/C-Sharp-program-compliation-steps/

  • 関連する問題