Производительность ASP.NET: использование LoadControl для каждого
Я пытаюсь принять решение о том, как отобразить мои данные. Теперь у меня есть список товаров, отображаемых в репитере. Но для обслуживания кода я поместил свои элементы продукта в отдельный пользовательский контроль и загрузил их в цикл с результатами db, используя LoadControl.
Сам элемент управления продуктом очень прост, всего несколько открытых свойств, таких как title, url, rating, но я не уверен, повлияет ли это на мою производительность. Я немного читал здесь и на форумах, и некоторые люди говорят, что это не лучшая практика, особенно если у вас более 20 или 30 таких элементов управления.
Итак, действительно ли это снижение производительности с использованием этого метода или оно остается удовлетворительным с около 10000 обращений в день. Любые другие предложения приветствуются.
3 ответа
Я провел некоторое тестирование, потому что меня это тоже заинтересовало, и, похоже, что на LoadControl довольно значительное снижение производительности по сравнению с созданием обычного класса.
Я протестировал создание 100 000 экземпляров простого класса с одним свойством против 100 000 экземпляров loadcontrol с загрузкой нового пустого элемента управления. И это было 16 мс для классов против 1950 мс для управления нагрузкой. Там, кажется, много накладных расходов. Я заметил, что если я добавлю дополнительные элементы управления в пользовательский элемент управления, время загрузки увеличится. (это просто загрузка, которую я на самом деле не добавлял и не отображал элементы управления на странице)
Достаточно ли попадания, чтобы быть заметным для пользователя? Вероятно, нет, если вы не загружаете большое количество экземпляров с помощью load control.
Когда вы используете 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
Инкапсулируя его в вызове функции, механизм кэширования думает, что это тот же самый пользовательский элемент управления (какой он есть) и будет обращаться к диску только один раз, значительно ускоряя его.
Я думаю, что создание отдельного пользовательского элемента управления для каждого продукта, вероятно, не лучший способ.
Тем не менее, вы уже частично там, где вы должны быть для моего предложения.
Почему бы вам не создать класс для вашего Продукта со всеми свойствами, которые вы уже определили в своем пользовательском элементе управления.
Когда вы извлекаете отображаемые продукты, извлекайте коллекцию продуктов (просматривайте записи и создайте коллекцию)(например, список) и используйте коллекцию в качестве источника данных для вашего повторителя.