8

Windows 開発マシンで問題なく動作する ASP.NET アプリケーションがあります。ただし、サーバーはMonoを実行しているLinuxであり、アップロードされた同じコードの実行は、Windowsボックスでの実行よりも4〜5倍遅くなります(たとえば、1つのタスクで25秒対5秒かかります).

このパフォーマンスは Mono の既知の問題ですか? それについて私にできることはありますか?コードはほとんどがテキスト処理、文字列の置換、正規表現などであり、それによって違いが生じる場合があります。ローカルで VS を使用してコードのプロファイリングとデバッグを行いましたが、Mono を使用してサーバー上でリモート デバッグを実行できるかどうか、またはそれを実際に修正するために次に何をする必要があるかはわかりません。

4

5 に答える 5

6

正規表現は、Mono の特に弱い領域です。Mono の Regex クラスは常に解釈されたコードを使用しますが、.Net はそれをコンパイル済みの IL に変換できるため、実行が大幅に高速化されます。

置換のようなテキスト処理の他のほとんどの形式は、ほぼ同じはずです。

于 2011-01-21T05:38:48.777 に答える
4

できればサーバーと同様のLinuxシステムにMonoをインストールします。Monoでコードのプロファイルを作成し、ボトルネックがどこにあるかを確認します。

LinuxサーバーでApacheログファイルを追跡するMonoアプリを実行しています。私はそれをWindowsで開発し、Linuxでテストしたところ、Mono 2.4と.NET3.5では8〜10倍遅いことがわかりました。その時間のほとんどは、Regex.Match関数と文字列関数に費やされています。string.EndsWith()への4回の呼び出しでStringComparison.Ordinalを指定するだけで、Monoのプログラムの全体的な速度を2倍にすることができました。序数の文字列の比較が必要な場合は、速度が向上する可能性があります。

StringComparison.Ordinalを使用しても、string.StartsWith()はまだ低速でした。独自のバージョンのstring.StartsWith()を作成することで、プログラム全体の速度が25%向上しました。

したがって、序数の比較がアプリで行う必要がある場合は、StringComparison.Ordinalを指定するか、独自の文字列関数を作成してみてください。

于 2011-01-22T22:23:09.687 に答える
1

この学術研究によると、一部のLinuxシステムの「ハードドライブのキャッシュ/スワップスペースに移動する傾向がはるかに速い」ため、一部のLinuxディストリビューションではMonoのパフォーマンスが低下する可能性があります[Windowsと比較した場合]。

「ネイティブコードを使用している場合でも、2つのオペレーティングシステムで示される大きな違いに注意してください。アレイ内の整数が131072の場合、Fedora Core 4Test3オペレーティングシステムのパフォーマンスはWindowsのまったく同じコードの3倍以上遅くなりました。」

Linuxディストリビューションのカーネルスケジューリング構成はさまざまであるため、Linuxサーバーで実行しているOSディストリビューションとバージョン、およびアプリケーションで使用可能なメモリとCPUサイクルの量を知っておくと便利です。

于 2011-01-21T05:51:29.030 に答える
1

StringBuilder オブジェクトを使用していますか、または文字列の連結を行っていますか。多くの文字列作業を行っている場合、いくつかのパフォーマンス バグが発生します。

しかし、leppie は頭に浮かんでいると思います。Microsoft は、ASP.net をテストして IIS に統合するために多額の費用を費やしたため、非常に高速になりました。MS ボックスにお金を払いたくない場合は、Mono がオープン ソースであり、IIS がテスト済みの商用製品であるという事実に対処する必要があります。

良い例がここにあります。Microsoft は、IIS サーバーで動作するカーネル モード ライブラリを使用して Windows 自体を実際に変更しました。キャッシュを適切に使用して正しく設計されたアプリは、次のコードでパフォーマンスを大幅に向上させることができます: HTTP.sys

于 2011-01-21T05:33:55.347 に答える
1

これに mod_mono または mod_proxy を使用していますか? Mono から得られるものには制限がありますが、mod_mono を使用すると、mod_proxy よりも一般的な遅延が少なくなります。

Mono ASP.NET FAQの「mod_mono と mod_proxy」セクションを参照してください。

于 2011-01-21T05:37:49.930 に答える