Производительность ASP.NET: использование LoadControl в For-E-

StackOverflow https://stackoverflow.com/questions/3917911

Вопрос

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

Сам контроль продукта очень прост, лишь несколько публичных свойств, таких как заголовок, URL, рейтинг, но я не уверен, повлияет ли это на мою производительность. Я прочитал здесь и на форумах, и некоторые люди говорят, что это не самая лучшая практика, особенно если у вас есть более 20 или 30 из этих элементов управления.

Итак, действительно ли это производительность, используя этот метод, или он остается в порядке с 10 000 ударов в день. Любые другие предложения также приветствуются.

Это было полезно?

Решение

Я провел некоторое тестирование, потому что меня тоже интересовали, и кажется, что на LoadControl есть довольно значительная производительность по сравнению с тем, чтобы создать обычный класс.

Я проверил создание 100 000 экземпляров простого класса с одним свойством против 100 000 экземпляров LoadControl, загружающего новый пустой элемент управления. И это было 16 мс для классов против 1950 мс для управления нагрузкой. Кажется, много накладных расходов. Я заметил, что если я добавлю больше компонентных элементов управления в пользовательском управлении, время загрузки увеличилось. (Это просто нагрузка, которую я на самом деле не добавил элементы управления на страницу и не отображаем)

Достаточно ли удара, чтобы быть заметным для пользователя? Вероятно, нет, если вы не загружаете большое количество экземпляров с помощью LoadControl.

Другие советы

Я думаю, что создание отдельного пользовательского управления для каждого продукта, вероятно, не лучший путь.

Тем не менее, вы уже частично там, где нужно быть для моего предложения.

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

Когда вы получаете продукты, которые вы отображаете, получите коллекцию продуктов (перепроверьте записи и создайте коллекцию) (например, список) и используйте коллекцию в качестве данных для вашего ретранслятора.

Когда вы используете Page.LoadControl В пределах петли разделить его на собственную функцию, и это скажет ASP.Net чтобы кэшировать управление вместо того, чтобы загружать его с диска каждый раз.

Пример: (VB)

Private Function LoadMyControl() As myCustomControl1
    Return Page.LoadControl("....")
End Function

Затем...

For each [....]
   Dim myCtrl1 as myCustomControl1 LoadMyControl()
   myCtrl1.prop1 = "blah"
   myPlaceholder1.Controls.Add(myCtrl1)
Next

Инкапсулируя его в функции Call, двигатель кэша думает, что это тот же пользовательский элемент управления (который он есть), и он будет доступ к диску только один раз, значительно ускоряя его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top