Tôi nghi ngờ rằng bạn sẽ tìm thấy bất kỳ hình phạt hiệu suất đáng kể nào khi sử dụng thông số out
. Bạn phải lấy lại thông tin cho người gọi bằng cách nào đó hoặc khác - out
chỉ là một cách khác để thực hiện nó. Bạn có thể thấy có một số hình phạt nếu bạn sử dụng tham số ngoài rộng rãi trong phương thức, vì nó cũng có thể có nghĩa là một mức độ chuyển hướng bổ sung cho mỗi quyền truy cập. Tuy nhiên, tôi sẽ không mong đợi nó là đáng kể. Như bình thường, hãy viết mã dễ đọc nhất và test whether performance is already good enough trước khi cố gắng tối ưu hóa thêm.
CHỈNH SỬA: Phần còn lại của điều này là một cách hiệu quả. Nó chỉ thực sự phù hợp với các loại giá trị lớn, mà nên thường tránh được anyway :)
Tôi không đồng ý với xác nhận của Konrad về "giá trị trả về cho tất cả các loại> 32 bit được xử lý tương tự hoặc giống hệt với đối số ngoài mức máy" Tuy nhiên. Dưới đây là một ứng dụng thử nghiệm nhỏ:
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();
}
}
Kết quả:
Using return value: 11316
Using out parameter: 7461
Về cơ bản bằng cách sử dụng một tham số ra chúng tôi đang ghi dữ liệu trực tiếp đến đích cuối cùng, chứ không phải là ghi nó vào stack frame phương pháp nhỏ của và sau đó sao chép nó trở lại khung ngăn xếp của phương thức Main.
Hãy thoải mái chỉ trích ứng dụng điểm chuẩn mặc dù tôi có thể đã bỏ lỡ điều gì đó!
Nguồn
2009-02-09 12:58:17
Kết quả intersting - trong trường hợp của tôi tham số out chỉ là một int enum, không có gì lớn mặc dù. –
Jon: hãy xem xét câu trả lời của tôi cho nhận xét của bạn. Mã của bạn thực sự khá tốt vì nó cho thấy sự thiếu tối ưu hóa đáng thương trong các giá trị trả lại nhưng nó không phải là ý tôi với câu nói của tôi. –
@Konrad: Sau đó, tôi đề nghị bạn sửa lại tuyên bố của mình. Tham số C# out rõ ràng là * không * được xử lý giống như giá trị trả về C# ở mức máy trong .NET. –