Sto lavorando a una sezione di un progetto che utilizza un gran numero di metodi di somma. Questi metodi somma vengono applicati su una DatatableConfronto dei metodi di somma in C#
Per testare il metodo migliore, uso la seguente
struttura Datatable
class LogParser
{
public DataTable PGLStat_Table = new DataTable();
public LogParser()
{
PGLStat_Table.Columns.Add("type", typeof(string));
PGLStat_Table.Columns.Add("desc", typeof(string));
PGLStat_Table.Columns.Add("count", typeof(int));
PGLStat_Table.Columns.Add("duration", typeof(decimal));
PGLStat_Table.Columns.Add("cper", typeof(decimal));
PGLStat_Table.Columns.Add("dper", typeof(decimal));
PGLStat_Table.Columns.Add("occurancedata", typeof(string));
}
}
seguente metodo viene utilizzato per riempire la tabella
LogParser pglp = new LogParser();
Random r2 = new Random();
for (int i = 1; i < 1000000; i++)
{
int c2 = r2.Next(1, 1000);
pglp.PGLStat_Table.Rows.Add("Type" + i.ToString(), "desc" + i , c2, 0, 0, 0, " ");
}
- Sum viene applicato sulla colonna di conteggio, dove il valore di c2 viene aggiornato
Seguendo metodi utilizzati per calcolare Sum
Metodo 1 utilizzando Compute
Stopwatch s2 = new Stopwatch();
s2.Start();
object sumObject;
sumObject = pglp.PGLStat_Table.Compute("Sum(count)", " ");
s2.Stop();
long d1 = s2.ElapsedMilliseconds;
Metodo 2 utilizzando il ciclo Foreach
s2.Restart();
int totalcount = 0;
foreach (DataRow dr in pglp.PGLStat_Table.Rows)
{
int c = Convert.ToInt32(dr["count"].ToString());
totalcount = totalcount + c;
}
s2.Stop();
long d2 = s2.ElapsedMilliseconds;
Metodo 3 utilizzando Linq
s2.Restart();
var sum = pglp.PGLStat_Table.AsEnumerable().Sum(x => x.Field<int>("count"));
MessageBox.Show(sum.ToString());
s2.Stop();
long d3 = s2.ElapsedMilliseconds;
Dopo confronto i risultati sono
a) foreach è il più veloce 481ms
b) è prossimo 1016ms LINQ
c) e quindi Calcola 2253 ms
Query 1
ho accidentalmente cambiare "c2 per i" nella seguente dichiarazione
pglp.PGLStat_Table.Rows.Add("Type" + i.ToString(), "desc" + i , i, 0, 0, 0, " ");
La dichiarazione Linq causano un errore
operazione aritmetica ha comportato un overflow.
Mentre il ciclo Compute e Foreach è ancora in grado di completare il calcolo anche se forse non è corretto.
È un tale comportamento un motivo di preoccupazione o mi manca una direttiva? (anche le cifre calcolate sono grandi)
Query 2
ero sotto l'impressione Linq fa più veloce, c'è un metodo o parametro ottimizzata che rende rendimento migliore.
grazie per consigli
Arvind
accetto questo come risposta perché hai mostrato un altro modo per calcolare il risultato – arvind