- Извините за неинформатические термины (самоучка)
- Извините за неправильную терминологию (Любой, кто хочет редактировать, пожалуйста, (самоучка))
Я искалнасколько я мог, с моим ограниченным знанием терминологии для того, что я искал, но я не мог найти и ответить на вопрос, который я задавал.
Я был удивлен, обнаружив, что заполнение объекта даннымибыло быстрее через Reflection
, чем при использовании object Initialization
.
Я сделал тестовое консольное приложение для этой цели. Сначала тестовый класс,
class TestClass
{
public string PropertyOne { get; set; }
public string PropertyTwo { get; set; }
public string PropertyThree { get; set; }
public string PropertyFour { get; set; }
public string PropertyFive { get; set; }
public string PropertySix { get; set; }
public string PropertySeven { get; set; }
public string PropertyEight { get; set; }
public string PropertyNine { get; set; }
public string PropertyTen { get; set; }
}
}
Затем методы для получения данных, сначала это отражение,
public static void ReflectionTest()
{
for (int i = 0; i < 10000000; i++)
{
TestClass testClass = new TestClass();
Type type = testClass.GetType();
PropertyInfo[] properties = type.GetProperties();
foreach (var propertyInfo in properties)
{
switch (propertyInfo.Name)
{
case nameof(testClass.PropertyOne):
propertyInfo.SetValue(testClass, "PropertyOne" + i);
break;
case nameof(testClass.PropertyTwo):
propertyInfo.SetValue(testClass, "PropertyTwo" + i);
break;
case nameof(testClass.PropertyThree):
propertyInfo.SetValue(testClass, "PropertyThree" + i);
break;
case nameof(testClass.PropertyFour):
propertyInfo.SetValue(testClass, "PropertyFour" + i);
break;
case nameof(testClass.PropertyFive):
propertyInfo.SetValue(testClass, "PropertyFive)" + i);
break;
case nameof(testClass.PropertySix):
propertyInfo.SetValue(testClass, "PropertySix" + i);
break;
case nameof(testClass.PropertySeven):
propertyInfo.SetValue(testClass, "PropertySeven" + i);
break;
case nameof(testClass.PropertyEight):
propertyInfo.SetValue(testClass, "PropertyEight" + i);
break;
case nameof(testClass.PropertyNine):
propertyInfo.SetValue(testClass, "PropertyNine" + i);
break;
case nameof(testClass.PropertyTen):
propertyInfo.SetValue(testClass, "PropertyTen" + i);
break;
}
}
TestClasses.Add(testClass);
}
}
Далее идет инициализация объекта,
public static void InitializationTest()
{
for (int i = 0; i < 10000000; i++)
{
TestClass testClass = new TestClass
{
PropertyOne = "PropertyOne" + i,
PropertyTwo = "PropertyTwo" + i,
PropertyThree = "PropertyThree" + i,
PropertyFour = "PropertyFour" + i,
PropertyFive = "PropertyFive)" + i,
PropertySix = "PropertySix" + i,
PropertySeven = "PropertySeven" + i,
PropertyEight = "PropertyEight" + i,
PropertyNine = "PropertyNine" + i,
PropertyTen = "PropertyTen" + i
};
TestClasses.Add(testClass);
}
}
Икод теста
static List<TestClass> TestClasses { get; set; } = new List<TestClass>();
static void Main(string[] args)
{
Stopwatch sw = new Stopwatch();
sw.Start();
ReflectionTest();
Console.WriteLine($"Reflection Test time: {sw.Elapsed}");
sw.Reset();
sw.Start();
InitializationTest();
Console.WriteLine($"Initialization Test time: {sw.Elapsed}");
sw.Stop();
}
При использовании этого кода отражение было на 20% быстрее при использовании объекта Initialization. В чем причина этого?
РЕДАКТИРОВАТЬ: добавление TestClasses.Clear();
в код показывает, что «инициализация объекта» почти в два раза быстрее. Спасибо за ответы и комментарии.