借助ANT的探查器信息识别性能瓶颈



此代码运行非常缓慢:

public static class DB
{
readonly static InlineSql sql = new InlineSql();
public static IEnumerable<LabItem> GetLabItemsFromLabLineItems(IEnumerable<LabLineItem> items)
{
/*
* Business Rule : 
* The sproc used to retrieve lab line items has no way of "grouping" lab items out of line items.
* To compensate, the sproc orders its results by IDCode, we group everything and use the first of each grouping to represent that ID Code.
* That very same item is also the first item in its Items property.
* */
return items
.GroupBy(c => c.IDCode , c => c, (c, d) => d.First())
.Select(c => new LabItem(c.IDCode, c.OrderGuid, c.Name, c.SignificantDtm, c.Status, c.Description, items.Where(d => string.Compare(d.IDCode, c.IDCode, true) == 0 )));
}        
}

特别是我们将d.IDCode与c.IDCode进行比较的select语句似乎是个问题。这条线报告了来自ANTS的9000万次点击,%时间为14.8。items.count约为9000。

我知道我的断点没有被点击9000万次。命中数在这里是什么意思?

其他有用的代码:

LabItemList<LabLineItem>,这是我们在这里比较的。LabLineItem.Equals:

public override bool Equals(object obj)
{
LabLineItem otherItem = obj as LabLineItem;
if (otherItem == null) return false;
return
OrderGuid == otherItem.OrderGuid
&& IDCode == otherItem.IDCode
&& SignificantDtm == otherItem.SignificantDtm
&& ObservationGuid == otherItem.ObservationGuid
&& string.Compare(Value, otherItem.Value, true) == 0;
}
public override int GetHashCode()
{
return
OrderGuid.GetHashCode()
^ IDCode.GetHashCode()
^ SignificantDtm.GetHashCode()
^ ObservationGuid.GetHashCode();
}

ANTS表示,带有string.Compare调用的Select被点击9000万次,因为对于主列表中的每个项目,它都会再次搜索整个列表。

主要的9000次迭代中的每一次都会导致9000次额外的迭代,因此string.Compare必须至少调用81000000次。

我建议构建分组的缓存,然后使用它来构造LabItem

也许是这样的:

var groupedItems = items.GroupBy(c => c.IDCode);
return items.Select(c => 
new LabItem(c.IDCode, c.OrderGuid, c.Name, c.SignificantDtm, c.Status, c.Description, 
groupedItems.Where(d => string.Compare(d.Key, c.IDCode, true) == 0 ).SelectMany(group => group)));

相关内容

  • 没有找到相关文章

最新更新