Sonntag, Dezember 8, 2019

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.

InformationsquelleAutor DemiSheep | 2010-08-27

12 Kommentare

  1. 9

    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.

    • Die Dritte Frage wird sehr streitig, in vielen Sprachen, die es nicht sind, sagen C. E. g., BASIC. 🙂 /pedantisch
    • Ja, aber man kann immer sitzen und warten, für eine sufficently smart-compiler 🙂 Wenn man sich so sehr um die Geschwindigkeit, dass nicht einmal optimierte algorithmen (die bekannt sind, um mehr Einfluss haben, als, nun, Mikro-Optimierung) sind genug, sollten Sie wahrscheinlich es in C neu schreiben oder ähnliches sowieso.
    • Technisch, ja, aber es könnte sein, hmm, pointy haired Art der Externalitäten verhindern, dass Sie die Auswahl einer anderen Sprache.
    • Wow, das wurde akzeptiert über Philip +19 post?
    • „Sie Fragen nicht nach Knuth, tun Sie?“. Ich würde sagen, immer die Frage „Behörde“. Knuth setzt auf seine Schuhe, ein zu einer Zeit, genau wie der rest von uns.
    • Dunlavey: Hey, ich bin der Letzte, der darauf bestehen, eine Autorität. Aber bestimmte Personen (z.B. Knuth) verdient Ihre Autorität, was nicht bedeutet, Sie haben zu gehorchen, aber Sie sollten zweimal überlegen, bevor Sie missachten seinen Rat. Außerdem, es war vor allem ein Witz 😉
    • Ich ging die ganze Akademische route, und, kein Zweifel, Knuth ist ein Stern. Das heißt, die Elfenbein-Turm schneidet den Menschen von der realen Welt in qualitativer Hinsicht, also Akademiker, egal wie smart, neigen dazu, Leben in einer echo-Kammer, verzerren Ihre Wahrnehmung. Sie können es nicht. Aber ich verstehen Sie Ihren Punkt. Cheers.
    • lasst uns nicht vergessen, dass, im Kontext ist es klar, Knuth zog die 97% – Zahl aus seinem Arsch. Wir sollten uns nicht Folgen Knuth die Worte blind, wir sollten Wert Knuth, weil seine Ideen, die uns helfen, mehr klar denken.

  2. 21

    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.

    • +1 Punkt auf. Vorzeitige Optimierung ist die Wurzel allen übels.
    • Wir sollten nicht vergessen über kleine efficiencies, say about 97% der Zeit: vorzeitige Optimierung ist die Wurzel allen übels. Doch wir sollten uns nicht passieren, unsere Möglichkeiten in dieser kritischen 3%.Ein guter Programmierer wird nicht einlullen lassen von solchen Argumentation, er wird klug sein, sorgfältig zu prüfen, den kritischen code; aber nur nach, dass der code erkannt wurde — Donald Knuth
    • Nathan: Der Meister immer sagt es besser als ich es könnte.
    • Bist du mehr oder weniger Recht, aber diese Ideen machen mich wahnsinnig, mit froher Aphorismen über 10% und 3%. Es scheint, dass das, was die Leute sagen, weil Sie gehört haben, andere Leute sagen es. Vielleicht macht es Sinn, in kleinen 1-seitigen wissenschaftlichen algorithmen, wo der call-stack wird nie tiefer als 2. In der real-Welt mega-Linern, mehr als 90% der Zeit (in meiner Erfahrung) das problem ist 1-line-Funktion aufrufen Webseiten aufrufen massive Stämme von call-Baum, unnötigerweise, durch über-Allgemeine Daten-Struktur-design.
    • das ist ein problem der Datenstruktur und Algorithmus design, nicht ein problem der code-Optimierung wie diese Frage reden. (Ich bin mir sicher, dass Knuth nahm die Zahl 97% aus Luft – die tatsächliche Anzahl ist nicht wichtig. Und ich bin mir sicher, dass Knuth weiß über mega-Liner.)
    • Ich habe einige meiner Erfahrungen und performance-tuning in diese Antwort. (stackoverflow.com/questions/926266/…) ist Es sehr anders als die meisten Menschen das Verständnis der Optimierung.
    • Während ich damit einverstanden, dass einige Leute (meist diejenigen, die Behandlung von C++ als nur eine andere OO-Sprache gedankenlos Abstrakt, ohne genug nachgedacht zu Effizienz), IME mehr Menschen (oft diejenigen, die Behandlung von C++ als eine bessere C) gedankenlos Schlachtung Abstraktionen (die sind sehr wichtig in multi-MLoC-Projekte) auf dem altar der Effizienz, ohne dabei es. C++ strahlt helles, wo Sie brauchen, kombinieren Abstraktionen mit Effizienz._ Nur ein Blick auf die AWL, IMO ein Meisterwerk der Kombination von Ihnen. Das bedeutet aber, catering für C++’s wahre Stärke, nicht behandeln Sie es als Reine OO oder besser C.
    • In einer multi-MLoC Projekt, das ich gearbeitet hatte, für mehrere Jahre, die Zahl der Absturz-bugs schön korreliert zu den coding-Stil in verschiedenen teilen der Anwendung. Wo die Entwickler manuell fummelte mit Speicher-und anderen Ressourcen, stürzt ab und Logik Fehler gemeldet wurden von den Testern und dem Feld. Wo die Entwickler hatten mit smart Pointern und anderen Abstraktionen, nur Logik Fehler gemeldet wurden. Geschwindigkeit war ein primäres Ziel (die Anwendung konnte eine halbe Stunde lang analysieren 2MB von input-Daten) gewonnen, die hauptsächlich durch die Verzögerung-Daten laden und speichern weniger (auch bekannt als Algorithmische änderungen).
    • Durch das laden einer index-Datei anstelle von 1000 Dateien (und verzögert laden diese Dateien später im hintergrund), konnte ich beschleunigen, meinen Teil zu dem Punkt, wo die Anwendung Startzeit sank auf unter 20%. Du wirst nie das bekommen, dies durch Einbußen bei der Abstraktionen. In der Tat, genau das Gegenteil war der Fall: Dies erhöhte die Komplexität der meinen Anteil (~100kLoC) der code.
    • Ich kann mit Sicherheit sehen, wie diese Maßnahmen würden helfen, und ich bin nicht gegen die Abstraktion, die, intelligent eingesetzt. In unserer Gruppe, wir haben gute Leute, die reden der Linie zu Profilieren, aber wenn es ein performance-problem, ich bin derjenige, der es findet, in den wenigen Pausen. Fast immer ist er da OO ermutigt die Menschen zu schaffen, nicht normalisierte Datenstruktur und versuchen, halten Sie es im Einklang mit Benachrichtigungen, und die Dinge, die ripple weit darüber hinaus, was Sie erwartet.
    • Ja, wie ich schon sagte, die Behandlung von C++ als nur eine andere OO-Sprache ist dumm. Wenn Sie das wollen, es gibt besser draußen. Wenn Sie brauchen, C++, es ist, weil Sie mehr brauchen.
    • „Die Antwort ist Nein“ es gibt keine solche Sache. Vielleicht in 97% der Fälle. Wer gibt eine eindeutige Antwort auf eine komplexe Frage, ist ein amateur/Möchtegern-professionellen. Alternativ haben Sie nie zu tun hatte mit Zeit-kritischen Anwendungen. Oder Sie sind einfach nur unwissend, aber gelesen haben irgendwo etwas gehört oder etwas von jemanden.

  3. 7

    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.

    • „einen profiler verwenden, finden Sie die genauen stellen, wo das Programm verbringt zu viel Zeit“ Zu viele Leute denken, das bedeutet nur, „wo die program counter verbringt zu viel Zeit, dadurch fehlt den schlecht begründeten-Funktion aufruft und I/O, die in großen software-in meiner Erfahrung, Dominieren bei weitem.
    • Daher meine „Messbare Laufzeit-Verbesserungen kommen in der Regel von algorithmischen änderungen“.
    • Problem ist, wenn Leute denken, dass Algorithmische änderungen, die Sie denken, suchen, Sortieren, linear -, Binär -, hash -, etc. Sie denken nicht an das, was Sie nicht denken würde, wie: unnötig internationalisiert Zeichen-Konstanten geladen von Ressourcen beim Start verursacht viel versteckte I/O, oder einfach nur laden, die Dinge in einem Strukturansicht-Steuerelement verursacht viel ripple-Effekt erstellen und zerstören von windows & andere Daten-Struktur benutzen, oder ändern der Spalte-name/ – Typ in einem Datenraster-Steuerelement was einen Dominoeffekt im gesamten viel an der Struktur der Daten. Das ist, warum reden, „algorithmen“ lässt mich unruhig werden.
    • Ja, siehe mein Kommentar zur anderen Antwort. Pre-laden Sie einen index der Daten statt beim laden der eigentlichen Daten… für mich ist eine Algorithmische änderung.
  4. 3

    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.

  5. 2

    Verwenden Sie ein array, das kompilieren mit -funroll-loops. Erhalten Sie die Vorteile beider.

  6. 2

    Compiler können „ausrollen“ von Schleifen wenn Sie denken, es wird helfen. Damit der compiler könnte ruhig ersetzen Sie den folgenden code:

    for (i = 0; i < 3; ++i) {
        c[i] = a[i] - b[i];
    }

    mit:

    c[0] = a[0] - b[0];
    c[1] = a[1] - b[1];
    c[2] = a[2] - b[2];

    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.

  7. 1

    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

    1. Richtig – es spielt keine Rolle, wie schnell dein code ist, wenn es gibt Ihnen die falsche Antwort, oder das falsche macht;
    2. Haltbar – es spielt keine Rolle, wie schnell dein code ist, wenn Sie es nicht reparieren oder ändern Sie es, um Platz für die neuen Anforderungen;
    3. Robust – es spielt keine Rolle, wie schnell dein code ist, wenn Sie core-dumps auf den ersten Hauch von zwielichtigen Eingang;

    Irgendwo danach können Sie beginnen, sich Gedanken über Leistung.

  8. 1

    Die Antwort des Jahrhunderts ist

    Nicht setzen den Karren vor das Pferd.

    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.

    • +1. Es ist besser, zu lernen, wie die performance zu Messen, für sich selbst, als zu bitten, für die Leistung Regeln der Daumen von den anderen.
    • Thx. Ich fürchte, ich habe mich für ein Schmerz im Nacken, discoursing zu diesem Thema, wie in: stackoverflow.com/questions/1777556/alternatives-to-gprof/…
  9. 1

    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.

  10. 0

    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.

  11. 0

    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.

  12. 0

    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.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...