【问题标题】:How to reduce the execution time?如何减少执行时间?
【发布时间】:2014-02-14 11:00:10
【问题描述】:

代码:

testItemList = testResults.Select(item => project.Store.GetWorkItem(item.TargetId)).ToList();

testItemList 是 (局部变量)列表 testItemList

testResults 是 (局部变量)WorkItemLinkInfo[] testResults

总共有 610 个工作项。如何减少执行时间?截至目前,执行这行代码需要 20 秒。 如何微调以上代码,从而减少执行时间?

【问题讨论】:

  • 610 非常非常小。这些是从数据库加载的吗?也许你有一个 N+1 问题,而这 610 次迭代就是 610 次查询。
  • @SimonWhitehead,不,这些项目是从 TFS 加载的。
  • 你能粘贴project.Store.GetWorkItem(item.TargetId)吗?这些调用可能很昂贵。
  • 请告诉我们GetWorkItem。如果它是外部 API 的一部分……至少解释一下它的作用。
  • @SimonWhitehead,GetWorkItem 来自Microsoft.TeamFoundation.WorkItemTracking.Client

标签: c# linq list c#-4.0 tfs


【解决方案1】:
Query query = new Query(project.Store, "Select [Title] From WorkItems", testResults.Select(item => item.TargetId).ToArray());
var car = query.BeginQuery();
//Do something else while awaiting server response...
testItemList = query.EndQuery(car);

您的代码总共往返服务器 610 次,并下载每个工作项的每个字段。此代码执行单次往返,并且仅下载 Title 字段。

请注意,您仍然可以访问 testitemlist 中每个工作项的每个字段,但每次访问未包含在原始查询字符串中的字段都需要另一次往返。

http://msdn.microsoft.com/en-us/library/bb130306.aspx

【讨论】:

  • 如何将 workitemcollection 转换为字典?我有这个代码var testItemMapQuery = testItemList.ToDictionary(w => w, createItemFromQuery);
  • testItemList.Cast<WorkItem>.ToDictionary(w => w.id, w => w);?
  • Cast<WorkItem> 中,错误消息显示为System.Linq.Queryable.Cast<TResult>(System.Linq.IQueryable) is a method which is not valid in the given context
  • 我使用以下代码将workitemcollection转换为list<WorkItem>..testItemCollectionList = (from WorkItem mItem in testItemCollection select mItem).ToList();
【解决方案2】:

我猜一下:Store 是 WorkItemStore 吗?
什么是测试结果?

您的 linq 语句将导致一个 for 循环。对每个 ID 进行新查询。您可以通过使用批处理查询来加快结果。
也许 WorkItemStore.Query(id[], wiql) 可以加快速度。提供一个 ID 列表。
然后你会得到一个 WorkItemCollection。 “wiql”是用于指定所需字段的查询语言。
对不起,简短的回答。我手头没有 TFS 来试一试并发布经过测试的代码 sn-p。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2017-03-03
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多