Contexte: mon jeu utilise un système de composants. J'ai une classe Entity
qui a une liste de IComponent
instances dans un List<IComponent>
. Ma mise en œuvre actuelle de Entity.GetComponent<T>()
est:Linq Slowness sur un seul appel
return (T)this.components.Single(c => c is T);
Après avoir ajouté la détection de collision, j'ai remarqué mon jeu est tombé à 1FPS. Le profilage a révélé que le coupable était ce même appel (appelé 3000 fois par image). 3000x côté, j'ai remarqué que l'appel 300k fois cela prend environ 2 secondes. J'optimisé à simple boucle itérative:
foreach (IComponent c in this.components) {
if (c is T) {
return (T)c;
}
}
return default(T);
Ce code fonctionne maintenant dans environ 0,4s, ce qui est un ordre de grandeur mieux. Je pensais Single
serait beaucoup plus efficace qu'une seule boucle foreach. Que se passe t-il ici?
Vous pouvez remplacer Single par FirstOrDefault qui retournera simplement la première occurrence, devrait être aussi rapide que votre boucle itérative – Martheen
Si vous préférez faire abstraction de la conversion, vous pouvez utiliser 'OfType()' comme ceci: 'return this .components.OfType () .FirstOrDefault(); ' –
Merci Martheen et @RiskyMartin, je vais incorporer vos suggestions. – ashes999