当调用ASP.NET Web服务生成XML文档,为什么第一次调用后需要两倍的时间才能得到结果
本文关键字:调用 两倍 结果 时间 服务生 Web NET ASP XML 文档 第一次 | 更新日期: 2023-09-27 17:59:45
我在编写的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运行,那么跨请求的速度会更加一致。