2011-06-16 3 views
2

J'ai gagné l'application 32 C++. Je dois charger 330 000 objets en mémoire. Si j'utilise une approche séquentielle, cela prend environ 16 minutes. Dans l'approche de threading, je divise les 330 000 objets également entre 10 conteneurs. Je crée 10 threads et j'assigne à chaque thread un conteneur de taille 33000 objets pour les charger en mémoire. Cette approche a pris environ 9 minutes.Mon approche est-elle éligible pour une approche Thread Pool?

Augmenter le nombre de fils n'a pas aidé .....

Vais-je obtenir une amélioration si j'utilise ThreadPool?

Répondre

3

Comme toujours sans détails, cela dépend.

-vous des objets à partir du disque ou chargez les créer en mémoire? Si vous les chargez à partir du disque, c'est probablement lié à IO, donc l'augmentation du nombre de threads n'aidera probablement pas beaucoup.

Dans le commentaire que vous avez mentionné que vous chargez à partir d'une base de données. Je présume que lorsque vous utilisez des threads, vous faites N requêtes en même temps? Il pourrait être utile d'étudier la console de la base de données pour comprendre comment elle se comporte avec de nombreuses requêtes simultanées. D'autre part, si les objets sont créés à la suite d'un processus lié à la CPU (p.ex. calcul de pi), alors les chances augmentent le nombre de threads plus que le nombre de processeurs n'augmentera probablement pas les performances (et ronag souligne dans les commentaires vont probablement nuire à la performance en raison de l'augmentation context switching).

Y at-il de dépendance entre les objets? Cela affecterait à nouveau comment les choses se passent.

Typiquement, vous utilisez un pool de threads si vous avez une collection de tâches indépendantes que vous souhaitez exécuter avec une manière configurable de les exécuter. Il semble que l'utilisation d'un pool de threads serait un bon moyen d'exécuter beaucoup de benchmarks avec différents paramètres de threads. Vous pouvez également configurer le nombre de threads configurables, ce qui serait utile lors de l'exécution sur différentes architectures/systèmes.

+0

Oui Je le chargement des objets de base de données –

+2

Je voudrais simplement ajouter que la création de plus de threads que CPUs non seulement pas augmenter les performances, il sera probablement même diminuer les performances. – ronag

+0

Oui les requêtes sont transmises simultanément à la base de données. Les requêtes sont affinées. Alors ai-je atteint la performance optimale? –

0

EMI, et le vôtre, quelques fils va accélérer ce genre de tâche. Je suppose que le débit global est amélioré en raison d'une meilleure utilisation de la mise en cache de disque «intelligente» disponible sur les contrôleurs modernes - le disque/contrôleur passe moins de temps inactif car il y a toujours des threads désirant lire quelque chose. Les rendements décroissants s'installent, cependant, après seulement quelques threads sont chargés et vous êtes lié au disque. Dans une application légèrement similaire, j'ai trouvé que plus de 6 threads fournis aucun avantage supplémentaire & juste utilisé plus de mémoire.

Je ne vois pas comment la mise en commun, ou non, de ces fils ferait une différence à la performance - il est juste un gros travail qui doit être fait :(

Faites savoir à vos clients qu'ils doivent installer un SSD

Mfg, Martin