Wie schreibt man einen effizienteren code
Frage des Jahrhunderts? Ich wollen im Grunde wissen, was noch effizienter wäre, wenn ich schrieb diesen code als verschiedene Variablen oder wenn ich kleine arrays.
int x = 34;
int y = 28;
int z = 293;
vs
double coordinate[3] = {34, 28, 293};
Habe ich ein struct Koordinate, die ich verwenden, in der folgenden Weise:
typedef struct coordinates_t {
double x = 0.0;
double y = 0.0;
double z = 0.0;
} coordinates;
typedef struct car_t {
coordinates start; //car starting point
coordinates location; //car current Location
coordinates targCarVector; //Vector to car from target
coordinates altitude; //Altitude of car
coordinates distance; //Distance from car start to current position
} car;
Werde ich brauchen, um Dinge zu tun wie:
distance = car1.location - car1.start;
Wenn ich nicht ein array verwenden, werde ich haben, um eine Menge von Zeilen von code, aber wenn ich ein array verwenden, ich habe zu verwenden, - Schleifen. Arrays und Schleifen mehr Speicher/cpu-intensiv? Ich bin im Grunde versucht, um zu sehen, welche ist die effizienteste Art zu schreiben den code.
Dank,
DemiSheep
- Benchmarks benchmarks benchmarks!
- spot an! Oder, nicht einmal die Mühe, benchmarking 'til Sie haben Ihre app. geschrieben und 'es ist langsam' - so optimieren Sie die wenigen Orte, wo die Langsamkeit ist passiert und fertig. Es in der Regel nicht zahlen zu viel sorgen über effiziente im Voraus kann man selten vorhersehen, wo die wirklichen langsamen Teile des Programms sein werden - noch lohnt es sich, die extra gedacht, viel von der Zeit.
- Ich Stimme mit den Benchmarks Kommentar, aber zur gleichen Zeit, meine Meinung zu der Sache ist-Variablen. Es ist immer besser, etwas zu haben, um eine Vorstellung zu geben von dem, was es gepackt. Zum Beispiel, Ihre Koordinaten [] - array x, y, z aber jemand anderes vielleicht denken, Sie sind z, y, x. Mit Variablen x, y und z, es gibt keine Verwirrung.
- Mein Verdacht ist, dass da Strukturen sind nur arrays intern(mehr oder weniger), es macht nicht den geringsten Unterschied nach geht es in eine zwischendarstellung.
- Frage aus dem vorherigen Jahrhundert.
- wahrscheinlich ist es egal, da die Compiler sind ziemlich schlau. aber ich kann nicht sicher sein, da ich nicht über benchmarks, und jede Plattform ist anders.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die erste Frage ist: wollen Sie es optimieren? Die meisten wahrscheinlich, Sie wollen nicht. Zumindest dann nicht, wenn Sie "always code as if the guy who ends up maintaining Ihr code wird ein gewalttätiger psychopath, der weiß, wo Sie Leben." Lesbarkeit, Klarheit der Absicht und die Wartbarkeit kommen immer zuerst.
Die zweite Frage ist: lohnt es sich, die Optimierung? In 97% ist es nicht, laut Donald Knuth, das Sie nicht Frage Knuth, tun Sie? Ein weiteres gemeinsames Regel-of-Daumen ist die 80/20-Regel, D. H. 80% der Ausführungszeit verbracht wird in 20% des Codes. , Wenn Sie optimieren, Erstens Profil, um zu wissen, wo man optimieren. Wenn Sie erraten, sind Sie falsch. Zeitraum.
Die Dritte Frage ist: KÖNNEN Sie es optimieren? Nein kann man nicht, zumindest nicht komfortabel. Sie denken, Sie sind schlauer als die Hunderte von Programmierern, die schrieb Ihr compiler über viele Jahrzehnte? Sie sind es nicht. Wenn die tatsächliche Implementierung der algorithmen und Datenstrukturen optimiert werden kann, können Sie davon ausgehen, Ihr compiler kann das allein tun. Der compiler tun kann, loop unrolling, instruction Neuordnung, die Kombination von Variablen mit nicht-überlappenden Lebenszeit -, Struktur-layout-Optimierung, und vieles mehr - und in dieser ära, es ist sogar besser als die meisten assembly-Programmierer in den meisten Fällen. Und auch wenn es ein bisschen Potenzial, Sie besser konzentrieren sich auf die Implementierung eines besseren Algorithmus. Kein compiler kann wiederum in O(n^2) in O(n log n), aber vielleicht eine intelligente Informatiker haben es und können Sie implementieren, seinen Algorithmus zu bekommen eine viel bessere Leistung als jedes microoptimization hervorbringen kann.
Ist Effizienz wichtiger ist, dass die Wartbarkeit und Lesbarkeit? Die Antwort ist Nein. Auch wenn Sie eine Zeitkritische Anwendung, die Sie verbringen 90% der Zeit in 10% des Codes, so dass nur das 10% muss codiert werden, so effizient wie möglich.
Wenn Sie noch nicht gemessen und festgestellt, das 10% ist der Schuldige, Sie fast sicher sein, Optimierung des Codes, die nicht viel Spielzeit in den ersten Platz. Dies ist eine Verschwendung von Zeit.
Müssten Sie die Maßnahme für jede Plattform, die Sie wollen, zu tun.
Aber ich glaube nicht, das würde kaum Unterschied. (Ausgenommen vielleicht für einige embedded-Plattformen. Das ist ein Bereich, ich weiß nicht viel über.) Also erstmal schreiben Sie den code in der Weise, die am einfachsten zu Lesen und zu verstehen. Dann Messen Sie, ob Ihr code ist zu langsam, und verwenden Sie einen profiler zu finden Sie die genaue spots, wo das Programm verbringt zu viel Zeit. Dann versuchen Sie zu verbessern, Messen Sie nach jeder änderung zu sehen, welche Wirkung es hatte.
Verbesserung der Geschwindigkeit eines einfach zu verstehen codebase ist viel einfacher als das verstehen einer Codebasis, gespickt mit vorzeitige und unnötige "Optimierung".
Messbare Laufzeit-Verbesserungen kommen in der Regel von algorithmischen änderungen, die nicht von der Mikro-Optimierungen wie dieser. Verbringen Sie Ihre Zeit für die Suche nach besseren algorithmen.
Wenn Sie wirklich wollen, um Mikro-optimieren, verwenden Sie die SIMD Unterweisung-Funktionen der CPU. Wenn Sie ein x86-Plattform verwenden, können Sie MMX oder SSE Anweisungen, um Vektor-Arithmetik anstelle der Zugabe jeder Teil der Koordinate einzeln (der compiler kann nicht generiert diese ohne besonderen Befehl-Linie Schalter-oder inline-Montage). Dies wird voraussichtlich zu einer größeren speedup als der Wechsel zwischen den einzelnen Variablen und ein array. Ich sage "wahrscheinlich", weil es keine Möglichkeit zu sagen, sicher, ohne zu versuchen, es in beide Richtungen und Messen die Ausführungszeit.
Verwenden Sie ein array, das kompilieren mit -funroll-loops. Erhalten Sie die Vorteile beider.
Compiler können "ausrollen" von Schleifen wenn Sie denken, es wird helfen. Damit der compiler könnte ruhig ersetzen Sie den folgenden code:
mit:
Den compiler nehmen Sie Ihre beste Vermutung an, ob es sich lohnt, dies zu tun, unter Berücksichtigung der Kosten für die beteiligten Betriebe und die Optimierung-flags, die Sie stellen.
Gibt es keine einfache Antwort auf die Frage "was wird schneller sein?", aber wenn es war, können Sie sicher sein, dass bei maximaler Optimierung, die der compiler es verwenden würde.
Wenn Sie Zweifel haben, code bis zu Prototypen für jedes Profil. Für die Dinge auf dieser Ebene, ich sage Voraus, dass Unterschiede in der Leistung wird sich in den Lärm. Verwenden Sie, was Sinn macht und am deutlichsten vermittelt die Absicht des Designs.
In absteigender Reihenfolge Ihrer Wichtigkeit, code
Irgendwo danach können Sie beginnen, sich Gedanken über Leistung.
Die Antwort des Jahrhunderts ist
In anderen Worten, Profil-erste.
Jeder "weiß" dies, aber eine große Kategorie von Fragen auf, SO sind von der form "Was ist schneller, X oder Y?"
Dadurch ausgelösten Vermutungen, und wenn Sie sind besorgt über die Leistung, Vermutungen nicht viel Wert, denn wenn man ein performance-problem, es ist wahrscheinlich ganz woanders.
Ich in der Regel keine Gedanken über die Effizienz...
Einem Ort, wo es zu einer Beschleunigung ist, wenn ich eine Suche für einen numerischen Wert
Sagen möchte ich finde eine account-Nummer "188335344" es wird geschehen, viel schneller, als die Suche für alpha-Zeichen. Die Suche wechseln müssen jeder Zeile des Textes zum oberen Fall, da sucht er für nicht numerische Werte. Nicht so für zahlen.
Etwas schneller sein, eigentlich.
Etwas, das erfordert, dass Benutzer-Eingabe sehr ineffizient und es gewann ' T Angelegenheit ein jota.
Ich tun-display die verstrichene Zeit am Ende jeder Suche. Also älter-code können verglichen werden neuere änderungen.
Als immer, müssen Sie das Profil Ihres Codes sicher zu sein.
Gesagt haben, dass, würde ich vorschlagen, gehen für ein array und Schleifen - Sie code sollte präziser/wartbar und der compiler sollte in der Lage sein zu tun, einen guten job bei der Optimierung von aus - /abrollen alle die wenig Konstante Größe Schleifen, die ist effektiv, was Sie tun würde, die von hand wenn Sie die x -, y -, z-Koordinaten für jeden Vektor.
Auf einem völlig anderen Anmerkung ich sehen Sie Ihr Auto hat Höhe. Ist es ein fliegendes Auto? Wenn ja, dann auf jeden Fall +1 für die Coole Applikation.
Gehen für das richtigere Weg wäre - die Verwendung von Schleifen und arrays - von denen keiner Folge mehr Speicher (weniger Verbrauch, als die Erinnerung an alle diejenigen, car1, car2, car3... Hinweise mehr sein) - und CPU-usage-wise Sie ' re Blick auf die kleinsten Unterschiede.
Bitte Profil den code und finden Sie heraus, was das Hauptproblem für die Ineffizienz. Effizienz gemessen werden kann, die runtime-Ausführung von code.
Einige tools sind als Open-Source, wie gprof.