2010-12-13 25 views
33

Tôi đang sử dụng RedGate để thực hiện một số đánh giá hiệu suất. Tôi nhận thấy tự động tạo một cá thể bằng cách sử dụng Activator.CreateInstance (với hai tham số hàm tạo) đang chiếm một khoảng thời gian khá ... có một phương án tốt hơn vẫn sử dụng một cách tiếp cận phản chiếu (không rõ ràng)?Activator.Create Performance Performance Alternative

+0

Tôi đã cung cấp câu trả lời [ở đây] (http://stackoverflow.com/a/16162809/661933) cho trường hợp mặc định. – nawfal

Trả lời

35
+1

+1. Nếu điều đó vẫn chưa đủ nhanh thì bạn có thể thử phản xạ phát ra, nhưng điều đó không có khả năng mang lại nhiều cải tiến hơn một lambda biên dịch, và nó là một LOT phức tạp hơn để viết mã. –

+1

Dịch vụ Biên dịch() có hoạt động chậm hơn hay nhanh hơn không? Tôi giả sử hiệu suất được tính mà không bao gồm thời gian biên dịch? Trong các tình huống trong đó nhiều phiên bản của các kiểu khác nhau là cần thiết và loại đối tượng được xác định trong thời gian chạy, sẽ chậm hơn rất nhiều khi có thao tác biên dịch mọi lúc hơn Activator.CreateInstance? –

+8

Liên kết đó hiện là 404 –

12

Đừng quên về DynamicMethod

Dưới đây là ví dụ làm thế nào để tạo ra ví dụ mới qua constructor mặc định

public static ObjectActivator CreateCtor(Type type) 
{ 
    if (type == null) 
    { 
     throw new NullReferenceException("type"); 
    } 
    ConstructorInfo emptyConstructor = type.GetConstructor(Type.EmptyTypes); 
    var dynamicMethod = new DynamicMethod("CreateInstance", type, Type.EmptyTypes, true); 
    ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); 
    ilGenerator.Emit(OpCodes.Nop); 
    ilGenerator.Emit(OpCodes.Newobj, emptyConstructor); 
    ilGenerator.Emit(OpCodes.Ret); 
    return (ObjectActivator)dynamicMethod.CreateDelegate(typeof(ObjectActivator)); 
} 

public delegate object ObjectActivator(); 

đây là thêm về performance comparison

Đo InvokeMember .. 1000000 lần lặp trong 1,5643784 giây.

Đo MethodInfo.Invoke ... 1000000 lần lặp trong 0.8150111 giây.

Đo DynamicMethod ... 1000000 lần lặp trong 0,0330202 giây.

Đo cuộc gọi trực tiếp ... 1000000 lần lặp trong 0,0136752 giây.

+1

so sánh hiệu suất [http://www.wintellect.com/blogs/krome/getting-to-know-dynamicmethod] hiển thị 404 ngay bây giờ. – Lcng