Frage

Jede kleine Datenbankverarbeitung kann leicht von Python/Perl/... Skripten angegangen werden, in denen Bibliotheken und/oder sogar Dienstprogramme aus der Sprache selbst verwendet werden. Wenn es jedoch um die Leistung geht, tendieren Menschen dazu, nach C/C ++/Low-Level-Sprachen zu suchen. Die Möglichkeit, den Code auf die Bedürfnisse anzupassen, scheint das zu sein, was diese Sprachen für BigData so attraktiv macht-sei es in Bezug auf Speichermanagement, Parallelität, Disk-Zugriff oder sogar Optimierungen auf niedriger Ebene (über Assembly-Konstrukte auf C/C ++-Ebene).

Natürlich würde solche Vorteile nicht ohne Kosten kommen: den Code zu schreiben und manchmal sogar zu schreiben das Rad neu erfinden, kann ziemlich teuer/lästig sein. Obwohl es viele Bibliotheken zur Verfügung gibt, neigen die Leute, den Code selbst zu schreiben, wann immer sie es brauchen gewähren Leistung. Was deaktiviert Leistungsaussagen aus der Verwendung von Bibliotheken bei der Verarbeitung großer Datenbanken?

Betrachten Sie beispielsweise ein Unternehmer, bei dem Webseiten kontinuierlich kriecht und die gesammelten Daten analysiert. Für jede Gleitwindow werden verschiedene Data Mining-Algorithmen mit den extrahierten Daten ausgeführt. Warum sollten die Entwickler mithilfe der verfügbaren Bibliotheken/Frameworks (sei es für Kriechung, Textverarbeitung und Data Mining) ab. Die Verwendung von bereits implementierten Sachen würde nicht nur die Last der Codierung des gesamten Prozesses erleichtern, sondern auch viel Zeit sparen.

In einem einzigen Schuss:

  • Was macht das Schreiben des Codes selbst a Garantie der Leistung?
  • warum ist es riskant Um sich auf ein Frameworks/Bibliotheken zu verlassen, wenn Sie müssen versichern Hochleistung?
War es hilfreich?

Lösung

Nachdem ich das Neuschreibspiel immer wieder selbst gemacht hatte (und es immer noch tat), war meine sofortige Reaktion Anpassungsfähigkeit.

Während Frameworks und Bibliotheken ein riesiges Arsenal von (möglicherweise verbindbaren) Routinen für Standardaufgaben haben, macht ihre Rahmeneigenschaft häufig (immer?) Verknüpfungen nicht. Tatsächlich haben die meisten Frameworks eine Art Kerninfrastruktur, um die eine Kernschicht der grundlegenden Funktionalität implementiert wird. Spezifische Funktionalität nutzt die Grundschicht und wird in einer zweiten Schicht um den Kern platziert.

Jetzt meine ich mit Abkürzungen, wenn ich direkt von einer Routine der zweiten Ebene zu einer anderen Routine der zweiten Ebene gehe, ohne den Kern zu verwenden. Typisches Beispiel (aus meiner Domäne) wären Zeitstempel: Sie haben eine Art Zeitstempel -Datenquelle. Bisher besteht die Aufgabe einfach darin, die Daten aus dem Kabel zu lesen und sie an den Kern zu übergeben, damit Ihr anderer Code darauf füben kann.

Jetzt ändert Ihre Branche das Standard -Zeitstempelformat aus einem sehr guten Grund (in meinem Fall gingen sie von der Unix -Zeit zur GPS -Zeit). Wenn Ihr Rahmen nicht branchenspezifisch ist, ist es sehr unwahrscheinlich, dass sie bereit sind, die Kerndarstellung der Zeit zu ändern. fast macht was du willst. Jedes Mal, wenn Sie auf Ihre Daten zugreifen, müssen Sie zuerst in die Zeit in der Branche umwandeln. Jedes Mal, wenn Sie es ändern möchten, müssen Sie es wieder in das, was der Kern für angemessen hält, umwandeln. Es gibt keine Möglichkeit, Daten ohne doppelte Konvertierung direkt von der Quelle zu einer Senke zu übergeben.

