我正在查看正在开发的网站的性能,并且遇到了一些我编写的代码:
foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo))
{
someFunction(wi);
}
在上面的代码中,
p.getWorkItems
方法是否在每次循环执行时运行?还是执行一次,将结果对象保存在内存中,然后将指针增加到它正在使用的对象?原因是getWorkItems
在后台进行了大量的工作(比较,排序,其他查询),因此最好不要一遍又一遍地执行。如果是这种情况,那么我最好这样做如下: List<WorkItem> workload = p.getWorkItems(dateFrom, dateTo);
for (int i = 0; i < workload.Count; i++)
{
someFunction(workload[i]);
}
它是用C#编写的,但我假设答案将适用于大多数相似的语言。
最佳答案
您应该了解foreach
循环如何转换为C#代码。从C#语言规范的8.8.4开始,您的循环
foreach (WorkItem wi in p.getWorkItems(dateFrom, dateTo)) {
someFunction(wi);
}
变成
var enumerator = p.getWorkItems(dateFrom, dateTo).GetEnumerator();
try {
WorkItem wi;
while(enumerator.MoveNext()) {
wi = (WorkItem)enumerator.Current;
someFunction(wi);
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
因此,很清楚
p.getWorkItems
仅执行一次。