我知道在同一个方法中使用return
和yield return
是不可能的。
这是我想要优化的代码:
public IEnumerable<TItem> GetItems(int data)
{
if (this.isSingleSet)
{
return this.singleSet; // is IEnumerable per-se
}
else
{
int index = this.GetSet(data);
foreach(TKey key in this.keySets[index])
{
yield return this.items[key];
}
}
}
重要提示:我知道这段代码无法编译。这是我需要优化的代码。
我知道两种方法可以让这个方法工作:
convert
yield return
part:... else { int index = this.GetSet(data); return this.keySets[index].Select(key => this.items[key]); }
convert
return
part:if (this.isSingleSet) { foreach(TItem item in this.singleSet) { yield return item; } } else ...
return
语句(换句话说,使用Select()
)要慢得多(大约慢6倍)比yield return
转换。问题
您是否还有其他想法如何编写此方法?您是否有任何其他有价值的性能差异信息建议?
附加信息
我通过在
for
循环周围使用秒表来测量两种方法的速度。Stopwatch s = new Stopwatch();
s.Start();
for(int i = 0; i < 1000000; i++)
{
GetItems(GetRandomData()).ToList();
}
s.Stop();
Console.WriteLine(s.ElapsedMilliseconds);
每个循环都在单独的进程中运行,因此垃圾回收或其他任何因素都不会影响性能。
- 我已经使用一个方法版本运行了该程序
- 关闭它
- 重新编写该方法并再次运行它。
多次执行上述步骤以查看可靠的性能差异...
ToList()
来迭代结果可枚举对象。 - Robert Koritnik