Hier glänzen Ihre handgefertigten Frameworks, es ist nur eine geringfügige Veränderung, und Sie modellieren wieder die reale Welt, während alle anderen (nicht in der Industrie spezifischen) Frameworks nun einen Leistungsnachteil haben.

Im Laufe der Zeit wird sich die Diskrepanz zwischen der realen Welt und dem Modell summieren. Mit einem self-Framework würden Sie bald Fragen stellen wie: Wie kann ich darstellen this in that oder wie machen Routine X Akzeptieren/produzieren Y.

Bisher ging es nicht um C/C ++. Wenn Sie jedoch aus irgendeinem Grund das Framework nicht ändern können, müssen Sie sich mit einer doppelten Konvertierung von Daten abfinden, um von einem Ende zum anderen zu wechseln, dann würden Sie normalerweise etwas verwenden, das den zusätzlichen Aufwand minimiert. In meinem Fall wird ein Tai-> UTC oder UTC-> Tai-Konverter am besten für RAW C (oder ein FPGA) überlassen. Es ist keine Eleganz möglich, keine tiefgreifende intelligente Datenstruktur, die das Problem trivial macht. Es ist nur eine langweilige Switch -Anweisung, und warum nicht eine Sprache verwenden, deren Compiler genau das optimieren können?

Andere Tipps

Ich glaube nicht, dass jeder nach C/C ++ greift, wenn Leistung ein Problem ist.

Der Vorteil für das Schreiben von Code mit niedrigem Niveau besteht darin, weniger CPU-Zyklen oder manchmal weniger Speicher zu verwenden. Aber ich würde beachten, dass Sprachen auf höherer Ebene auf Sprachen auf niedrigerer Ebene aufrufen und tun können, um einen Teil dieses Wertes zu erhalten. Python- und JVM -Sprachen können dies tun.

Der Datenwissenschaftler, der beispielsweise Scikit-Learn auf ihrem Desktop verwendet, ruft bereits stark optimierte native Routinen an, um die Anzahl der Krise zu erstellen. Es macht keinen Sinn, neuen Code für Geschwindigkeit zu schreiben.

Im verteilten "Big Data" -Kontext sind Sie in der Regel ein Engpass für die Datenbewegung: Netzwerkübertragung und I/O. Native Code hilft nicht. Was hilft, ist nicht den gleichen Code zu schreiben, um schneller auszuführen, sondern intelligenteren Code zu schreiben.

Über höhere Sprachen können Sie komplexere verteilte Algorithmen in einer bestimmten Menge an Entwicklerzeit als C/C ++ implementieren. Im Maßstab wird der intelligentere Algorithmus mit besserer Datenbewegung den dummen nativen Code übertreffen.

Es ist normalerweise auch wahr, dass Entwicklerzeit und Fehler mehr als neue Hardware kosten. Ein Jahr der Zeit der Senior -Entwickler könnte 200.000 US -Dollar voll beladen sein. Über ein Jahr, in dem auch Hunderte von Servern Berechnungszeit gemietet werden. In den meisten Fällen ist es möglicherweise nicht sinnvoll, sich die Mühe zu machen, mehr Hardware darauf zu werfen.

Ich verstehe die Follow -up zu "Grant" und "Deaktivieren" und "Assert" nicht?

Wie alle wir wissen, gibt es in der digitalen Welt viele Möglichkeiten, die gleichen Arbeiten zu leisten / erwartete Ergebnisse zu erzielen.

Und Verantwortlichkeiten / Risiken, die aus dem Code stammen, befinden sich auf den Schultern der Entwickler.

Das ist klein, aber ich denke ein sehr nützliches Beispiel von .Net World.

So viele .NET -Entwickler verwenden den eingebauten BinaryReader -BinaryWriter für ihre Datenserialisierung für Leistung / Kontrolle über den Prozess.

Dies ist der CSHARP -Quellcode des in der Binarywriter Class 'integrierten Frameworks einer der überlasteten Schreibmethoden:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

Wie Sie sehen, könnte diese Methode ohne die zusätzliche Zuweisung _Buffer -Variable geschrieben:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

