2009-07-28 1 views
1

基本的にファイルに対して実行する定義済みのタスクを選択する「プリントエンジン」があり、これらの「タスク」は.NET 2.0〜3.5(C#の)コマンドラインアプリケーションです。.NETベースのアプリケーションをこのように実行することはできますか?

これはすべて内部的に開発されていないアプリケーションと順番に実行されますが、それらは非常に迅速に実行され、通常は10〜30msです。

しかし、私たちの.NETアプリケーションは通常1〜3秒かかるので、ファイルごとにいくつかの実行ファイルといくつかのファイルを処理すると、すべてが同期的に実行されるため、実際には長い待ち時間になります。

これらのアプリケーションは、通常、データベース作業と非常に基本的なファイルの変更(プレーンテキストの処理)を行っています。それだけでダウンし、すべてを減速された.NET Frameworkのオーバーヘッドと、それだけで

」.NETはちょうど遅いと結論しているに見えた誰だった場合私たちも見るためにいくつかのアプリケーションをストリップダウンしていますこの方法で を実行することはできません。

私は、これが真実であり、問​​題を追跡したり、遅れを緩和するためにどのような技術を使用できるのだろうと思っていました。私はプロファイラーを使用しようとしましたが、今のところ私たちはコマンドライン.NETアプリケーションを繰り返し実行するものは見ていません。ほとんどの場合、実行可能ファイルを一度実行してプロファイルに追加するだけです。

理想的には、プリントエンジンの使用を完全に廃止し、独自のより効率的なエンジンを開発したいと考えていますが、それは起こりそうもありません。

+0

ちょうどfyi(ポストを編集してバンプを発生させたくありませんでした)、私はこれに関するパフォーマンステストを行い、時間がたつと実数とスニペットで質問を更新します。私はそれについて忘れていません:) –

答えて

7

通常、これらのアプリケーションは、あなたが行くあり

データベース作業を少し行っています。パッケージ化されたネイティブアプリケーションは、データベースと通信していない可能性があります。それだけでも簡単に1回の短いクエリで10〜30ミリ秒かかることがあります。

また、.NETにはアプリケーションドメインを確立するために追加のオーバーヘッドが必要です。小さなアプリケーションのいくつかをより小さなものにまとめることができれば、あるいは複数のタスクを一度に実行するようにコマンドラインパラメータを使用することができれば、よりうまくいくかもしれません。

3

.NETの減速のほとんどは、アセンブリの読み込みとJITのコンパイルに関連しています。

複数のタスクをコマンドラインに組み込むことができれば、それはもっと速く実行されます。毎回、各アセンブリとそのすべてのリソースを動的にロードしてコンパイルする単一のタスクに対して、コマンドラインアプリケーションを何度も繰り返し実行することを忘れないでください。

さらに、NGENを使用してアセンブリ/アセンブリのプリコンパイル済みイメージを作成すると、起動時間が大幅に短縮されます。

+1

jitはマシンごとに1回しか起こりません。これらは頻繁に実行されるので、ngenが助けてくれるのではないかと疑いがあります。マシン固有の最適化を使用しなくなるため、ngenの速度が遅くなることさえあります。 –

+0

その情報をありがとうJoel! –

+0

アセンブリがNGENされていない限り、メソッドが最初に呼び出されるたびにJITが実行されます。同じアプリケーションを再起動すると、同じメソッドが再度JITされます。 –

3

本質的に、それは遅くはありませんが、どの操作も最も遅い手順と同じくらい速いです。何かを始めるにはオブジェクトの初期化などがありますが、それほど遅くはありません。だから、空のプログラムのパフォーマンスの数字はどうでしたか?それが数秒かかる場合、私は本当に何が起こっているのだろうかと思います。

+0

空のアプリケーションで最初に測定するための –

+1

+1の下に実際に行きたいので、具体的な数値とコードスニペットをフォローアップします。これはオーバーヘッドが本当にあるかどうかを示します。ネットの「オーバーヘッド」(これは私が疑う)... – jeroenh

1

".net apps are slow"のようなブランケットステートメントを作成するのは難しいです。いくつかのJITの問題があるかもしれませんが、それらをプリコンパイルすると、それを取り除くことができます。アプリが何をしているのか見てみましょう。彼らがデータベースと対話している場合は、接続を確立するために2番目または2番目を期待し、クエリを実行し、それとsomethignを実行し、終了します。

データベース接続とクエリの待ち時間の外で、アプリケーションを実際に微調整すると、ネイティブにコンパイルされたアプリケーションは、.netアプリケーションやJavaアプリケーションやスクリプトよりも高速に実行される傾向があります。ネイティブにコンパイルされたアプリは効率的にコード化されていることが&に最適化されています。

1

これらのタスクをプリントエンジンから呼び出す方法を変更します。コマンドラインから/プロセスを作成しているようですね。このような場合は、プリントエンジンを起動してアプリケーションドメインにロードし、Mainメソッドを関連する直径で呼び出すことができます。これは、JITと負荷時間を大幅に削減します。

+0

興味深いので、まだコマンドラインアプリを持っているだろうが、アプリドメインにすでにロードされているものを呼び出すだけだろうか? –

+0

はい、.netアセンブリ(exeまたはdll)をアプリドメインに読み込むことができます。リフレクションを介してメソッドにアクセスできるので、正しい文字列パラメータでMainメソッドを呼び出すことができます。 –

+0

あなたは新しいスレッドでmainメソッドを実行したいと思うでしょう。そうしないと、スレッドプールからおそらくエンジンがシングルタスクになるでしょう。 –

関連する問題