2014-02-04 1 views
0

У меня проблема с моим приложением. Время загрузки варьируется от 500 мс до 5 секунд, а в экстремальных ситуациях - 10 секунд, что для меня немного странно, поскольку я новичок в веб-разработке. Загрузка моя страница выглядеть следующим образом:Идентификация времени загрузки страницы узких мест

  1. пользователя нажмите
  2. Перед входом проверки контроллера, если пользователь имеет разрешение на это
  3. Ask Active Directory, учетные данные и задать свою базу данных прав
  4. метод вызова из контроллер Загрузите страницу или сообщите об ошибке

Может ли сервер AD вызвать такую ​​задержку?

Даже если я выключаю страница аутентификации загружается в течение 3 секунд, которые могут путем сверления, когда вы видите «ждете LOCALHOST» знак :)

ниже образца, которые принимают в среднем 3 секунды, чтобы загрузить без аутентификации. метод управления:

public ActionResult Index(string name, string surname ,string deviceName, string deviceManufacturer) 
    { 
     var deviceusages = db.DeviceUsages.Include(d => d.DeviceInstance).Include(d => d.Storage).Include(d => d.User).Where(w=>w.UserId!=6); 
     if(name!="" && name!=null) 
     { 
      deviceusages = deviceusages.Where(w => w.User.Name.Contains(name)); 
     } 
     if (surname != "" && surname != null) 
     { 
      deviceusages = deviceusages.Where(w => w.User.Surname.Contains(surname)); 
     } 
     if (deviceName != "" && deviceName != null) 
     { 
      deviceusages = deviceusages.Where(w => w.DeviceInstance.Device.Name.Contains(deviceName)); 
     } 
     if (deviceManufacturer!= "" && deviceManufacturer != null) 
     { 
      deviceusages = deviceusages.Where(w => w.DeviceInstance.Device.Manufacturer.Contains(deviceManufacturer)); 
     } 
     return View(deviceusages.ToList()); 
    } 

И cshtml страница:

<table class="table"> 
<tr> 
    <th> 
     @Html.DisplayNameFor(model => model.DeviceInstance.Device.Name) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.DeviceInstance.Device.Manufacturer) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.Storage.Name) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.User.Name) 
    </th> 
    <th> 
     @Html.DisplayNameFor(model => model.User.Surname) 
    </th><th></th> 
</tr> 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.DeviceInstance.Device.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.DeviceInstance.Device.Manufacturer) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.Storage.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.User.Name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.User.Surname) 
     </td> 
     <td> 
      @Html.ActionLink("Details", "Details", new { id=item.DeviceInstanceId }) 
      @if (item.UserId == 1) 
      { 
       @Html.Raw("| ") 
       @Html.ActionLink("Claim", "ClaimDevice", new { id = item.DeviceInstanceId }) 
      }   
     </td> 
    </tr> 
} 
</table> 

А теперь мой вопрос, что я сделал что-то неправильно или мое время загрузки в порядке, и я просто новичку

+0

Насколько велики таблицы db здесь? – Andrei

+0

max 8 столбцов x 40 строк x int или varchar (50) в каждой ячейке. Ничего особенного – szpic

+0

1) при запуске localhost подключается отладчик, который замедляет работу в 5-10 раз. 2) Те запросы EF будут медленнее, чем простой запрос '==' (.contains() является эквивалентом 'LIKE' в SQL, который не имеет хорошей скорости относительно фактического соответствия значения и 3) вы присоединяются также к нескольким столам вместе, что может повлиять на скорость и производительность. В целом, я думаю, ваша проблема просто работает с приложением отладчика. Попробуйте вытолкнуть фактический веб-сервер, а затем измерьте свою производительность. К сожалению, для использования используется – Tommy

ответ

1

Первоначально, это началось как комментарий, но я думаю, что смогу сформировать его в ответ для вас. Во-первых, вы на самом деле не делаете ничего плохого, но я могу указать места, где ваша скорость кода может быть улучшена.

  1. Вы присоединяетесь к приличному количеству столов. Это приведет к тому, что SQL будет медленнее, чем одна таблица/несколько объединенных таблиц.

  2. Метод .Contains() соответствует LIKE в синтаксисе SQL. Это медленнее, чем соответствие фактического значения (=). Вы могли бы развлечь возможность предоставления выпадающих списков вашему пользователю для поиска, чтобы они: а) не нуждались в именах и б) они могли быстро увидеть возможные значения.

  3. «Может ли AD вызвать замедление» - возможно. Это зависит от того, насколько хорошо ваша инфраструктура поддерживается и выкладывается, и больше о ваших сетевых ребятах. Если ваш сервер AD/LDAP находится под большой нагрузкой (поскольку он работает с Exchange, SQL и DNS и т. Д.), Он может быть медленным в реагировании, но это не проблема с кодом.

  4. Скорее всего, ваш отладчик - это то, что на самом деле вызывает замедление. Я заметил, что EF 6 работает гораздо медленнее с отладчиком, прикрепленным к предыдущим версиям. Как отмечалось ранее, наше производственное приложение работает примерно в 2 с в локальном хосте и 150-200 мс в режиме выпуска на аппаратном уровне небезопасного веб-сервера.

  5. Вместо запроса AD каждый раз, возможно, вы спрашиваете один раз, а затем кешируете результаты AD в файл cookie или что-то подобное. Это сократит запросы за пределами вашего приложения для каждого запроса.

Таким образом, нет, похоже, что вы ничего не делаете неправильно.На мой взгляд, у вас есть место для улучшения, но я не стал бы слишком беспокоиться об этом, пока вы не сможете получить его на сервере и из локального хоста и протестировать свое приложение.