Вы не устранили первые эффекты выполнения, такие как JIT. Обобщения должны быть скомпилированы один раз для каждого аргумента типа значения.
ArrayList
уже предварительно скомпилирован с помощью ngen.
List<T>
прекомпилируется только для определенных типов параметров (я читал, что базовые библиотеки создают некоторые из наиболее важных обобщений для общих аргументов, таких как object, bool, int, ...), если таковые имеются. Так что это повлечет за собой единовременную стоимость.
Следует также отметить, что большая часть стоимости производительности ArrayList
является косвенной: бокс оказывает большее давление на ГХ и использует больше памяти. Но ваш тест не будет измерять это. Стоимость производства большего количества мусора также зависит от того, сколько других объектов существует, и от времени жизни объектов.
Когда вы пишете тесты, вы должны либо выполнить весь код один раз перед фактическим тестом, либо использовать столько итераций, что затраты на единовременное использование будут незначительными. Также важно использовать сборку релиза и запускать без отладчика .