c # .net4 - Regex vs HTML Agilität Paket




 Was ist schneller? Ich habe gerade einen Web-Scraper erstellt, der das HTML Agility-Paket verwendet und sehr viel Speicher verbraucht. 

 Bei der Profilerstellung mit einem Speicherprofiler habe ich festgestellt, dass die Instanzen HTMLDocument, HTMLNode usw. den größten Speicherbedarf haben. 

 Ich habe das Gefühl, dass es vielleicht schneller und effizienter wäre, Regex zu verwenden, irre ich mich?
Ein reg-ex wird viel schneller sein als html agility pack. 

 Aber Sie sollten bedenken, dass HTML nicht immer gut geformt sein muss. Die Suche nach den richtigen Daten, die Sie nur mit reg-ex verwenden möchten, kann fehlschlagen. Browser sind sehr fehlerverzeihend. 

 Agility Pack ist ein großartiges Werkzeug. Es bietet eine Menge Funktionen für den Speicher, den es verbraucht.
<p>byval- und byref-argumente sollten basierend auf den anforderungen und dem wissen über ihre funktionsweise verwendet werden <em>nicht</em> in bezug auf die geschwindigkeit.</p><p> <a href="http://www.developer.com/net/vb/article.php/3669066">http://www.developer.com/net/vb/article.php/3669066</a> </p><p><em>als antwort auf einen kommentar von slough -</em></p><p><strong> was verbraucht zur laufzeit mehr ressourcen? </strong></p><p>parameter werden an den stapel übergeben. der stapel ist sehr schnell, weil seine speicherzuordnung einfach ein zeigerinkrement ist, um einen neuen &quot;rahmen&quot; oder &quot;zuordnungssatz&quot; zu reservieren. die meisten .net-parameter überschreiten die größe eines maschinenregisters nicht so wenig, wenn zum übergeben von parametern ein stack-speicherplatz verwendet wird. tatsächlich werden basistypen und zeiger auf dem stack zugewiesen. die stapelgröße in .net ist auf 1 mb begrenzt. dies sollte ihnen einen eindruck davon vermitteln, wie wenig ressourcen durch die parameterübergabe verbraucht werden.</p><p>sie können diese artikelserie interessant finden:</p><p><em> <a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/15/improving-performance-through-stack-allocation-net-memory-management-part-2.aspx">verbesserung der leistung durch stapelzuordnung (.net-speicherverwaltung: teil 2)</a> </em> </p><p><strong> was ist schneller? byval oder byref. </strong></p><p>es ist im besten fall schwierig, genau und fair zu messen - abhängig vom kontext ihrer messung, aber ein benchmark, den ich geschrieben habe, als er eine methode 100 millionen mal aufgerufen hat, kam zu folgendem ergebnis:</p><ul> <li>reference type - passed byref: 420 ms</li> <li>reference type - passed byval: 382 ms</li> <li>value type - passed byref: 421 ms</li> <li>value type - passed byval: 416 ms</li> </ul><pre><code>public sub method1(byref s as string) dim c as string = s end sub public sub method2(byval s as string) dim c as string = s end sub public sub method3(byref i as integer) dim x as integer = i end sub public sub method4(byval i as integer) dim x as integer = i end sub sub main() dim s as string = "hello world!" dim k as integer = 5 dim t as new stopwatch t.reset() t.start() for i as integer = 0 to 100000000 method1(s) next t.stop() console.writeline("reference type - byref " &amp; t.elapsedmilliseconds) t.reset() t.start() for i as integer = 0 to 100000000 method2(s) next t.stop() console.writeline("reference type - byval " &amp; t.elapsedmilliseconds) t.reset() t.start() for i as integer = 0 to 100000000 method3(i) next t.stop() console.writeline("value type - byref " &amp; t.elapsedmilliseconds) t.reset() t.start() for i as integer = 0 to 100000000 method4(i) next t.stop() console.writeline("value type - byval " &amp; t.elapsedmilliseconds) console.readkey() end sub </code></pre><p>die variable und die zuordnung in jeder methode auskommentieren -</p><ul> <li>reference type - passed byref: 389 ms</li> <li>reference type - passed byval: 349 ms</li> <li>value type - passed byref: 416 ms</li> <li>value type - passed byval: 385 ms</li> </ul><p>man könnte daraus schließen, dass das übergeben von referenztypen (zeichenfolgen, klassen) byval einige zeit spart. sie können auch sagen, dass die übergabe von werttypen (ganzzahl, byte) - byval etwas zeit spart.</p><p>wieder ist die zeit im großen system der dinge vernachlässigbar. wichtiger ist, byval und byref richtig einzusetzen und zu verstehen, was &quot;hinter den kulissen&quot; los ist. die in ihren routinen implementierten algorithmen beeinflussen die laufzeit ihres programms höchstwahrscheinlich um ein vielfaches.</p> <p>es sind nur zwischengespeicherte daten, die möglicherweise freigegeben werden, wenn eine andere app speicher benötigt.</p><p>hier ist eine gute beschreibung von <a href="http://www.techrepublic.com/blog/windows-and-office/investigate-memory-usage-with-windows-7-resource-monitor/">ntersuchen der speichernutzung mit windows 7 resource monitor</a> :</p><p>zitat aus dem link:</p><blockquote> <p><strong> standby </strong></p> <p>die blau angezeigte standby-liste enthält seiten, die aus prozessarbeitssätzen entfernt wurden, aber weiterhin mit ihren jeweiligen arbeitssätzen verknüpft sind. <strong> als solche ist die standby-liste im wesentlichen ein cache </strong>. speicherseiten in der standby-liste werden jedoch in einem bereich von 0 bis 7 priorisiert, wobei 7 die höchste ist. im wesentlichen erhält eine seite, die sich auf einen prozess mit hoher priorität bezieht, eine stufe mit hoher priorität in der standby-liste.</p> <p>beispielsweise haben gemeinsam nutzbare prozesse eine hohe priorität, und seiten, die diesen gemeinsam nutzbaren prozessen zugeordnet sind, haben die höchste priorität in der standby-liste.</p> <p>wenn ein prozess eine seite benötigt, die dem prozess zugeordnet ist, und diese seite sich jetzt in der standby-liste befindet, gibt der speichermanager die seite sofort an den arbeitssatz dieses prozesses zurück. alle seiten in der standby-liste stehen jedoch für speicherzuweisungsanforderungen von jedem prozess zur verfügung. wenn ein prozess zusätzlichen speicher anfordert und nicht genügend speicher in der liste "frei" vorhanden ist, überprüft der speichermanager die priorität der seite und nimmt eine seite mit niedriger priorität aus der standby-liste, initialisiert sie und weist sie diesem prozess zu.</p> </blockquote> <p>ich habe nichts in der pgadmin-dokumentation gefunden, aber das <a href="https://github.com/postgres/pgadmin3/blob/master/pgadmin/schema/pgdatabase.cpp">quellcode enthüllt</a> die abfrage hinter diesen einträgen (hinzugefügt für postgres 9.2+):</p><p>es läuft darauf hinaus:</p><pre><code>select temp\_files as "temporary files" , temp\_bytes as "size of temporary files" from pg\_stat\_database db; </code></pre><p>und das <a href="http://www.postgresql.org/docs/current/static/monitoring-stats.html#pg-stat-database-view">postgres-handbuch enthält details zu <code>pg\_stat\_database</code></a> :</p><blockquote> <p><code>tmp\_files</code> <code>bigint</code> anzahl der temporären dateien, die durch abfragen in dieser datenbank erstellt wurden. alle temporären dateien werden gezählt, unabhängig davon, warum die temporäre datei erstellt wurde (z. b. sortieren oder hashing), und unabhängig von der einstellung <a href="http://www.postgresql.org/docs/current/static/runtime-config-logging.html#guc-log-temp-files">log\_temp\_files</a> .</p> <p><code>temp\_bytes</code> <code>bigint</code> gesamtmenge der daten, die durch abfragen in dieser datenbank in temporäre dateien geschrieben wurden. alle temporären dateien werden gezählt, unabhängig davon, warum die temporäre datei erstellt wurde, und unabhängig von der einstellung <a href="http://www.postgresql.org/docs/current/static/runtime-config-logging.html#guc-log-temp-files">log\_temp\_files</a> .</p> </blockquote><p>beachten sie, dass diese werte <strong> <em> nicht</em> </strong> zur größe ihrer datenbank beitragen. aber sie zeigen an, dass ihre einstellung für <a href="http://www.postgresql.org/docs/current/interactive/runtime-config-resource.html#runtime-config-resource-memory"><strong> <code>work\_mem</code> </strong></a> ist möglicherweise zu niedrig, so dass viele sortiervorgänge auf die festplatte übertragen werden (was <em> sehr</em> langsam ist, verglichen mit nur ram).</p><p>verbunden:</p><ul> <li> <a href="https://dba.stackexchange.com/questions/48630/optimize-simple-query-using-order-by-date-and-text/48633#48633">optimieren sie die einfache abfrage mit order by datum und text</a> </li> </ul><p>so komprimieren sie die größe ihrer datenbank:</p><ul> <li> <a href="https://dba.stackexchange.com/questions/37028/vacuum-returning-disk-space-to-operating-system/37032#37032">vacuum gibt speicherplatz an das betriebssystem zurück</a> </li> </ul><p>so messen sie die größe:</p><ul> <li> <a href="https://dba.stackexchange.com/questions/23879/measure-the-size-of-a-postgresql-table-row/23933#23933">messen sie die größe einer postgresql-tabellenzeile</a> </li> </ul><p>nebenbei: <a href="http://www.postgresql.org/docs/current/interactive/wal-configuration.html"><strong> [~ # ~] wal [~ # ~] </strong> (write ahead log)</a> wäre in postgres für das äquivalent transaktionsprotokoll in sql server. schöne erklärung in dieser verwandten antwort auf so:</p><ul> <li> <a href="https://stackoverflow.com/q/14181180/939860">warum verwenden sql-datenbanken ein write-ahead-protokoll über ein befehlsprotokoll?</a> </li> </ul> <p>in stl gibt es einen entsprechenden typ, der <code>std::map</code> heißt.</p><p>es hat die gleiche grundfunktionalität wie ein .net dictionary, die implementierung ist jedoch sehr unterschiedlich. <code>std::map</code> basiert intern auf einer rot-schwarzen baumdatenstruktur, während <code>dictionary</code> intern eine hashtabelle verwendet.</p><p>wenn sie nur nach etwas suchen, das dasselbe verhalten aufweist, reicht <code>std::map</code> aus. wenn sie jedoch große datenmengen haben, müssen sie sich der unterschiedlichen leistungsmerkmale bewusst sein.</p> <p>ich würde mich zur tabs-lösung beugen. im moment verwenden sie viel vertikalen raum, und wenn zwei listen übereinander liegen, ist die anzeige schwierig. stellen sie sich vor, sie haben diese beiden toolboxen aus ihrem beispiel übereinander.</p><p>der ansatz mit registerkarten spart platz und ermöglicht es ihnen, einige coole dinge zu erledigen, z. b. kleine hinweise im apple-stil auf der registerkarte, die die anzahl neuer oder wichtiger elemente in dieser registerkarte anzeigen. sie müssen nicht einmal per se "tabulatoren" sein - nur schaltflächen, die den status des bedienfelds unter ihnen umschalten.</p> <p>es gibt tools für die verwendung von ext * unter windows ... aber ich würde ntfs empfehlen, da der * x-treiber heutzutage ziemlich stabil ist.</p> <ul> <li> <p><strong>wählen sie option 1, wenn</strong> die site enthält 'einfache' daten. zum beispiel einfacher text, ein kommentar oder etwas öffentliches</p> </li> <li> <p><strong>wählen sie option 3, wenn</strong> sie möchten nicht, dass der benutzer seitenelemente versehentlich ändert. zum beispiel würde ich in einem buchhaltungsprogramm definitiv option 3 verwenden, aber in einer einfachen notizblock-app (insbesondere auf mobilgeräten) würde ich definitiv option 1 wählen.</p> </li> </ul> bei uns kommen stets die modernsten technologien zum einsatz. die meisten webanwendungen programmieren wir mit c# und javascript sowie diversen frameworks. darüber hinaus haben wir webanwendungen mit php und mit der programmiersprache typescript auf der basis von node.js entwickelt. das hosting der webanwendung kann unter windows und unter linux erfolgen. Es lohnt sich, einen Blick auf diesen [`Blog Post`](http://lostechies.com/jimmybogard/2012/07/20/choosing-an-orm-strategy/) werfen, aber letztendlich werden die Kriterien von Ihnen festgelegt. Sie müssen entscheiden, ob 

* schnelle Entwicklung
* Performance
* Code-zuerst
* DB zuerst

 oder was auch immer Sie suchen und priorisieren Sie die Liste basierend auf, was noch wichtiger ist. Dann verwenden Sie diese Liste, um Ihre Forschung zusammenzustellen. <p>ja, da das betriebssystem das zusätzliche ram als festplatten-cache verwenden kann, wodurch der zugriff auf daten auf der festplatte beschleunigt wird.</p><p>extra ram beschleunigt jedoch nicht die cpu-gebundenen berechnungen (bei denen nicht viel festplatten-e/a erforderlich ist).</p>