The code below is extremely slow for tables of any significant size. (100, 1000, etc...) The culprit is instantiating my objects with new T(). Note that this isn't my finalized code, I've just broken parts of it out in order to more easily profile. Instantiation and initialization will happen together once I refactor the code back into shape.
Is there any way to speed this up? I'm probably forgetting something really simple, or maybe I'm boned. Hopefully, the former.
public static IList<T> ToList<T>(this DataTable table) where T : Model, new()
{
T[] entities = new T[table.Rows.Count];
// THIS LOOP IS VERY VERY SLOW
for (int i = 0; i < table.Rows.Count; i++)
entities[i] = new T();
// THIS LOOP IS FAST
for (int i = 0; i < table.Rows.Count; i++)
entities[i].Init(table, table.Rows[i]);
return new List<T>(entities);
}
edit for more info:
The constructor of any given ModelType will look like this:
public ModelType()
{
_modelInfo = new ModelTypeInfo();
}
The constructor of any given ModelTypeInfo will simply set some string and string[] values, and that class' only job is to provide the values set.
edit for even more info:
Since it seems to be a hot topic, here is what my method looks like for reals before breaking out object construction and initialization:
public static IList<T> ToList<T>(this DataTable table, ModelInfo modelInfo) where T : Model, new()
{
var tempRepository = new Repository<T>(modelInfo);
var list = new List<T>();
foreach (DataRow row in table.Rows)
list.Add(tempRepository.FromData(table, row));
return list;
}
Under the covers, new T() generates a call to System.Activator.CreateInstance<T>(), which is (reflectively) slow:
L_0012: ldc.i4.0
L_0013: stloc.1
L_0014: br.s L_0026
L_0016: ldloc.0
L_0017: ldloc.1
L_0018: call !!0 [mscorlib]System.Activator::CreateInstance<!!T>()
L_001d: stelem.any !!T
L_0022: ldloc.1
L_0023: ldc.i4.1
L_0024: add
L_0025: stloc.1
You may wish to consider passing in a construction delegate instead.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With