Честно говоря, я немного обеспокоен тем, что все кричат "преждевременная оптимизация!" И вот почему.
- То, что вы говорите, имеет смысл, особенно , как вы уже указали, вы работаете над высокопроизводительной библиотекой.
- Даже классы BCL следуют этой схеме. Учитывайте все перегрузки
string.Format
или Console.WriteLine
.
- Это очень легко понять . Вся причина движения против преждевременной оптимизации заключается в том, что когда вы делаете что-то хитрое в целях оптимизации производительности, вы можете случайно что-то сломать и сделать свой код менее понятным , Я не вижу, как это опасно здесь; это должно быть очень просто для вас, как для себя, так и для любого будущего разработчика, который может работать с вашим кодом.
Кроме того, даже если вы профилировали результаты обоих подходов и видели только очень небольшую разницу в скорости, все равно остается проблема выделения памяти. Создание нового массива для каждого вызова метода влечет за собой выделение большего объема памяти, которая впоследствии потребуется для сборки мусора. А в некоторых сценариях, где желательно «почти» поведение в реальном времени (например, алгоритмическая торговля, поле I'm in), минимизация сборок мусора так же важна, как и максимизация скорости выполнения.
Так что, даже если это принесет мне несколько отрицательных голосов: я говорю, дерзайте.
(И тем, кто утверждает, что «компилятор наверняка уже делает что-то подобное» - я бы не был так уверен. Во-первых, если бы это было так, я не понимаю, почему классы BCL следовали бы этому шаблону, так как Я уже упоминал. Но что более важно, существует очень большая семантическая разница между методом, который принимает несколько аргументов , и методом, который принимает массив . Просто потому, что один может использование в качестве замены для другого не означает, что компилятор или должен предпринять попытку такой замены).