tgoop.com/csharp_gepard/143
Last Update:
Новый params #скорость #память
Как многие знают, начиная с .NET 9 (C# 13) появилась возможность по новому взглянуть на ключевое слово params
. Напомню, что это ключевое слово позволяет программисту указывать несколько аргументов метода одного типа через запятую, которые, в самом методе, будут представлены в виде коллекции. Ранее этой коллекцией мог быть только массив. Теперь это может быть ReadOnlySpan
, Span
, List
и даже IEnumerable
.
Многие давно ждали, когда params можно будет использовать с ReadOnlySpan
, так как справедливо подозревали, что это существенно сократит аллокацию. Напомню, проблема использования метода с params состоит в том, что при каждом его вызове создаётся массив, который размещается в куче. И это было очень неприятно для тех парней, которые скрупулёзно следят за производительностью. Раньше им приходилось делать немного иначе, чтобы создавать аналог params.
Начиная с .NET 9 (C# 13) компилятор делает это сам.
Результаты хорошие - решение с params ReadOnlySpan<T>
значительно быстрее, чем params T[]
и, к тому же, вообще не аллцирует память в куче. См. скриншот.
Бенчмарк в комментариях.
P.S.: Для особо пытливых, которые хотят понять, а почему есть разница между ReadOnlySpan
и Span
, я рекомендую посмотреть low-level C# (в Rider, например). В первом случае используется RuntimeHelpers.CreateSpan
, а во втором случае создаётся InlineArray
размером в количество элементов (про него я писал тут).
BY C# Heppard

Share with your friend now:
tgoop.com/csharp_gepard/143