Я знаю, что невозможно использовать 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];
}
}
}
Важно: Я знаю, этот код не компилируется . Это код, который я должен оптимизировать.
Я знаю, что есть два способа заставить этот метод работать:
конвертировать yield return
часть:
...
else
{
int index = this.GetSet(data);
return this.keySets[index].Select(key => this.items[key]);
}
конвертировать return
часть:
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);
Каждый из этих циклов запускался в отдельных процессах, поэтому сборка мусора или что-либо еще не влияло на производительность.
- Я запустил программу с одной версией метода, затем
- Закрыто
- Переписал метод и запустите его снова.
Сделал это несколько раз, чтобы увидеть достоверную разницу в производительности ...