注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
#123306 Add early return in TryGetLast for empty results.
- 作成者: @prozolic
- 作成日時: 2026年01月17日 12:02:53(UTC)
- マージ日時: 2026年01月18日 16:08:55(UTC)
- ラベル: area-System.Linq community-contribution
概要
IEnumerableSkipTakeIterator.TryGetLastに早期リターン最適化を追加し、Skip操作後に要素が存在しないことが確定した場合に即座に処理を終了します。GetCount(onlyIfCheap: true)が有効なカウントを返す場合、count <= _minIndexInclusiveをチェックして不要な列挙を回避します。
// 例:以下のシナリオが最適化対象
Enumerable.Range(0, 4).Prepend(4).Skip(5).LastOrDefault()
// Skip後に要素がないため、即座にfalseを返す
変更内容
- ファイル:
src/libraries/System.Linq/src/System/Linq/SkipTake.SpeedOpt.csIEnumerableSkipTakeIterator.TryGetLastメソッドにfast pathを追加count != -1条件で安価なカウント取得時に最適化パスを開始count <= _minIndexInclusive時の早期リターンロジック実装- 変更行数: +7/-1
パフォーマンスへの影響
大幅な改善を確認:
LastOrDefault_PrependSkip: 54.05 ns → 25.75 ns(約52%削減)LastOrDefault_AppendSkip: 54.89 ns → 25.78 ns(約53%削減)LastOrDefault_ConcatSkip: 85.73 ns → 41.26 ns(約52%削減)
コードサイズも削減(例:2,616 B → 1,777 B)。メモリアロケーションはほぼ同等。Skip後に要素が存在しないシナリオで、不要な列挙処理を完全に回避できます。
関連Issue
なし
その他
- 内部実装のみの変更(
SpeedOpt内部メソッド)で、公開APIへの影響なし - 破壊的変更なし
- LINQ
Skip().LastOrDefault()パターンの最適化ケース