Il seguente codice è estremamente lento per le tabelle di qualsiasi dimensione significativa. (100, 1000, ecc.) Il colpevole sta istanziando i miei oggetti con new T()
. Si noti che questo non è il mio codice finalizzato, ne ho solo suddiviso alcune parti per rendere più semplice il profilo. L'istanziazione e l'inizializzazione avverranno insieme una volta che il codice sarà tornato in forma.Come posso velocizzare la creazione di istanze di una vasta raccolta di oggetti?
C'è un modo per velocizzare questo? Probabilmente sto dimenticando qualcosa di veramente semplice, o forse sono disossato. Spero che il primo.
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);
}
modifica per ulteriori informazioni:
Il costruttore di un dato ModelType
sarà simile a questa:
public ModelType()
{
_modelInfo = new ModelTypeInfo();
}
Il costruttore di un dato ModelTypeInfo
sarà sufficiente impostare qualche stringa e string [] valori e quel solo lavoro di classe è di fornire i valori impostati.
di modifica per ancora più informazioni:
Dal momento che sembra essere un tema caldo, qui è quello che il mio metodo assomiglia per reali prima di scoppiare la costruzione oggetto e l'inizializzazione:
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;
}
fuori tema: Perché non basta creare un '' lista, in primo luogo, invece di un 'T []' e poi trasformarla in una lista? Inoltre, perché 'for' invece di' foreach'? –
Svish
In realtà, questo * è * quello che faccio. Ho appena infranto il codice in questo modulo a scopo dimostrativo. Sai, per mostrare dove il codice è lento, usando il minimo di magia possibile. –