Domanda

Uso SubSonic 2 da ~ 5 anni e l'ho adorato. Tuttavia, negli ultimi sei mesi ho giocato con l'idea di passare a SubSonic 3 o ad uno strumento ORM simile. Poiché la mia azienda utilizza molti strumenti di Telerik, ho pensato di provare OpenAccess. Dopo averlo configurato, ho pensato di provare un'attività estremamente semplice di caricare un RadGrid con le informazioni dalla nostra tabella Users (~ 30 record).

Quindi, all'interno dell'evento OnNeedDataSource di Grid ho quanto segue:

var start = System.Environment.TickCount;
context = new EntitiesModel();
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Dopo averlo compilato ed eseguito la pagina, risponde che ci sono voluti 1607 ms. Tuttavia, dopo aver aggiornato la pagina, torna a 0 secondi. (Perché?)

Quindi inserisco il codice SubSonic:

var start = System.Environment.TickCount;
rgUsers.DataSource = new UserCollection().Load();
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Eseguo il codice per la prima volta e dice che ci sono voluti 171 ms. Dopo aver aggiornato la pagina, segnala che ci sono voluti 60-70 ms.

Quindi, la mia domanda è: perché OA impiega molto più tempo per caricarsi alla prima visita, ma zero secondi per caricarsi ad ogni aggiornamento di pagina? Considerando che SubSonic è notevolmente più veloce alla prima visita, ma impiega ~ 65 ms ad ogni aggiornamento della pagina?

Mi scuso se questa è una domanda "di base" o se non sto testando adeguatamente le prestazioni. Se c'è un modo per migliorare questo metodo, apprezzerei molto qualsiasi consiglio.

Grazie, Andrew

È stato utile?

Soluzione

OpenAccess ha un oggetto Database interno che viene creato la prima volta che crei un OpenAcccessContext.Fondamentalmente calcola tutti i valori predefiniti, crea cache, inizializza altri oggetti dell'infrastruttura, ecc. Non appena viene creato viene memorizzato in un dizionario statico interno (con connectionID come chiave).

Ogni altro contesto creato, userebbe quell'oggetto interno e non avrebbe affatto l'overhead.Detto questo 1600 ms è un po 'alto, potresti considerare di cambiare il tipo di mappatura (xml è ottimale, dal punto di vista delle prestazioni).

Un'ottimizzazione potrebbe essere quella di assicurarsi che il modello sia inizializzato nel gestore di avvio dell'applicazione.Il codice seguente dovrebbe fare il trucco.

void Application_Start(object sender, EventArgs e)
{
    var modelInfo = new EntitiesModel().Metadata;
}

EDIT: come seguito, dice 0 ms, e questo non è effettivamente il tempo di esecuzione della query.Quello che la query restituisce è un IQueryable che viene eseguito successivamente.Devi chiamare ToList () per ottenere dati reali.

Altri suggerimenti

Il motivo potrebbe essere che l'apertura di un database in OpenAccess richiede più tempo rispetto a SubSonic.Prova a eseguire un'operazione banale come ottenere un conteggio solo per aprire il database prima di misurare il tempo di caricamento.Fai lo stesso anche in SubSonic.

context = new EntitiesModel();
context.Users.Count();
var start = System.Environment.TickCount;
rgUsers.DataSource = (from u in context.Users select u);
var stop = System.Environment.TickCount;
var elapsed = stop - start;
litTelerik.Text = string.Format("This process took <b>{0}</b> milliseconds", elapsed);

Thomas

Non so se sia fuori tema, ma negli ultimi anni ho utilizzato e contribuito a SS2 e SS3. Ho appena completato una revisione e aggiunto un MsAccessProvider a SS2 e i generatori Enum a SS2 e SS3 (questi sono impegnati e attivi nella pagina del progetto).

Ho anche messo insieme il mio framework di caching per SS3 che consente il caching selettivo automatizzato dei dati (come dizionari generici) dalle tabelle nel database a cui fa riferimento un indice univoco.Sono stato in grado di memorizzare nella cache i dati di ricerca per la generazione basata su modelli di pagine Web e migliorare la risposta da circa 2 minuti con le ricerche LINQ SS3 a una frazione di secondo.(Non l'ho rilasciato pubblicamente)

Non sono sicuro di dove postare questa roba per attirare l'attenzione degli utenti di SS.I miei impegni per la fonte e la chiusura dei problemi aperti hanno generato esattamente zero risposte.

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