разница между Activator.CreateInstance и Activator.CreateInstance‹Type›

При написании следующего кода какая разница на них:

MyClass parcel;
for (int i = 0; i < 100000000; i++) parcel = (MyClass)Activator.CreateInstance(typeof(MyClass));
for (int i = 0; i < 100000000; i++) parcel = Activator.CreateInstance<MyClass>();

Я ожидал, что последний будет намного быстрее, потому что фактический тип уже известен во время компиляции, но я не вижу никаких различий. На моей машине оба работают примерно за 9 секунд. Так в чем же разница между ними, учитывая внутренне используемые ступени?


person HimBromBeere    schedule 10.02.2015    source источник
comment
это то же самое, что я вижу, но 2-й более элегантный   -  person Ehsan Sajjad    schedule 10.02.2015
comment
Общая версия просто выполняет приведение за вас. Это для удобства.   -  person Gusdor    schedule 10.02.2015
comment
Это плохо, я надеялся, что смогу выиграть несколько секунд, используя последнее... спасибо, однако   -  person HimBromBeere    schedule 10.02.2015
comment
Если вы хотите ускорить это, сгенерируйте Func‹T›, используя деревья выражений, которые создают экземпляр типа для вас.   -  person usr    schedule 10.02.2015


Ответы (1)


В самом простом случае взгляните на исходный код.

Activator.CreateInstance(type) вызывает Activator.CreateInstance(type, false);, который реализован следующим образом (сокращенная версия):

RuntimeType rt = type.UnderlyingSystemType as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

return rt.CreateInstanceDefaultCtor(!nonPublic, false, true, ref stackMark);

общая версия реализована (также сокращена) как:

RuntimeType rt = typeof(T) as RuntimeType;
StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;

return (T)rt.CreateInstanceDefaultCtor(true, true, true, ref stackMark);

Таким образом, единственное отличие состоит во втором логическом параметре с именем аргумента skipCheckThis, который делает некоторые незначительные внутренние тесты или нет. Из-за этого универсальная версия немного быстрее, потому что она просто пропускает эти тесты, но вы не сможете измерить эти различия.

person Oliver    schedule 10.02.2015