Производительность ASP.NET: использование LoadControl для каждого - PullRequest
1 голос
/ 12 октября 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

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

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

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

0 голосов
/ 21 сентября 2016

Когда вы используете 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

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

0 голосов
/ 12 октября 2010

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

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

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

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

...