Ohne zuzuweisen könnten wir nur wenige Millisekunden gewinnen. Diese wenigen Millisekunden können als "fast nichts" akzeptieren, aber was ist, wenn es mehrere Tausends Schreiben gibt (dh in einem Serverprozess)?

Nehmen wir an, "wenige" sind 2 (Millisekunden) und mehrstausende Instanzen nur 2.000. Dies bedeutet 4 Sekunden mehr Prozesszeit. 4 Sekunden später zurückkehren.

Wenn wir weiterhin von .NET unterworfen sind und die Quellcodes der BCL - .NET -Basisklassenbibliothek - von MSDN über überprüfen können, können Sie viele Leistungsverluste vom Entwickler entscheiden.

Jeder Punkt von Bcl Source ist normal, dass Sie sehen, dass der Entwickler entschieden hat, während () () oder foreach () -Sloops zu verwenden, die eine schnellere für () Schleife in ihrem Code implementieren könnten.

Diese kleinen Gewinne geben uns die Gesamtleistung.

Und wenn wir zum binarywriter.write () Methode zurückkehren.

Tatsächlich ist eine zusätzliche Zuweisung einer _Buffer -Implementierung kein Entwicklerfehler. Dies entscheidet sich genau, "in Sicherheit zu bleiben"!

Nehmen wir an, dass wir uns entscheiden, _Buffer nicht zu verwenden und die zweite Methode implementieren zu können. Wenn wir versuchen, Mehrtausend-Bytes über ein Draht (dh hochladen / herunterzuladen, können Sie einen Blob- oder CLOB-Daten herunterladen) mit der zweiten Methode können häufig ausfallen von der Verbindung verloren. Nachdem wir versuchen, alle Daten ohne Überprüfungen und Steuerungsmechanismus zu senden. Wenn die Verbindung verloren geht, wissen sowohl der Server als auch der Client nie die abgeschlossenen Daten oder nicht.

Wenn der Entwickler entscheidet, dass "in Safe bleiben", bedeutet dies normalerweise, dass die Leistungskosten von der implementierten "Aufenthalts" -Mechanismus (en “abhängt.

Wenn der Entwickler jedoch entscheidet, "riskant zu werden, Leistung zu gewinnen", ist dies kein Fehler.

Und als kleiner Anmerkung: Entwickler der kommerziellen Bibliothek versuchen immer, in Sicherheit zu bleiben, da sie nicht wissen können, wo ihr Code verwendet wird.

Aus der Sicht der Programmierer stammt Frameworks selten als höchste Priorität. Wenn Ihre Bibliothek weit verbreitet ist, sind die Dinge, die Menschen wahrscheinlich schätzen, die am meisten zu verwenden, Flexibilität und Zuverlässigkeit.

Die Leistung wird im Allgemeinen in sekundären Wettbewerbsbibliotheken bewertet. "Die X -Bibliothek ist besser, weil sie schneller ist." Selbst dann werden diese Bibliotheken sehr häufig die optimalste Lösung für eine, die weit verbreitet werden kann.

Durch die Verwendung eines Rahmens gehen Sie von Natur aus ein Risiko ein, dass eine schnellere Lösung besteht. Ich könnte so weit gehen zu sagen, dass fast immer eine schnellere Lösung existiert.

Das Schreiben von etwas selbst ist keine Garantie für die Leistung, aber wenn Sie wissen, was Sie tun, kann dies hilfreich sein.

Ein Beispiel könnte JSON analysieren. Es gibt hundert Bibliotheken für eine Vielzahl von Sprachen, die JSON in ein referables Objekt verwandeln und umgekehrt. Ich kenne eine Implementierung, die alles in CPU -Registern macht. Es ist messbar schneller als alle anderen Parser, aber es ist auch sehr begrenzt und diese Einschränkung wird je nach CPU variieren, mit der Sie zusammenarbeiten.

Ist die Aufgabe, eine leistungsstarke Umgebung aufzubauen, eine gute Idee für JSON-Parser? Ich würde eine angesehene Bibliothek 99 Mal von 100 nutzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top