Question

J'utilise subsonic 2 depuis ~ 5 ans maintenant et je l'ai adoré. Cependant, depuis six mois, j'ai joué avec l'idée de passer à Subsonic 3 ou vers un outil ORM similaire. Puisque mon entreprise utilise de nombreux outils de Telerik, j'ai pensé que j'essaierais OpenAccess. Après l'avoir configuré, j'ai pensé que j'essaierais une tâche extrêmement basique de charger un radgrid avec des informations de la table de notre utilisateur (~ 30 enregistrements).

Donc, dans l'événement OnNeedDatasource de la grille, j'ai ce qui suit:

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);

Après avoir construit cela et exécuté la page, il recrute qu'il a fallu 1607 ms. Cependant, après avoir rafraîchi la page, il revient en 0 seconde. (Pourquoi?)

J'ai ensuite mis le code subsonique:

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);

J'exécute le code pour la première fois et il dit qu'il a fallu 171 ms. Après avoir rafraîchi la page, il rapporte qu'il a fallu 60 à 70 ms.

Donc, ma question est: Pourquoi OA prend-il beaucoup plus de temps à charger lors de la première visite, mais zéro seconde à charger sur chaque page de rafraîchissement? Alors que Subsonic est considérablement plus rapide lors de la première visite, mais prend ~ 65 ms sur chaque page de rafraîchissement?

Je m'excuse s'il s'agit d'une question "de base" ou si je ne teste pas les performances de manière adéquate. S'il existe un moyen d'améliorer cette méthode, j'apprécierais grandement des conseils.

Merci, Andrew

Était-ce utile?

La solution

OpenAccess a un objet de base de données interne qui est créé la première fois que vous créez un OpenCcCessContext. Il calcule essentiellement toutes les valeurs par défaut, crée des caches, initialise d'autres objets d'infrastructure, etc. dès qu'il est créé, il est stocké dans un dictionnaire statique interne (avec la connexion étant la clé).

Tous les autres contextes créés, utiliseraient cet objet interne et n'auraient pas du tout les frais généraux. Cela étant dit, 1600 ms est un peu élevé, vous pourriez envisager de modifier le type de mappage (XML est optimal, en termes de performances).

Une optimisation serait de s'assurer que le modèle est initialisé dans le gestionnaire de démarrage de l'application. Le code suivant doit faire l'affaire.

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

Edit: En tant que suivi, il est dit 0 ms, et ce n'est pas en fait le temps d'exécution de la requête. Ce que le retour de la requête est un iQueryable qui est exécuté plus tard. Vous devez appeler Tolist () afin d'obtenir des données réelles.

Autres conseils

La raison pourrait être que l'ouverture d'une base de données dans OpenAccess prend plus de temps que dans subsonique. Essayez d'effectuer une opération triviale comme obtenir un décompte juste pour ouvrir la base de données avant de mesurer le temps de chargement. Faites de même en subsonique aussi.

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

Je ne sais pas si c'est hors sujet, mais j'ai utilisé et contribué à SS2 et SS3 au cours des dernières années. Je viens de terminer une refonte et ajouté un MSAccessProvider à SS2, et des générateurs d'énumération à SS2 et SS3 (ceux-ci sont engagés et en direct sur la page du projet).

J'ai également mis en place mon propre cadre de mise en cache pour SS3 qui permet une mise en cache sélective automatisée des données (en tant que dictionnaires génériques) à partir de tableaux de la base de données référencés par tout index unique. J'ai pu mettre en cache des données de recherche pour la génération basée sur les modèles de pages Web et améliorer la réponse à partir d'environ 2 minutes avec des recherches SS3 LINQ à une fraction de seconde. (Je n'ai pas libéré cela publiquement)

Je ne sais tout simplement pas où publier ce genre de choses afin d'attirer l'attention des utilisateurs de SS. Mes engagements à la source et la fermeture des problèmes ouverts ont généré précisément zéro réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top