Я сомневаюсь, что вы найдете какое-либо существенное снижение производительности при использовании параметра out
. Вы должны так или иначе вернуть информацию вызывающей стороне - out
- это просто другой способ сделать это. Вы можете найти штраф некоторое , если вы широко используете параметр out в методе, поскольку это может означать дополнительный уровень перенаправления для каждого доступа. Однако я не ожидаю, что это будет значительным. Как обычно, напишите наиболее читаемый код и проверьте, достаточно ли высока производительность , прежде чем пытаться оптимизировать его.
РЕДАКТИРОВАТЬ: Остальное это в стороне, эффективно. Это действительно актуально только для типов с большими значениями, которых обычно следует избегать:)
Я не согласен с утверждением Конрада о том, что «возвращаемые значения для всех типов> 32-битные обрабатываются аналогично или идентичны аргументам out на уровне машины». Вот небольшое тестовое приложение:
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
struct BigStruct
{
public Guid guid1, guid2, guid3, guid4;
public decimal dec1, dec2, dec3, dec4;
}
class Test
{
const int Iterations = 100000000;
static void Main()
{
decimal total = 0m;
// JIT first
ReturnValue();
BigStruct tmp;
OutParameter(out tmp);
Stopwatch sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
BigStruct bs = ReturnValue();
total += bs.dec1;
}
sw.Stop();
Console.WriteLine("Using return value: {0}",
sw.ElapsedMilliseconds);
sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
BigStruct bs;
OutParameter(out bs);
total += bs.dec1;
}
Console.WriteLine("Using out parameter: {0}",
sw.ElapsedMilliseconds);
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static BigStruct ReturnValue()
{
return new BigStruct();
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static void OutParameter(out BigStruct x)
{
x = new BigStruct();
}
}
Результаты:
Using return value: 11316
Using out parameter: 7461
По сути, используя параметр out, мы записываем данные непосредственно в конечный пункт назначения, а не записываем их в кадр стека небольшого метода, а затем копируем их обратно в кадр стека метода Main.
Не стесняйтесь критиковать тестовое приложение - возможно, я что-то пропустил!