2012-05-21 2 views
0

J'ai un programme que j'essaie de faire fonctionner aussi vite que possible. Ce programme charge un certain nombre de sites Web différents et effectue quelques raclage sur eux. J'avais l'habitude d'effectuer le grattage en utilisant le Forms.HtmlDocument (je le télécharge fondamentalement en utilisant WebRequests puis je le pousse dans un document en utilisant un contrôle WebBrowser) - mais il est impossible de paralléliser proprement parce que je ne peux pas force le WebBrowser à mettre à jour quand ce n'est pas le thread principal. J'ai donc décidé d'essayer le HtmlAgilityPack, pensant que je pourrais peut-être paraléliser cela. Cependant je lis le post suivant:HtmlAgility Pack Parallélisation VS Winforms HtmlDocument Vitesse

How to get max performance using Parallel.For/ForEach? (performance timings included)

Ce qui donne à penser que cela n'a pas vraiment paralelise très bien.

La conversion de tout le code prendra du temps (en raison des bizarreries et de la complexité de tout cela) - mais j'aimerais savoir si cela en vaut la peine ou non. Si j'évite d'utiliser WebGet (et que j'obtiens un flux en utilisant WebRequest et que je l'insère dans l'AgilityPack), cela me permettra-t-il d'augmenter les performances? Actuellement, cela prend environ 19 secondes pour chaque itération, avec la majorité du temps passé à attendre le téléchargement de la page.

Toutes les autres idées seront prises en considération. Merci.

EDIT: Alors que nous sommes ici, est-il une augmentation de la vitesse à l'utilisation ou l'autre méthode

Répondre

1

Pour mon cas htmlagilitypack fonctionnait très bien (même dans un environnement mono-thread?). L'un des gros problèmes est la conformité RFC qui devrait être surenchère lorsque vous créez des applications de migration qui s'exécutent le plus rapidement possible.

1) Ajouter ceci au beggining de votre principale méthode

System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

2) paralléliser avec la bibliothèque de multithreading normale et non tpl.

+0

Par 'bibliothèque multithread normale', je suppose que vous voulez dire démarrer des Threads et non System.Parallel? – Aabela

+0

Les threads de démarrage Yeap vous donnent plus de contrôles. Bien que je n'ai pas creusé dans les détails, TPL est optimisé pour créer autant de threads que votre processeur peut supporter. Au contraire la raison pour laquelle vous parallélisez votre application dans ce cas n'est pas de saturer votre processeur mais de faire beaucoup de connexions http en parallèle. – Lakis

Questions connexes