0

MVC 4 プロジェクトと主に Web Api 部分で、より良い (= より速い) 応答をしようとしています。MiniProfiler を追加して、読み込みが遅い問題がどこにあるかを確認しましたが、わかりません。

                                                    duration (ms)   from start (ms)     query time (ms)
http://www.url.com:80/api/day?city=param (example)  1396.1             +0.0     1 sql   173.8
                                        logging     9.3              +520.9     
                                        EF query    4051.5           +530.2     2 sql   169.6 

次に、同じURLをもう一度試したところ、次の番号が表示されました。

 http://www.url.com:80/api/day?city=param (example) 245.6              +0.0     1 sql   50.6
                                         logging    8.6               +19.6     
                                         EF query   7.7               +28.3     

しかし、2分後に試してみると、最初の例のように再び大きな数字が得られました。

ホーム インデックスの読み込みと同じ:

http://www.blanskomenu.amchosting.cz:80/    333.0   +0.0    
         Controller: HomeController.Index   71.0    +286.8  
                          Find: Index   100.4   +387.8  
                     Render : Index     2468.1  +494.6 

これは、最初の例のWeb Apiの私の方法です

[OutputCache(CacheProfile = "Cache1Hour", VaryByParam = "city")]
    public IEnumerable<RestaurantDayMealsView> GetDay(string city)
    {
        var profiler = MiniProfiler.Current;
        using (profiler.Step("logging"))
        {
            var logFile = new LogFile(System.Web.HttpContext.Current.Server.MapPath("~/Logs/"), DateTime.Today);
            logFile.Write(String.Format("{0},api/daymenu,{1}", DateTime.Now, city));
        }
        using (profiler.Step("EF query"))
        {
            var meals = repo.GetAllDayMealsForCity(city);
            if (meals == null)
            {
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
            }
            return meals;
        }
    }

そして私のリポジトリメソッド:

    public IEnumerable<RestaurantDayMealsView> GetAllDayMealsForCity(string city)
    {
        return db.Restaurants
                 .Include(rest => rest.Meals)
                 .Where(rest => rest.City.Name == city)
                 .OrderBy(r => r.Order)
                 .AsEnumerable()
                 .Select(r => new RestaurantDayMealsView()
                     {
                         Id = r.Id,
                         Name = r.Name,
                         Meals = r.Meals.Where(meal => meal.Date == DateTime.Today).ToList(),
                         IsPropagated = r.IsPropagated
                     }).Where(r => r.Meals.Count > 0);
    }

私のホームインデックスの場合、コントローラーには次のようなものがあります。

    public ActionResult Index()
    {

        return View();
    }

だから私の質問は:

インデックスのレンダリングに時間がかかるのはなぜですか? 私はデフォルトのウェブサイトしか持っていないので、cssなどは問題ないと思います。IE 開発ツールからのネットワーク トラフィック

クエリではない場合、EFクエリで時間がかかるのは何ですか? これらの問題を解決するにはどうすればよいですか?

私はこれらのリンクを見ていました:SOリストASP.NET MVCの概要 - パフォーマンスと私はいくつかのトリックを試し、他の人について読んだが、何も役に立たなかった。ホスティングに問題がある可能性はありますか? それともどこ?ありがとう

4

2 に答える 2

0

リポジトリ メソッドに 1+N クエリの問題があるようです。使用Includeは、コレクションを変更しない場合 (つまり、そのようなものを使用する場合) にのみ最適化されますWhere。これを行うと、EF はデータベースからレコードを再フェッチします。最初にキャストMealsしてから、句を実行する必要があります。これにより、事前に選択された食事の結果が基本的に凍結され、データベースではなくメモリ内でフィルター処理されます。ListWhere

Meals = r.Meals.ToList().Where(meal => meal.Date == DateTime.Today).ToList(),
于 2013-07-15T17:06:25.467 に答える