Есть 2 класса:
public class MyClass
{
public int Prop { get; set; }
}
public class MyClass2
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
public int Prop5 { get; set; }
}
Конструкторы этих классов отработают за одинаковое количество времени или нет?
Ответ
Исследования показали, что время выполнения конструктора зависит от количества памяти, выделяемой под экземпляр класса. Соответственно, поля и свойства с неявными get/set (как у вас) влияют, а методы и свойства с явными get/set не влияют (память под них в экземпляре не выделяется).
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleTest
{
public class LittleClass
{
public int Prop0 { get; set; }
}
public class BigClass
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
public int Prop4 { get; set; }
public int Prop5 { get; set; }
}
class Program
{
const int N = 100000000;
static void Main(string[] args)
{
Stopwatch s;
int i;
LittleClass lc = new LittleClass();
BigClass bc = new BigClass();
/* ------------------------------------------------------------------*/
s = new Stopwatch();
Console.WriteLine("BigClass test...");
s.Start();
for (i = 0; i < N; i++)
{
bc = new BigClass();
}
s.Stop();
Console.WriteLine("t=" + s.ElapsedMilliseconds.ToString());
/* ------------------------------------------------------------------*/
s = new Stopwatch();
Console.WriteLine("LittleClass test...");
s.Start();
for (i = 0; i < N; i++)
{
lc = new LittleClass();
}
s.Stop();
Console.WriteLine("t=" + s.ElapsedMilliseconds.ToString());
/* ------------------------------------------------------------------*/
Console.ReadKey();
}
}
}
Результат (оптимизация включена)
По моим расчетам, время инициализации класса описывается формулой
t=(2,6*s+43,8)/(10^7) мс
где s - суммарный размер типов всех членов, под которые память выделяется (см.выше),
с коэффициентом корелляции 0,99.
Наличие постоянной составляющей, я полагаю, объясняется наличие служебной информации, под которую выделяется, предположительно, 16 байт.
Исследование проводилось на машине с процессором с тактовой частотой 2.33 ГГц. Для вычисления времени, не зависимого от машины, надо эту формулу умножить на тактовую частоту, получая время в "тактах процессора":
t = 0,6*s+10,9
Комментариев нет:
Отправить комментарий