Что быстрее в ASP.Net? - PullRequest
       13

Что быстрее в ASP.Net?

2 голосов
/ 04 апреля 2011

Наш проект в настоящее время использует 2 способа найти элемент управления внутри страниц. Во-первых, рекурсивно использовать .indControl. Другой - использовать LINQ так:

(from n in Page.Controls.Cast<Control>().Descendants(c => c.Controls.Cast<Control>())
 where (n as Label != null && n.ID == "TaskIDLabel")
 select n).First() as Label;

Который использует это расширение:

static public IEnumerable<T> Descendants<T>(this IEnumerable<T> source,
                                            Func<T, IEnumerable<T>> DescendBy)
{
    foreach (T value in source)
    {
        yield return value;

        foreach (T child in DescendBy(value).Descendants<T>(DescendBy))
        {
            yield return child;
        }
    }
}

Какой из этих двух методов лучше? Что быстрее?

Ответы [ 3 ]

3 голосов
/ 04 апреля 2011

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

http://www.dotnetperls.com/stopwatch

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Я предлагаю либо добавить точки останова в конце каждого секундомера, либо просто вывести значение с помощью Response.Пишите, как только вы отлаживаете.

Редактировать: Вы действительно заметили какие-либо проблемы с производительностью или пытаетесь стандартизировать и убедиться, что вы выбрали правильный метод?

Если вы используете .Net 4 в зависимости от количества элементов управления, возможно, вы могли бы использовать параллельные расширения для более быстрой итерации по списку, что может помочь.Посмотрите "AsParallel ()"

1 голос
/ 04 апреля 2011

Это точный ответ, но я бы сказал, что код IL, который сгенерирует ваш написанный вручную код, вероятно, очень похож на код, используемый FindControl.Однако одно существенное отличие заключается в том, что код Microsoft, как правило, чрезвычайно оптимизирован для CLR, используя множество подсказок компилятора для выполнения быстрее, чем большинство рукописных кодов.

Поэтому я бы лично использовал FindControl в рекурсивном вызове.

1 голос
/ 04 апреля 2011

Ваш код и FindControl функционально отличаются. Они не делают то же самое.

FindControl не выполняет глубокий поиск, тогда как ваш код делает. От MSDN :

Этот метод найдет элемент управления, только если элемент управления непосредственно содержится в указанном контейнере; то есть метод не выполняет поиск в иерархии элементов управления внутри элементов управления.

Что лучше? Это зависит. Если вы не знаете, где на странице находится элемент управления, ваши рекурсивные методы могут его найти.

Однако предположим, что на панели имеется два элемента управления (ID = "MyPanel"): пользовательский элемент управления UserControl (ID = "MyControl") и метка (ID = "MyName"). Если вы вызовете `MyPanel.FindControl (" MyName "), вы вернете ожидаемую метку на панели. Если вы используете свою функцию, она сначала будет искать в MyControl метку с ID = "MyName". Из-за этого, если MyControl также содержит метку с ID = "MyName", он будет возвращен. Это может быть неожиданным, если элемент управления генерирует дочерний элемент управления с тем же идентификатором, что и вы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...