当调用ASP.NET Web服务生成XML文档,为什么第一次调用后需要两倍的时间才能得到结果



我在编写的web服务中有一个方法,该方法编译该系统上的性能计数器类别、实例和计数器列表。它构建一个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;
    }

我会注释掉这一行:

PerformanceCounterCategory[] pcc = PerformanceCounterCategory.GetCategories();

看看症状是否持续。

注意,我将代码作为一个常规函数进行了尝试,第一次执行大约需要4秒,随后的执行大约需要0.2秒。

我在MSDN文档中注意到PerformanceCounter实现了IDisposable;这可能是因为这些对象获取了一些可怕的资源或创建了一些锁,从而使后续请求变得更慢。

使用完每个PerformanceCounter对象后,请尝试为它们调用Dispose。也许,如果您立即清理这些内容,而不是等待GC运行,那么跨请求的速度会更加一致。

最新更新