Подлипенский Павел

Блог о технологиях и деньгах

Скаженi кабани: GridView vs Response.Write

clock декабря 29, 2008 09:04 by author Подлипенский Павел

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

Что-то случилось...

... понял я, когда в час ночи зазвонил мой телефон. Сквозь сон я выслушал все новогодние "пожелания" заказчика и краткое описание проблемы - "Страница медленно работает". Затем пока нашел штаны, пока нашел где у меня ноги, пока оделся и, спустя часы, я оказался на работе. Нагрузочное (или даже стресc-тестирование) показало, что страница действительно забирает 90% процессорного времени при больших объемах данных на ней. После небольшого разбирательства выяснилось, что показания %Time in GC счетчика производительности меньше оптимальных. После чего наш консилиум заключил, что приложение нерационально использует оперативную память сервера.

MSDN говорит:

.NET CLR Memory\% Time in GC

Threshold: This counter should average about 5 percent for most applications when the CPU is 70 percent busy, with occasional peaks. As the CPU load increases, so does the percentage of time spent performing garbage collection. Keep this in mind when you measure the CPU.

Significance: This counter indicates the percentage of elapsed time spent performing a garbage collection since the last garbage collection cycle. The most common cause of a high value is making too many allocations, which may be the case if you are allocating on a per-request basis for ASP.NET applications. You need to study the allocation profile for your application if this counter shows a higher value.

За этим последовал небольшой code review, во время которого выяснилось, что приложение создает дофига коллекций. Коллекции использовались для переноса данных из BLL в Presentation Layer, и последующей конвертации их в DataTable (для байндига в GridView). Таким образом мы создали три анти-паттерна производительности (во завернул-то!): храним много данных в памяти, создаем большое количество циклов и конвертаций типов.

Пути решения

  • Байндить коллекции сразу GridView, без конвертации в DataTable
  • Создавать DataTable сразу из XML файла, минуя коллекции во избежания больших циклов  и конвертации типов
  • Использовать XSLT для трансофрмации XML в HTML таблицу (нафиг тогда вообще ASP.NET?)
  • Использовать Response.Write(), как это предлагает сделать Майкрософт

Решили попробовать последнее.

В результате получили следующее:

GridView Response.Write()
image_2 image_8

Интересные результаты, неправда ли? И хотя мы выиграли в производительности мы проиграли как минимум в удобстве и безопасности: GridView не просто рендерит таблицу, а и реализует некий функционал для управления и взаимодействия с данными в ней. А также делает проверки на cross-site scripting и другие виды атак. Так, что настаивать на Response.Write не буду. Решение использовать зависит от конкретной ситуации и пожеланий вашего заказчика.

Полезные ссылки

Improving ASP.NET Performance

Measuring .NET Application Performance

Code Review: .NET Application Performance

Текущий рейтинг: 5.0 (1 голосов)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Зачем людям PR?

clock августа 17, 2008 20:28 by author Подлипенский Павел

С недавних пор начал интересоваться оптимизацией сайтов не только с точки зрения производительности, но и с точки зрения оптимизации под поисковые машины. Чтож поделаешь, заказчики хотят зарабатывать на рекламе, а я по-прежнему хочу зарабатывать на заказчиках...

Для всех давно не секрет, что такое PR, и с помощью каких систем его можно определить. А все ли знают как он опредляется? Напомню, что PR опредляется не для всего сайта целиком, а для каждой отдельной страницы. При определении PageRank необходимо учесть все внутренние и внешние ссылки на страницу.

Формула опредления:
PR(A) = (1-d) + d(PR(t1)/C(t1) +… + PR(tn)/C(tn)),
где PR(t1…tn) - вес страницы, ссылающейся на страницу A,
C - количество исходящих ссылок со страницы А,
d - коэффициент затухания, обычно принимаемый 0.85.

Из уравнения следует, что одна ссылка со страницы с PR4 и пятью исходящими ссылками передаст больший вес, чем ссылка со страницы с PR8 и сотней исходящих ссылок. Чем больше исходящих ссылок на странице, тем меньший PageRank будет передан по такой ссылке, и это не зависит от того - внешние ли это будут ссылки или внутренние. При этом у страниц отдающих свой "голос" за другие страницы PR не уменьшается!!!

Что делать если у вас много исходыщих ссылок на всех страницах? Неоходимо все ссылки которые только можно - скрывать от поисковых систем. О том как это сделать в ASP.NET хорошо написал Дмитрий.

Согласно вышеуказанной формуле можно делать прогнозы на будущее! Можно самому написать скрипт по пронозу, но зачем делать то - что кто-то уже сделал это раньше… Данный сервис помимо прогноза показывает общее количество бэков на ваш сайт.

Подводя итоги: делайте как можно больше ссылок не только на главную страницу, но также и на остальные внутренние страницы, в своих постах ставьте тематические ссылки на ваши другие (ранее написанные) посты, всё лишнее скрывайте от “глаз” поисковика…

Текущий рейтинг: 2.7 (3 голосов)

  • Currently 2,666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5


Search


LinkedIn Profile

Tags

Posts

  • Pingback from 241.akemet.com Cb300 Second Hand Address, Cb3000 Video Price Marine Engines
    241.akemet.com

  • http://tvsh2004.narod.ru/gm03.html
    test

  • конечно это очень дорого, у нас ведь вся страна пользуется только лицензионной windows...
    Славян

  • Алексей: С удовольствием!
    Подлипенский Павел

  • Присоединяйтесь к ЖЖ-коммьюнити http://community.livejournal.com/ua_extjs
    Алексей

  • Поправка насчет генерации самого хтмл-кода для ответа веб метода. Предлагаю сделать проще, не создавая объекта страницы и без тега <form> [WebMethod] public string GetControlHTML(string controlLocation) { HtmlTextWriter tw = new HtmlTextWriter(new StringWriter()); var uc = (UserControl)(new UserControl()).LoadControl(controlLocation); uc.RenderControl(tw); return tw.InnerWriter.ToString(); }
    Anthony

Categories

Calendar

<<  Сентябрь 2010  >>
воповтсрчепясу
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

Archive

© Copyright 2010

Sign in

Ó÷àñòíèê ïëàíåòû Developers.org.ua

Bookmark and Share

Web Developement Blogs - Blog Catalog Blog Directory