Ich wäre sehr dankbar, wenn Sie die gewinnende O'Rourkes Perl-Lösung vergleichen könnten Lundhs Python-Lösung , da ich Perl nicht gut genug kenne, um zu verstehen, was dort vor sich geht. Genauer möchte ich wissen, was Perl Version 3x Vorteil gegeben hat: algorithmische Überlegenheit, Qualität der C-Erweiterungen, andere Faktoren?
Die bessere Regex-Implementierung von Perl ist ein Teil der Geschichte. Das kann jedoch nicht erklären, warum die Perl-Implementierung besser skaliert. Der Unterschied wird mit mehr Prozessoren größer. Aus irgendeinem Grund hat die Python-Implementierung ein Problem dort.
Perl ist stark für die Textverarbeitung optimiert. Es gibt so viele Faktoren, dass es schwer ist zu sagen, was genau der Unterschied ist. Text wird intern völlig anders dargestellt (utf-8 gegen utf-16 / utf-32) und die Engines für reguläre Ausdrücke sind auch völlig verschieden. Pythons Engine für reguläre Ausdrücke ist eine benutzerdefinierte und nicht so häufig wie die Perl-Engine. Es gibt sehr wenige Entwickler, die daran arbeiten (ich denke, es ist weitgehend unbearbeitet), im Gegensatz zu Perl, das im Grunde genommen der "Kern der Sprache" ist.
Schließlich ist Perl die Textverarbeitungssprache.
Many-Core-Engine (MCE) wurde für Perl veröffentlicht. MCE macht das sehr gut, sogar wenn man direkt von der Festplatte mit 8 Arbeitern liest (Cold-Cache). Vergleiche mit wf_mmap. MCE folgt beim Lesen von Eingabedaten einem Bankwarteschlangenmodell. Unter dem Bilderordner nach Folien suchen.
Der Quellcode wird unter Ссылка
gehostetDie Perl-Dokumentation kann unter Ссылка
nachgelesen werdenEine Implementierung des Wide Finders mit MCE finden Sie unter examples / tbray /
Genieße MCE.
%Vor%Die Perl-Implementierung verwendet den Systemaufruf mmap . Was dieser Aufruf tut, ist ein Zeiger, der für den Prozeß ein normales Speichersegment oder ein Puffer für das Programm zu sein scheint. Sie ordnet den Inhalt einer Datei einem Speicherbereich zu. Es gibt Leistungsvorteile gegenüber normalen Datei-IO (Lesen) - eine ist, dass keine Benutzerraum-Bibliotheksaufrufe notwendig sind, um Zugang zu den Daten zu erhalten, ein anderer ist, dass oft weniger Kopieroperationen notwendig sind (z. B. Daten zwischen verschieben) Kernel und Userspace).
Perls Strings und reguläre Ausdrücke sind 8-Bit-Byte-basiert (im Gegensatz zu utf16 für Java), so dass Perls nativer "Zeichentyp" die gleiche Codierung der mmapped-Datei ist.
Wenn die Engine für reguläre Ausdrücke dann mit der gesicherten mmap-Variable arbeitet, greift sie direkt auf die Dateidaten über die gemempte Speicherregion zu - ohne die IO-Funktionen von Perl oder sogar die IO-Funktionen von libc zu durchlaufen.
Wahrscheinlich ist die mmap für den Leistungsunterschied im Vergleich zur Python-Version, die die normalen Python-IO-Bibliotheken verwendet - was zusätzlich den Aufwand für die Suche nach Zeilenumbrüchen mit sich bringt - maßgeblich verantwortlich.
Das Perl-Programm unterstützt auch eine -J, um die Verarbeitung parallel zu machen, wobei der oepen "- |" verursacht eine fork (), in der der Datei-Handle in dem Eltern zu dem Stdout des Kindes ist. Die untergeordneten Prozesse serialisieren ihre Ergebnisse in stdout, und die übergeordneten Elemente deserialisieren sie, um die Ergebnisse zu koordinieren und zusammenzufassen.
Tags und Links python perl performance analysis