8

連絡先のリストを返す単純な Web API があります。

public class ContactsApi : ApiController
{
    public List<Contact> GetContacts()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        // Doing some business to get contacts;
        watch.Stop();
        // The operation only takes less than 500 milliseconds
        // returning list of contacts
    }
}

以前Stopwatchにデータ検索のパフォーマンスをテストしたところ、1 秒もかからないことは明らかです。ただし、Chrome ブラウザ経由でアクションにリクエストを発行すると、GetContactsデータが返されるまでに 4 ~ 5 秒かかります。

ここに画像の説明を入力

どうやら、その遅延は私のデータ取得コードとは何の関係もありません。Web API の実行が遅いようです。しかし、それをデバッグしてトレースする方法がわかりません。

ASP.NET HTTP 要求プロセス パイプラインのタイミングをログに記録するユーティリティはありますか? つまり、各イベントが何時に発生したかを示すNavigation Timingのようなものでしょうか?

4

4 に答える 4

5

あなたの反応はどれくらいですか?もしかして、連載と譲渡の費用でしょうか?ただし、プロファイリングする可能性はたくさんあります。ANTS Performance ProfilerdotTraceなどの市場のツールの 1 つを使用してプロファイリングを開始します。

于 2013-11-12T06:15:03.257 に答える
2

デバッガで実行していますか?デバッガーなしでいくつかのテストを実行します。現在開発中の Web API プロジェクトで同様の問題が発生しました。デバッガーをオフにすると、テストに数秒ではなく数ミリ秒かかりました。

API を初めて呼び出すときは、起動コストもかかるようですが、後続のリクエストは常に高速です。

于 2013-11-12T12:51:29.123 に答える
0

4.5秒はかなり大きいです。EF を使用する場合は、MiniProfiler.EF を使用できます。

Entity Framework Queryable を誤って使用することで (過去に) スローダウンを経験しました (リストへの変換、展開など)。

EF を使用している場合は、可能な限り IQueryable のままにしておきます (.ToList() はクエリを実行します)。

必要に応じて、MiniProfiler、MiniProfiler.Ef などのデバッグ ツールを使用し、他の推奨ツールもおそらく適切です (過去に使用したことはありませんが)。

シリアライゼーションのコストが重要になる可能性があり (DTO を使用している場合)、AutoMapper (およびおそらく他のツール) は大きなリストでは遅いようです。大きなリストでのパフォーマンスが本当に必要な場合は、拡張メソッドで手動でマッピングすることをお勧めします。

于 2015-10-19T23:20:58.413 に答える