none
ASP.NET MVC 3 - время генерации страниц. RRS feed

  • Вопрос

  • Некоторые страницы (например с таблицей) открываются довольно долго - 2-3 секунды даже на локальной машине.

    По этому мануалу написал профилировщик генерации страницы

    http://stackoverflow.com/questions/1428785/c-sharp-asp-net-mvc-show-page-render-time

    Вкратце: при ActionExecuting запускается Stopwatch, при ActionExecuted в ViewData записываются его EllapsedMillisecods

    В мастер странице написал:

    @if(ViewData["_ElapsedTimer"] != null)
    {
    	@:Страница сгенерирована за @((long)ViewData["_ElapsedTimer"]) мсек.
    }

    Но там "долгие" страницы генерируются самое большое 50 мсек. В чем проблема?

Ответы

  • Да, 2-3 секкунды это очень много. Этот метод показывает лишь малую часть цикла отработки запроса. Чтобы получить больше, нужна полная трассировачная информация. Вот при помощи этого инструмента (вот по применению), можно получить очень много информации. При помощи firebug(вкладка Net), посмотрите что откуда приходит и за какое время. Может быть и такое, что приложение тут не причём, а браузер зависает, хотя редко. Попробуйте в разных браузерах протестить.
    Модератор

Все ответы

  • Да, 2-3 секкунды это очень много. Этот метод показывает лишь малую часть цикла отработки запроса. Чтобы получить больше, нужна полная трассировачная информация. Вот при помощи этого инструмента (вот по применению), можно получить очень много информации. При помощи firebug(вкладка Net), посмотрите что откуда приходит и за какое время. Может быть и такое, что приложение тут не причём, а браузер зависает, хотя редко. Попробуйте в разных браузерах протестить.
    Модератор
  • Так же посмотрите, не подключены ли у Вас внешние ресурсы (css, js и т.д), т.е приходящие с внешних доменов. Очень вероятная причина, так как они могут грузиться долго(плохая связь, недоступность) и из-за этого страница может долго загружаться. Как отметил высше, firebug умеет это показывать, ну и не только он, но он лучший.
    Модератор
  • Попробуйте вернуть тупо HTML, с результирующими данными

    Я подозреваю что у вас обработка данных идет долго

  • Это уже больше похоже на правду..

    Грид генерируется в течение 500 мсек.

    Использую MVCContrib Grid с IPagenation<MyModel> и фильтром

    На странице отображается 10 из 100 моделей.

    Такая скорость генерации нормальна на довольно мощном компьютере? (Intel i5 3.3 GHzx4, 1600Mhz память)

    Если нет, в сторону чего копать? (ручное написание грида, оптимизация модели..)

  • вот страница, рендер которой занимает 95% времени

    http://pastebin.com/RqHw8aJs

  • "Это уже больше похоже на правду..", немножечко да, но ещё далеко.  Пол секкунды это много, за такое время может 10 средненьких страниц сгенерироваться. "Такая скорость генерации нормальна на довольно мощном компьютере" - ну мощность тут не причём, скорости всех современных компов с лихвой достаточно для подобных задач. "Если нет, в сторону чего копать?" - оптимизация важна и нужна. Ручное написание грида не вариант, а оптимизация модели да.
    Модератор
  • "Это уже больше похоже на правду..", немножечко да, но ещё далеко.  Пол секкунды это много, за такое время может 10 средненьких страниц сгенерироваться. "Такая скорость генерации нормальна на довольно мощном компьютере" - ну мощность тут не причём, скорости всех современных компов с лихвой достаточно для подобных задач. "Если нет, в сторону чего копать?" - оптимизация важна и нужна. Ручное написание грида не вариант, а оптимизация модели да.

    Можете посмотреть страницу? Возможно я там криво создал грид

    Есть несколько столбцов, столбец картинки генерируется как первое изображение из CSV-строки с именами файлов

    И еще три столбца для редактирования, которые проверяют права пользователя и в зависимости от этого (не-) выводят картинку-ссылку

  • И ещё код контроллера и модели, если можно. Утром посмотрю, а сейчас уже спать пора.
    Модератор
  • http://dl.dropbox.com/u/15540158/yatajga.zip
  • Вам удалось получить трассировочную информацию, если да то, что там пишется во вкладках Timeline, Trace. Сколько времени занимает выполнение  ActionResult ViewAll ? Вот в коде

    var sells = DbData.Sells
    				.Where(sell => DbData.CanView(User.Identity.Name, sell.SellId))
    				.OrderBy(sell => sell.SellId)
    				.AsEnumerable();

    DbData это объект(класс) ORM, или Вы напрямую работаете с базой? Если это объект ORM, то возможно не оптимальные запросы генерируются. Насколько понял, там не SQL Server, а PostgreSQL. Есть для него профилировщик, чтобы можно было посмотреть, какие данные идут и в каком количестве, для SQL Server такой инструмент есть, а с PostgreSQL, я не работал. В любом случае, нужна информация Timeline, Trace, чтобы, что-то сказать.


    Модератор
  • DbData - это класс, содержащий коллекции-подклассы, с данными из БД. 

    Объявления хранятся в унаследованной коллекции

    class SellsCollection : IEnumerable<SellModel>

    внутри которой есть список

    private readonly List<SellModel> _sells = new List<SellModel>();

    Эти данные загружаются при запуске сайта, при добавлении, изменении, удалении через DbData они обновляются в БД и в этих коллекциях одновременно.

    зеленая полоска - рендер ViewAll (заканчивается на 400 мс)

    А в Trace насколько я вижу нет ничего интересного - с десяток функций со временем выполнения 0-2 мс




  • Да, выходит, что у Вас представление почти пол секкунды рендерится, а контроллер отрабатывает быстро. Хотя, если используется отложенная загрузка, то данные приходят прямо в представление, а у Вас как я понял так и есть. Надо бы ещё раз на представление повнимательней взглянуть. И если можно код главной страницы, представления.
    Модератор
  • Да, кстати, я думаю, что данные разбираются в представлении, потому что, когда я накосячил с моделью, в тексте ошибки проскакивало ILazyPagination

    Вот код главной страницы, но, думаю, она не причем, т.к. простая HTML-ка на ней отрабатывается за пару мсек

    http://dl.dropbox.com/u/15540158/_Layout.cshtml



  • Попробовал в Opera, время генерации View внезапно уменьшилось до 22 секунд
  • Наверное Вы имели ввиду 22 милисеккунд. А в других какие результаты?
    Модератор
  • Firefox 12 - 40 мс

    IE 8 - 22мс

    Opera 11 - 22vc

    Chrome 19 - 400 мс

    интересно..

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

    Смысла особо не вижу, т.к. в хроме политика тихого обновления, с которой мало у кого будет старая версия

  • А хром 19 это уже финальная версия или бэта? Насколько я знаю это бэта. Они так быстро эти цифры меняют, что не успеваешь заметить, что есть что. У меня сейчас 15-ая, я его держу чисто для тестирования интерфейса.
    Модератор
  • Скорее всего финальная, т.к. я только установил хром с официального сайта и больше ничего не делал - он сам обновляется