6

asp.net MVC コントロールが jquery $.ajax 関数によって呼び出されると、パフォーマンスが低下するという非常に興味深い問題に遭遇しました。コントロールは 403 ミリ秒かかるデータベース アクションを実行しますが、Firebug によると $.ajax 呼び出しの合計は 3400 ミリ秒であり、かなりのオーバーヘッドが追加されています。パフォーマンスを最適化する必要がありますが、このオーバーヘッドがどこから発生するのかわかりません。

これがコードです。私のコントローラーには、

 public JsonResult SetSearchResults(Criteria searchCriteria)
 {

       SearchResult myReportsResult = _repository.GetResults(searchCriteria);    

       //the statement above takes 403 ms

       return Json(myReportsResult);
  }





 public  SearchResult GetResults(SearchCriteria searchCriteria)
  {
        SearchResult result = SearchResult();

         DataTable dbResults = _da.GetDBResults(searchCriteria);       


        List<IncidentReportHeader> irs = new List<IncidentReportHeader>();            

        for (int i = 0; i < dbResults.Rows.Count; i++)
        {
            IncidentReportHeader ir = new IncidentReportHeader();

            //populate all the properties of the ir object here,                

            irs.Add(ir);
        }

        result.Reports = irs;       
        return result;        
}

    //models
    public class SearchResult
    {

        private List<IncidentReportHeader> _res;
        private int _numOfPages=0;
        private int _recordsPerPage=0;

        public List<IncidentReportHeader> Reports {
            get { return _res; }
            set
            {
                _res = value;              
            }        
        }           


        public SearchResult()
        {
            _res = new List<IncidentReportHeader>();
        }
    }
}




//db call
   public DataTable GetDBResults(SearchCriteria searchCriteria)
       {
         //add all params to the db object needed for the stored procedure here



            DataTable dt = _db.ExecuteStoredProc("myDB.PACKAGE_NAME.stored_proc", 2000, ref  _spParams, ref _spResultVariables);
           return dt;

}

私のJSで

function SearchIncidentReports() {

    //pack the  searchCriteria object here
    var searchCriteria = ...

    var start = new Date().getTime();

    $.ajax({
        contentType: 'application/json, charset=utf-8',
        type: "POST",
        url: myController/SetSearchResults,
        data: JSON.stringify({ searchCriteria: searchCriteria }),
        cache: false,
        dataType: "json",

        success: function (response) {

            var got_data = new Date().getTime();
            var diff1 = got_data - start;
            alert("data loaded in: " + diff1 + " ms");

             // do whatever you need with the data here.  
             // diff1 = 3400ms which is what Firebug shows too

        },

        error: function (xhr, ajaxOptions, thrownError) {
            var result = $.parseJSON(xhr.responseText);
            alert(result.ErrorMessage);
        }

    });
    return false;
}

データベース呼び出しが削除され、オブジェクトを手動で設定すると、パフォーマンスが非常に高速になります。

403 ミリ秒から 3400 ミリ秒にするのは明らかに間違っており、明らかに不当なオーバーヘッドがあるようです。ここで何が間違っているのか指摘してもらえますか? それはかなり骨の折れるものであり、データベースに行くことを避けることはできません。

コントロールに JsonResult ではなく空のセット (ActionResult) を返させようとしましたが、同じ問題がありました。

これはasp.net MVCの問題ですか?

アップデート

また、Excel ファイルを返すアクションと、その中にあるまったく同じデータベース操作もあります。ファイルは関数を使用せずに 410ms で戻ってき$.ajaxます。$.ajaxどういうわけか遅延を引き起こしているようです。必要なのはデータベースからデータを取得することだけで、通常は非常に高速です。

誰かがそれを求めたので、コントローラーコードの内部を追加しましたが、内部 (はい、コントローラー呼び出しの内部の合計) は 403 ミリ秒かかることを繰り返します。明らかに、問題はサーバーやデータベースの呼び出しではありません。クライアントとサーバーの間にあるようです。

ノート:

  1. Firebug では、Action GetResults を使用して POST にかかった合計時間は 3.54 秒です。
  2. Firebug で Net->All に移動すると、要求の内訳が一覧表示され、待機に最も長い時間 (3.5 秒) が費やされていることがわかります。

サーバーとクライアント間の通信に 3.5 秒から 403 ミリ秒の時間が費やされているようですが、どこで、なぜですか?

4

1 に答える 1

1

問題が見つかりました。問題はデータベース呼び出しにあります。しかし、私が最初に誤解した理由は、時差を計算するコードです。

DateTime start = DateTime.Now;

SearchResult myReportsResult = _repository.GetResults(searchCriteria);  


DateTime got_it = DateTime.Now; 
TimeSpan diff = (got_it - start);
int diff_ms = diff.Milliseconds;

このコードでは、正しいミリ秒値が得られませんでした。

于 2012-07-23T17:38:17.740 に答える