При вызове веб-службы ASP.NET, которая генерирует документ XML, почему для получения результата после вызова в первый раз требуется вдвое больше времени? - PullRequest
0 голосов
/ 22 июня 2011

У меня есть метод в веб-службе, которую я пишу, которая составляет список категорий, экземпляров и счетчиков производительности в этой системе. Он создает документ XML и возвращает его. При первом вызове метода после публикации на сервере для получения результата требуется около 17 секунд. Каждый раз, когда он вызывается после этого, это занимает 38 секунд. Если я переиздаю, первый раз после этого займет 17 секунд, а затем я вернусь через 38 секунд за звонок.

    [WebMethod(Description="Returns the CounterList in XML Format")]
    public XmlDocument GetCounters()
    {
        XmlDocument CounterList = new XmlDocument();
        XmlElement root = CounterList.CreateElement("CounterList");
        PerformanceCounterCategory[] pcc = PerformanceCounterCategory.GetCategories();
        foreach (PerformanceCounterCategory cat in pcc)
        {
            XmlElement Category = CounterList.CreateElement("Category");
            XmlAttribute CatName = CounterList.CreateAttribute("Name");
            CatName.Value = cat.CategoryName;
            Category.Attributes.Append(CatName);
            String[] instances = cat.GetInstanceNames();
            PerformanceCounter[] pc;
            if (instances.Length > 0)
            {
                pc = cat.GetCounters(instances[0]);
                XmlElement Instances = CounterList.CreateElement("Instances");
                foreach (String instance in instances)
                {
                    XmlElement Instance = CounterList.CreateElement("Instance");
                    Instance.AppendChild(CounterList.CreateTextNode(instance));
                    Instances.AppendChild(Instance);
                }
                Category.AppendChild(Instances);
            }
            else
                pc = cat.GetCounters();

            XmlElement Counters = CounterList.CreateElement("Counters");
            foreach (PerformanceCounter counter in pc)
            {
                XmlElement Counter = CounterList.CreateElement("Counter");
                Counter.AppendChild(CounterList.CreateTextNode(counter.CounterName));
                Counters.AppendChild(Counter);
            }
            Category.AppendChild(Counters);
            root.AppendChild(Category);
        }
        CounterList.AppendChild(root);
        return CounterList;
    }

Ответы [ 2 ]

0 голосов
/ 22 июня 2011

Я бы закомментировал эту строку:

PerformanceCounterCategory[] pcc = PerformanceCounterCategory.GetCategories();

и посмотрите, сохраняется ли симптом.

Обратите внимание, я пробовал код как обычную функцию, первая из которых заняла около 4 секунд, последующие выполнения заняли около 0,2 секунды.

0 голосов
/ 22 июня 2011

Я заметил в документации MSDN , что PerformanceCounter реализует IDisposable;может случиться так, что эти объекты получат некоторые пугающие ресурсы или создадут некоторые блокировки, замедляя последующие запросы.

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

...