Was zählen Sie als eine CPU-intensive Aufgabe. In Bezug auf ... einen Algorithmus/Code zum Beispiel (nicht so sehr ein Anwendungsfall wie Videobearbeitung usw.). Grund ist, dass es der Hauptgrund scheint, NodeJS nicht zu benutzen, was ich wirklich mag, hauptsächlich CPU-intensive Aufgabe. Was zählt also? Ist es Sortieren, Suchen, Graph Transversal, Matrix multiplizieren, zum Beispiel?Was zählt als CPU-intensive Aufgaben (zB Sortieren, Suchen etc.?)
Antwort
Begriffe wie "intensiv" oder "teuer" sind relativ und es ist nicht immer offensichtlich, welche Aktivitäten CPU-intensiv sind. Im Allgemeinen ist alles, was nicht I/O ist, CPU. Und E/A ist in node.js asynchron, also kein Problem. Daher bleibt uns alles übrig, außer dass I/O teuer ist.
Ihr Ansatz, allgemeine Muster zu wählen, ist klug. Sortieren, Suchen und sogar Algorithmen im Allgemeinen sind CPU-gebunden. Natürlich können Sie die CPU-Nutzung nicht eliminieren, aber wenn Sie anstelle Ihres App-Codes Ihre Datenbank sortieren können, ist es vielleicht besser für Sie.
Ich würde auch nach großen Schleifen Ausschau halten. Eine Schleife, die keine asynchronen Ereignisse auslöst, ist ein Flaschenhals. Natürlich kann man Schleifen nicht ganz vermeiden. Sie sind eine Tatsache des Lebens für das Programmieren. Wenn deine Schleifen kurz sind, dann ist das kein Problem. Wenn Sie eine Schleife finden, die 10.000 Mal ausgeführt wird, sollten Sie möglicherweise in Erwägung ziehen, sie mit setTimeout, process.nextTick oder einem separaten Knotenprozess aufzubrechen.
10.000 wurde willkürlich ausgewählt. Es hängt davon ab, was die Schleife tut. Ihr Kilometerstand kann variieren.
Angenommen, eine Operation ist teuer. Was wirst du tun, um es zu beheben? Erstellen Sie eine C++ Erweiterung für NodeJS und haben Sie JS nennen es? Oder einfach die teure Arbeit in einen Worker Thread stecken? Oder etwas anderes? Vielleicht einfach die App in einer anderen Sprache erstellen? –
Persönlich wäre mein erster Versuch, die Operation schneller zu machen, da alle anderen Optionen die Komplexität erhöhen. Wenn das nicht möglich ist, würde ich setTimeout betrachten, wenn wir etwas betrachten, was nur ein paar Sekunden dauert und es vielleicht in 2-4 Teile aufteilen. Wenn das nicht genug ist, würde ich einen Worker-Prozess versuchen. Als letzten Ausweg kann ich eine C++ Erweiterung in Erwägung ziehen. – Brandon
Vielleicht möchten Sie Webworker-Threads oder ein ähnliches Paket https://npmjs.org/package/webworker-threads – Brandon
Bash Scripting kommt wirklich in diese. Mein Professor ist Pochen immer auf uns über effizienten Code zu schreiben, die die Arbeit an CPU
Hier ist ein gutes Beispiel für ineffiziente Praktiken in Linux
http://hacktux.com/bash/script/efficient
Ein weiteres Beispiel erleichtern will ich ist rekursiven Funktionen denken kann, oder Funktionen, die sich ständig selbst aufrufen, bis eine Bedingung erfüllt ist. Diese benötigen normalerweise viel CPU-Leistung.
Viele dieser Vorschläge sind wirklich für Wartbarkeit/Portabilität/Lesbarkeit, nicht Leistung, wie die Verwendung von integrierten Echo, Funktionen und Arrays. – Brandon
Prozesse oder Aufgaben, die auf einem Computer ausgeführt werden, erfordern verschiedene Ressourcen wie CPU-Zyklen, Speicher, Datenträger oder Netzwerk, die vom Betriebssystem verwaltet werden, so dass jede Aufgabe effizient ausgeführt wird (ohne möglichst auf eine Ressource zu warten).
OS versucht, die Ressourcenauslastung zu maximieren, indem viele Prozesse gleichzeitig Ressourcen verwenden. Wenn ein Prozess eine bestimmte -Ressource in großer Menge anfordert, kann dies die Ausführung des Programms verzögern (verzögern). Der Prozess soll ressourcenintensiv mit dieser Ressource arbeiten. So ist ressourcenintensiv eine relative Terminologie.
Sortierung, Suche, Graph Traversal, Matrix multiplizieren alle CPU-Operationen, ein Prozess CPU-intensive
ist oder nicht, hängt davon ab, wie viel und wie häufig ihre Ausführung sind. Zum Beispiel trans-coding video
oder compressing files
ist ziemlich CPU-intensiv, weil sie die CPU-Operationen weit mehr als sie zum Lesen/Schreiben von Speicher oder Festplatte benötigen. Wenn Sie dies planen, sollten Sie einen separaten untergeordneten Prozess dafür erstellen, damit der Knotenprozess, der single-threaded ist, nicht verlangsamt wird, oder besser node cluster erstellt wird.
Ich könnte Worker Threads verwenden, aber es wird nicht viel helfen, wenn sie sehr lange darauf warten müssen fertigstellen? Also frage ich mich, abgesehen von der hängenden Benutzeroberfläche (nicht schwer mit Worker-Threads zu reparieren), ist es langsamer als sagen Python/Ruby, die gleichen Berechnungen zu tun? –
Das hängt davon ab, wie die Implementierung in beiden erfolgt. JavaScript und Python sind beide Skriptsprachen. Für den allgemeinen Gebrauch ist JavaScript schneller als Python (Python ist in numerisch intensiven Fällen besser). Siehe http://www.quora.com/Programming-Languages/Is-JavaScript-v8-faster-than-Python. – user568109
Es kann hilfreich sein, wenn Sie angeben, was Sie versuchen, CPU-intensiv zu sein. –