Domanda

Redgate prestazioni profiler per testare il mio asp.net mvc 2 applicazione. Una delle cose che ho scoperto è stato il XMLSerializer stava prendendo troppo del tempo di CPU in modo da riferimento questo post . Ho cambiato dove utilizza XmlSerializerCache ora.

Ora la questione XmlSerializer non c'è più e io sono profilazione l'applicazione simulando 80 utenti allo stesso tempo utilizzando il sito web con Jmeter. Così ora i metodi migliori, che richiedono tempo stanno facendo un FirstOrDefault() su alcuni dati che sto tirando Darò esempio-

var values=(from c in DataContext.Table1
           join s in DataContext.Table2 on new { c.Id, c.date } 
            equals new { s.Id, s.date } into list
                          where c.Id== Id && c.date == date
                          from s in list.DefaultIfEmpty()
                          select new DayDTO()
                          {
                              Points = c.points,
                              Points1 = c.points1,
                              Points2 = c.points2,
                              Points3 = c.points3,
                              Points4 = c.points4
                          }).FirstOrDefault();

Qualcuno mi può suggerire cosa posso fare per migliorare questa? I tempi attuali sono di 25 secondi e 16 secondi per i primi 2 metodi .. E 'solo perché sto simulando 80 utente allo stesso tempo e ci sono alcuni problemi sul database (SQL Server 2005) lato come il tavolo di essere troppo grande e l'indicizzazione ecc ... e guarderò in questo, ma attualmente sto cercando di identificare eventuali problemi che si vedono con il codice vale a dire le questioni su C # lato ..

Gradirei qualsiasi aiuto, grazie!

È stato utile?

Soluzione

Questo presuppone che il miglior tempo è il "tempo compreso", non il "tempo di esclusivo".

significa tempo Inclusive che include qualsiasi codice chiamato dal metodo, in questo caso il FirstOrDefault eseguirà la chiamata del database. chiamate al database sono costose nel contesto di latenza, ma il filo CPU è bloccato e non con la CPU in attesa della chiamata al database.

Per prima cosa dovresti chiederti se questo è un problema, non influisce in modo significativo il throughput (assumendo che il server di database in grado di gestire il carico), ma la latenza delle chiamate.

Se questo è un problema è necessario per accelerare la query effettiva SQL. Si dovrebbe iniziare SQL Profiler, prendere la domanda attuale, quindi eseguirlo in studio gestione SQL. Guardate il piano di esecuzione per vedere se la query è più lento del previsto e cercare di capire il perché. Se è troppo lento si potrebbe verificare l'indicizzazione per cominciare.

Altri suggerimenti

FirstOrDefault viene probabilmente chiamato fuori come il colpevole semplicemente perché è il metodo che sta costringendo censimento nel tuo caso. Se hai gettato in un ToList () prima di esso, che si può trovare il passaggio onere di ToList ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top