From 828225cbc23682b376fd958d84f9ebfa6c575d77 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Wed, 22 Feb 2017 00:51:08 +0000 Subject: [PATCH] Faster List Add --- .../src/System/Collections/Generic/List.cs | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/mscorlib/src/System/Collections/Generic/List.cs b/src/mscorlib/src/System/Collections/Generic/List.cs index 82f6e41c361e..6eeda8df078c 100644 --- a/src/mscorlib/src/System/Collections/Generic/List.cs +++ b/src/mscorlib/src/System/Collections/Generic/List.cs @@ -208,10 +208,34 @@ public class List : IList, System.Collections.IList, IReadOnlyList // increased by one. If required, the capacity of the list is doubled // before adding the new element. // - public void Add(T item) { - if (_size == _items.Length) EnsureCapacity(_size + 1); - _items[_size++] = item; + public void Add(T item) + { + if (_size < _items.Length) + { + AddWithoutResize(item); + } + else + { + AddWithResize(item); + } + } + + private void AddWithoutResize(T item) + { + var size = _size; + _version++; + _size = size + 1; + _items[size] = item; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private void AddWithResize(T item) + { + var size = _size; _version++; + _size = size + 1; + EnsureCapacity(size + 1); + _items[size] = item; } int System.Collections.IList.Add(Object item)