Question

J'ai une application avec de lourdes opérations d'entrées-sorties telles que copie du fichier, la compression et le déplacement des fichiers dans le système de fichiers, copie de sauvegarde sur les serveurs.

Je construire ce programme comme un seul thread. Il fonctionne en 2 minutes.

Je construit une autre version de ce programme avec des extensions parallèles et en utilisant la tâche, qui se déroule presque en 2 minutes aussi.

En d'autres termes, je na pas voir un gain de performance en utilisant Parallels en raison de IO lourds.

Aurais-je obtenir les mêmes résultats si je Déployez l'application sur un serveur lame?

traiter les serveurs lame ne IO plus rapide / sur les canaux multiples que mon poste de travail?

Il n'y a pas avantage d'utiliser Parallels avec des applications lié IO?

Était-ce utile?

La solution

Si tout ce que vous faites est de copier ou de déplacer des fichiers à travers le système, puis le parallélisme fourni par le TPL ne va pas vous faire beaucoup de bien. Déplacement par exemple utiliser ne vraiment pas CPU, il change simplement l'emplacement des fichiers dans la structure d'enregistrement du répertoire du disque.

La compression de fichiers est une autre histoire. Ici vous envoyons les données et le chargement en utilisant le processeur pour compresser avant de l'enregistrer sur le disque. Vous pourriez être en mesure d'utiliser un pipeline ou Comment: Compress Files

Autres conseils

Si vous déplacer des fichiers sur un périphérique, vous n'allez voir beaucoup d'avantages de performance de faire plusieurs demandes d'entrées-sorties de parallèle au même dispositif. Le dispositif fonctionne déjà plusieurs ordres de grandeur plus lente que la CPU, si plusieurs demandes en parallèle alignera encore à manipuler un par un sur l'appareil. Votre code parallèle est publié en feuilleton parce que tout accès au même appareil qui ne peut pas vraiment gérer plus d'une demande à la fois.

Vous pouvez voir une petite amélioration de la perf avec le code parallèle si votre contrôleur de disque met en œuvre « ascenseur cherche », « dispersion-réunion », ou d'autres opérations hors-commande, mais la différence de perf sera relativement faible.

Si vous devriez trouver un fichier plus gratifiant pour le fichier perf différence E / S est lorsque vous vous déplacez entre de nombreux périphériques physiques. Vous devriez être en mesure de se déplacer ou copier un fichier sur le disque A à un autre emplacement sur le disque A lors de la copie également un fichier sur le disque B sur le disque C. Avec de nombreux périphériques physiques, vous n'avez pas toutes les requêtes parallèles empilage attendant l'un des dispositifs pour remplir toutes les demandes.

Vous verrez probablement des résultats similaires avec le réseau E / S: Si tout se passe par le biais d'une carte Ethernet / segment de réseau que vous ne va pas réaliser autant le parallélisme que lorsque vous avez plusieurs cartes Ethernet et plusieurs segments de réseau au travail avec.

Je pense que l'avantage des extensions parallèles pourraient être importantes sur les opérations CPU. Donnu comment il est censé affecter IO tho.

Tout dépend si vous êtes lié ou lié IO CPU. Je vous conseille de faire des tests de performance pour voir où vous embouteiller le cou sont.

Si vous trouvez que vous déplacez et la compression d'un grand nombre de fichiers (à des disques différents, en déplacement sur le même disque est juste un changement de table FAT) vous pouvez regarder la mise en œuvre d'un moteur de fichiers de streaming qui compresse comme il se déplace . Cela peut sauver l'extra IO de relire les fichiers après les déplacer. Je l'ai fait avec le déplacement et la somme de contrôle et dans mon cas a été une énorme bosse de performance.

Hope this helps.

J'ai une application qui est mis en œuvre dans WinForms que les processus ~ 7800 URL dans environ 5 minutes (téléchargements l'URL, analyse le contenu, recherche des pièces spécifiques de données et si elle trouve que sa recherche fait un peu de traitement supplémentaire de ce données.

Cette application spécifique utilisée pour prendre entre 26 à 30 minutes à courir, mais en changeant le code à la TPL (Task Parallel Library .NET v4.0), il exécute en seulement 5. L'ordinateur est une station de travail Dell T7500 avec processeurs dual quad core Xeon (3 GHz), fonctionnant avec 24 Go de mémoire vive, et Windows 7 Ultimate édition 64 bits.

Bien que ce n'est pas exactement la même chose que votre situation cela aussi est extrêmement IO intensive. La documentation sur TPL affirme qu'il a été initialement conçu pour les jeux de problème lié processeur, mais cela ne règle pas l'utiliser dans des situations IO (comme ma demande me démontre). Si vous avez au moins 4 cœurs et vous vous ne voyez pas votre perte de temps de traitement de manière significative, alors il est possible d'autres problèmes de mise en œuvre qui empêchent la TPL de vraiment être efficaces (serrures, articles de disque dur, etc.). Le livre Programmation parallèle avec Microsoft .NET m'a vraiment aidé à comprendre « comment » vos besoins de code à modifier pour vraiment profiter de toute cette puissance.

Cela vaut le coup à mon avis.

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