Algorithmische Leistungsfähigkeit

In der Informatik wird Leistungsfähigkeit verwendet, um Eigenschaften eines Algorithmus in Zusammenhang damit zu beschreiben, wie viel verschiedener Typen von Mitteln es verbraucht. Von algorithmischer Leistungsfähigkeit kann als analog der Technikproduktivität für ein Wiederholen oder dauernden Prozess gedacht werden, wo die Absicht ist, Quellenverbrauch einschließlich der Zeit zur Vollziehung zu einem annehmbaren, optimalen Niveau zu reduzieren.

Kein automatischer Prozess

Gregory Chaitin hat bewiesen, dass das Verbinden eines Algorithmus durch einen verallgemeinerten Algorithmus nicht automatisiert werden kann; eher kann es nur heuristisch, d. h. durch die erschöpfende Suche (Beispiele getan werden, die am Beschäftigten Biber zu finden sind), Probe und Fehler, Klugheit, Scharfsinnigkeit, Anwendung des induktiven Denkens usw.

Softwaremetrik

Die zwei am häufigsten gestoßene und messbare Metrik eines Algorithmus are: -

  • Geschwindigkeit oder Laufzeit - die Zeit nimmt es für einen Algorithmus, um, und zu vollenden
  • 'Raum' - das Gedächtnis oder 'die unvergängliche Lagerung' durch den Algorithmus während seiner Operation verwendet.

sondern auch könnte für gelten

  • Übertragungsgröße - wie erforderliche Bandbreite während der normalen Operation oder
des

und vielleicht sogar

  • die Größe des erforderlichen 'langfristigen' nach seiner Operation erforderlichen Speicherplatzes, seine Produktion zu registrieren oder seine erforderliche Funktion während seiner erforderlichen nützlichen Lebenszeit (Beispiele aufrechtzuerhalten: ein Datentisch, Archiv oder ein Computerklotz) und auch
  • die Leistung pro Watt und die Gesamtenergie, die durch die gewählte Hardware-Durchführung (mit seinen Systemanforderungen, notwendigen Hilfsunterstützungssystemen einschließlich Schnittstellen, des Kabelns, der Schaltung, des Abkühlens und der Sicherheit) während seiner erforderlichen nützlichen Lebenszeit verbraucht ist. Sieh Gesamtkosten des Eigentumsrechts für andere potenzielle Kosten, die mit jeder besonderen Durchführung vereinigt werden könnten.

(Ein äußerstes Beispiel von diesen, die Metrik sein könnte, ihre Werte in Bezug auf einen wiederholten einfachen Algorithmus zu denken, um zu berechnen und (π + n) zu 50 dezimalen Plätzen zu versorgen, die dafür laufen, sagt, 24 Stunden, auf einem Verarbeiter, der in seinem eigenen speziell angefertigten geheizt oder Luft funktioniert, haben Einheit bedingt.)

Der Prozess, Code effizienter zu machen, ist als Optimierung und im Fall von der automatischen Optimierung (d. h. Bearbeiter-Optimierung - durchgeführt durch Bearbeiter auf Anfrage oder standardmäßig) bekannt, konzentrieren Sie sich gewöhnlich auf Raum auf Kosten der Geschwindigkeit, oder umgekehrt. Es gibt auch ziemlich einfache Programmiertechniken und 'Aufhebungsstrategien', die wirklich beide zur gleichen Zeit, gewöhnlich ohne Rücksicht auf die Hardware, Software oder Sprache verbessern können. Sogar die Umstellung von verschachtelten bedingten Behauptungen, um die am wenigsten oft vorkommende Bedingung zu stellen, kann zuerst wirkliche Instruktionspfad-Länge reduzieren. Zum Beispiel könnte eine Bedingung Patienten für (Alter> 18) vor der Prüfung prüfen (Blutgruppe == 'AB-'), weil dieser Typ des Bluts in nur ungefähr 1 in 100 der Bevölkerung vorkommt. Das würde den zweiten Test an der Durchlaufzeit in 99 % von Beispielen beseitigen; etwas ein Optimierungsbearbeiter würde fast sicher nicht bewusst sein - aber der ein Programmierer relativ leicht sogar ohne Fachmann medizinische Kenntnisse erforschen kann.

Geschichte

Die ersten Maschinen, die zur Berechnung fähig waren, wurden durch rein mechanische Rücksichten streng beschränkt. Da später elektronische Maschinen entwickelt wurden, wurden sie abwechselnd durch die Geschwindigkeit ihrer elektronischen Kollegen beschränkt. Da Software festverdrahtete Stromkreise ersetzt hat, ist die Leistungsfähigkeit von Algorithmen auch wichtig geworden. Es ist lange anerkannt worden, dass die genaue 'Einordnung von Prozessen' in der abnehmenden Ablaufzeit kritisch ist.

:: Ada Lovelace 1815-1852, allgemein betrachtet als 'der erste Programmierer', der am frühen mechanischen Mehrzweckcomputer von Charles Babbage gearbeitet

hat

:: Der Extrakt von der "strukturierten Programmierung damit geht zu Behauptungen" von Donald Knuth, berühmtem Computerwissenschaftler und Professor, der der Kunst der Computerprogrammierung an der Universität von Stanford emeritiert ist.

:: zugeschrieben Jon Bentley und (Malcolm) Douglas McIlroy

Geschwindigkeit

Die absolute Geschwindigkeit eines Algorithmus für einen gegebenen Eingang kann einfach als die Dauer der Ausführung gemessen werden (oder Zeit zeigen), und die Ergebnisse können über mehrere Ausführungen durchschnittlich sein, um mögliche zufällige Effekten zu beseitigen. Die meisten modernen Verarbeiter funktionieren in einer Mehrverarbeitung & Mehrprogrammierung der Umgebung, so muss Rücksicht für parallele Prozesse gemacht werden, die auf derselben physischen Maschine vorkommen, diese so weit möglich beseitigend. Für Superskalarverarbeiter kann die Geschwindigkeit eines gegebenen Algorithmus manchmal durch den Instruktionsniveau-Parallelismus innerhalb eines einzelnen Verarbeiters verbessert werden (aber, für optimale Ergebnisse, kann der Algorithmus verlangen, dass etwas Anpassung an diese Umgebung bedeutenden Vorteil ('Beschleunigung'), das Werden, tatsächlich, ein völlig verschiedener Algorithmus gewinnt). Ein Verhältnismaß einer Algorithmus-Leistung kann manchmal von der Gesamtinstruktionspfad-Länge gewonnen werden, die durch einen Durchlaufzeit-Befehlssatz-Simulator (wo verfügbar) bestimmt werden kann.

Eine Schätzung der Geschwindigkeit eines Algorithmus kann auf verschiedene Weisen bestimmt werden. Der grösste Teil der üblichen Methodik verwendet Zeitkompliziertheit, um den Großen-O von einem Algorithmus zu bestimmen. Sieh Laufzeitanalyse, um zu schätzen, wie schnell ein besonderer Algorithmus gemäß seinem Typ sein kann (Beispiel: Lookup hat unsortierte Liste, lookup Liste usw. sortiert), und in Bezug auf die Skalierbarkeit - seine Abhängigkeit von der 'Größe des Eingangs', Verarbeiter-Macht und andere Faktoren.

Gedächtnis

Häufig ist es möglich, einen Algorithmus schneller auf Kosten des Gedächtnisses zu machen. Das könnte der Fall sein, wann auch immer das Ergebnis einer 'teuren' Berechnung versteckt wird, anstatt es von neuem jedes Mal wiederzuberechnen. Die zusätzliche Speichervoraussetzung würde in diesem Fall zusätzlich oberirdisch betrachtet, obwohl, in vielen Situationen, das versorgte Ergebnis sehr wenig Extraraum besetzt und häufig in der vorkompilierten statischen Lagerung gehalten werden kann, nicht nur Verarbeitungszeit sondern auch Zuteilung & deallocation des Arbeitsgedächtnisses reduzierend. Das ist eine sehr übliche Methodik, Geschwindigkeit so viel zu verbessern, so dass einige Programmiersprachen häufig Besonderheiten hinzufügen, um sie, wie C ++ 's 'veränderliches' Schlüsselwort zu unterstützen.

Die Speichervoraussetzung eines Algorithmus ist wirklich zwei getrennte, aber zusammenhängende things: -

  • Das Gedächtnis, das durch den kompilierten rechtskräftigen Code (der Gegenstand-Code oder die binäre Datei) selbst (auf der Platte oder Entsprechung, abhängig von der Hardware und Sprache) aufgenommen ist. Das kann häufig durch die Bevorzugung von Laufzeitentscheidungsbilden-Mechanismen (wie virtuelle Funktionen und Laufzeittyp-Information) über bestimmte Übersetzungszeit-Entscheidungsbilden-Mechanismen (wie Makroersatz und Schablonen) reduziert werden. Das kommt jedoch auf Kosten der Geschwindigkeit.
  • Der Betrag des vorläufigen "dynamischen Gedächtnisses" während der Verarbeitung zugeteilt. Zum Beispiel verbessern dynamisch vorversteckende Ergebnisse, wie erwähnt, früher, Geschwindigkeit auf Kosten dieses Attributes. Sogar die Tiefe von Unterprogramm-Anrufen kann schwer auf diese Kosten einwirken und Pfad-Länge auch besonders vergrößern, wenn es 'schwere' dynamische Speichervoraussetzungen für die besonderen angerufenen Funktionen gibt. Der Gebrauch von kopierten Funktionsrahmen (anstatt einfach Zeigestöcke zu früher, bereits definiert, und manchmal statische Werte zu verwenden), verdoppelt wirklich die Speichervoraussetzung für dieses besondere metrische Gedächtnis (sowie das Tragen seiner eigenen Verarbeitung oben für das Kopieren von sich. Das kann für 'ziemlich lange' Rahmen wie HTML-Schrift, Quellprogramme von JavaScript oder umfassender freeform Text wie Briefe oder E-Mails besonders wichtig sein.

(Siehe auch Abteilungswahl der Instruktion oder des Datentyps und des Vermeidens von Kosten bezüglich des absichtlichen 'Ausdehnens' von Datenstrukturen, um sie zu zwingen, eine feste Länge zu haben, die dann ein Vielfache 2, 4, 8 usw. wird)

Wiederverkörperung

Es ist behauptet worden, dass Wiederverkörperung, die (wiederrechnet), gelegentlich effizienter sein kann, als Holding auf geheimes Lager hinausläuft. Das ist der etwas nichtintuitive Glaube, dass es schneller sein kann, um vom Eingang wiederzurechnen - selbst wenn die Antwort bereits bekannt ist - wenn, wie man zeigen kann, es, in einigen speziellen Fällen, "Register-Druck" vermindert. Einige Optimierungsbearbeiter sind in der Lage zu entscheiden, wenn das lohnend gestützt auf mehreren Kriterien wie Kompliziertheit und keine Nebenwirkungen betrachtet wird, und durch das Nachgehen den Ausdruck arbeitet, der verwendet ist, um jede Variable, das Verwenden des Konzepts verfügbarer Ausdrücke zu schätzen.

Das wird höchstwahrscheinlich wahr sein, wenn eine Berechnung sehr schnell ist (wie Hinzufügung oder bitwise Operationen), während die Datenmenge, die versteckt werden muss, sehr groß sein würde, auf ineffiziente Lagerung hinauslaufend. Kleine Datenmengen können sehr effizient in Registern oder schnellem geheimem Lager versorgt werden, während in den meisten zeitgenössischen Computern große Datenmengen im langsameren Gedächtnis oder der noch langsameren Festplatte-Lagerung, und so der Leistungsfähigkeit versorgt werden müssen, Daten zu versorgen, die schnell Fälle bedeutsam geschätzt werden können.

Vorberechnung

Die Vorcomputerwissenschaft einer ganzen Reihe von Ergebnissen vor dem Kompilieren, oder am Anfang einer Ausführung eines Algorithmus, kann häufig algorithmische Leistungsfähigkeit wesentlich vergrößern. Das wird vorteilhaft, wenn ein oder mehr Eingänge zu einer genug kleinen Reihe beschränkt werden, dass die Ergebnisse in einem vernünftig großen Block des Gedächtnisses versorgt werden können. Weil Speicherzugang in der Zeitkompliziertheit im Wesentlichen unveränderlich ist (abgesehen vom Verstecken von Verzögerungen), jeder Algorithmus mit einem Bestandteil, der schlechter hat, als die unveränderliche Leistungsfähigkeit über eine kleine Eingangsreihe durch die Vorcomputerwissenschaft von Werten verbessert werden kann. In einigen Fällen können effiziente Annäherungsalgorithmen durch die Computerwissenschaft einer getrennten Teilmenge von Werten und das Interpolieren für Zwischeneingangswerte erhalten werden, da Interpolation auch eine geradlinige Operation ist.

Übertragungsgröße

Datenkompressionsalgorithmen können nützlich sein, weil sie helfen, den Verbrauch von teuren Mitteln, wie Festplatte-Raum oder Übertragungsbandbreite zu reduzieren. Das kommt jedoch auch an Kosten - der zusätzliche Verarbeitungszeit zur Kompresse ist und dekomprimieren Sie nachher. Abhängig von Geschwindigkeit der Datenübertragung kann Kompression gesamte Ansprechzeiten reduzieren, der schließlich entspricht, um zu eilen - wenn auch die Verarbeitung innerhalb des Computers selbst länger nimmt. Für das Audio ist MP3 eine Kompressionsmethode verwendet umfassend in tragbaren Tonanlagen. Die Leistungsfähigkeit eines Datenkompressionsalgorithmus verbindet mit dem Kompressionsfaktor und der Geschwindigkeit des Erzielens sowohl Kompression als auch Dekompression. Zum Zweck, eine umfassende Datenbank zu archivieren, könnte es lohnend betrachtet werden, ein sehr hohes Kompressionsverhältnis zu erreichen, da Dekompression mit geringerer Wahrscheinlichkeit auf der Mehrheit der Daten vorkommen wird.

Datenpräsentation

Produktionsdaten können dem Endbenutzer auf viele Weisen - solcher als über geschlagenes Band oder Karte, Digitaldisplays, lokale Anzeigemonitore, entfernte Computermonitore präsentiert oder gedruckt werden. Jeder von diesen hat seine eigenen innewohnenden anfänglichen Kosten und, in einigen Fällen, andauernde Kosten (z.B ein Image auswendig erfrischend). Als ein Beispiel ist das Firmenzeichen von Google ein PNG Image von 28K (oder) noch besetzt die rohe Textschnur für "Google" nur 6 Oktette oder 48 Bit (4,778 oder 8192mal weniger). Das illustriert grafisch, wie die Präsentation von Daten die gesamte Leistungsfähigkeit der Übertragung bedeutsam betreffen kann (und auch der ganze Algorithmus - da sowohl GIF als auch PNG Images Verarbeitung verlangen).

Es wird durch die "Internetwelt Stats" geschätzt, dass es 1,733,993,741 Internetbenutzer 2009 gab und, um dieses neue Image jedem von ihnen zu übersenden, würde verlangen, dass ungefähr 136,000 Milliarden (10) Oktette von Daten - mindestens einmal - in ihr persönliches geheimes Weblager übersandt werden. In "Rechenbetonten Energiekosten von TCP" untersuchen Mitverfasser Bokyung Wang und Suresh Singh die Energiekosten für TCP und berechnet, für ihr gewähltes Beispiel, Kosten von 0.022 Joule pro Paket (etwa 1489 Oktette). Auf dieser Basis könnten insgesamt ungefähr 2,000,000,000 Joule (2 GJ) der Energie durch TCP Elemente ausgegeben werden, die allein sind, um das neue Firmenzeichen für alle Benutzer zum ersten Mal zu zeigen. Dieses Image aufrechtzuerhalten oder wieder darzustellen, verlangen noch mehr Verarbeitung und folgenreiche Energiekosten (im Gegensatz zur Druckausgabe zum Beispiel).

Die Verschlüsselung und die Entzifferung von Methoden (verglichen und gegenübergestellt)

Wenn Daten für jeden 'Außen'-Gebrauch verschlüsselt werden, ist es möglich, so in einer fast unbegrenzten Vielfalt von verschiedenen Formaten zu tun, die manchmal kollidieren. Diese Inhalt-Verschlüsselung (der rohen Daten) kann entworfen werden für:

(Für die Charakter-Niveau-Verschlüsselung, sieh das verschiedene Techniken wie EBCDIC oder ASCII verschlüsseln)

Es ist unwahrscheinlich, dass alle diese Absichten mit einem einzelnen 'allgemeinen' Verschlüsselungsschema entsprochen werden konnten, und so wird ein Kompromiss häufig die gewünschte Absicht sein und wird häufig durch das Bedürfnis nach der Standardisierung und/oder dem Vermächtnis und den Vereinbarkeitsproblemen in Verlegenheit gebracht.

Verschlüsselung effizient

Für die Datenverschlüsselung, deren Bestimmungsort für die weitere Computerverarbeitung eingegeben werden soll, ist Lesbarkeit nicht ein Problem - da der Empfang-Verarbeiter-Algorithmus die Daten zu jeder anderen wünschenswerten Form einschließlich des lesbaren Menschen decodieren kann. Von der Perspektive der algorithmischen Leistungsfähigkeit, nachfolgende Entzifferung (mit der Null oder minimalen Syntaxanalyse) minimierend, sollte höchsten Vorrang nehmen. Die allgemeine Faustregel besteht darin, dass jedes Verschlüsselungssystem, das die zu Grunde liegende Datenstruktur - genug 'versteht', um es an erster Stelle zu verschlüsseln - zur leichten Verschlüsselung davon auf solche Art und Weise ebenso fähig sein sollte, der Entzifferung davon hoch effizient macht. Für Daten der variablen Länge mit vielleicht weggelassenen Datenwerten, zum Beispiel, bedeutet das fast sicher die Anwendung der Aussagenotation (d. h. einschließlich der Länge des Datenartikels als ein Präfix zu den Daten, so dass ein Begrenzungszeichen nicht erforderlich ist und völlig beseitigt grammatisch analysierend). Für Schlüsselwort-Datensachen tokenizing der Schlüssel zu einem Index (ganze Zahl) nachdem reduziert sein erstes Ereignis nicht nur nachfolgende Datengröße, aber reduziert außerdem Zukunft, die oben für dieselben Sachen decodiert, die wiederholt werden.

Weil mehr 'allgemeine' Verschlüsselung für die effiziente Datenkompression Arithmetische Verschlüsselung und Wärmegewicht-Verschlüsselungsartikel sieht.

Historisch war optimale Verschlüsselung von einer Leistungsfähigkeitseinstellung nicht nur lohnend, aber war auch allgemeine Praxis, um wertvolles Gedächtnis, Außenlagerung und Verarbeiter-Mittel zu erhalten. Einmal gültig gemacht konnte ein Landesname zum Beispiel als eine kürzere folgende internationale Vorwahl gehalten werden, die dann auch als ein Index für die nachfolgende 'Entzifferung', mit diesem Code als eine Zugang-Zahl innerhalb eines Tisches oder Aktennummer innerhalb einer Datei handeln konnte. Wenn der Tisch oder die Datei befestigte Länge-Einträge enthalten haben, konnte der Code zu einer absoluten Speicheradresse oder Plattenadresse für die schnelle Wiederauffindung leicht umgewandelt werden. Das System der internationalen Standardbuchnummer, um Bücher zu identifizieren, ist ein gutes Beispiel einer praktischen Verschlüsselungsmethode, die auch eine eingebaute Hierarchie enthält.

Gemäß neuen Artikeln im Neuen Wissenschaftler und Wissenschaftlichen Amerikaner;

"HEUTIGE Fernmeldenetze konnten eine zehntausendste von der Macht verwenden, die sie jetzt verbrauchen, wenn klügere datencodierende Techniken verwendet wurden" gemäß Glockenlaboratorien, die in Murray Hill, New Jersey gestützt sind, erkennt Sie an, dass das nur eine theoretische Grenze ist, aber dennoch eine realistischere, praktische Absicht der 1,000 Falte-Verminderung innerhalb von 5 Jahren mit zukünftigen, bis jetzt unbekannten, technologischen Änderungen setzt.

Beispiele von mehreren allgemeinen Verschlüsselungsmethoden

  • Komma hat Werte (CSV - eine Liste von Datenwerten getrennt, die durch Kommas getrennt sind)
  • Etikett hat Werte getrennt (TSV) - eine Liste von Datenwerten, die durch 'Etikett'-Charaktere getrennt sind
  • Preiserhöhungssprache von HyperText (HTML) - die vorherrschende Preiserhöhungssprache für Webseiten
  • Ausziehbare Preiserhöhungssprache (XML) - ein allgemeines Fachwerk, um jeden Betrag des Textes oder irgendwelche Daten zu versorgen, deren Struktur als ein Baum mit mindestens einem Element - das Wurzelelement vertreten werden kann.
  • Gegenstand-Notation von JavaScript (JSON) - menschlich-lesbares Format, um einfache Datenstrukturen zu vertreten

Der letzte von diesen, (JSON) wird anscheinend für die Internetdatenübertragung weit verwendet, in erster Linie scheint es, weil die Daten von einzelnem JavaScript 'eval' Behauptung - ohne das Bedürfnis geladen werden können zu erzeugen, was wahrscheinlich sonst gebauter encoder/decoder eines effizienteren Zwecks gewesen wäre. Es gibt tatsächlich ziemlich große Beträge von wiederholten (und deshalb überflüssige Daten) in diesem besonderen Format, und auch im HTML und der XML Quelle, die ganz leicht beseitigt werden konnte.

XML wird als eine wortreiche Form der Verschlüsselung anerkannt. Binärer XML ist als eine Methode vorgebracht worden, Übertragungszeiten und Verarbeitungszeiten für XML zu reduzieren, und, während es mehrere konkurrierende Formate gibt, ist niemand von einer Standardorganisation weit angenommen oder als ein De-Facto-Standard akzeptiert worden. Es ist auch von Jimmy Zhang dafür kritisiert worden, im Wesentlichen zu versuchen, das falsche Problem zu beheben

Es gibt mehrere frei verfügbare Produkte auf dem Markt, dass teilweise Kompresse-HTML-Dateien und einige oder den ganzen folgenden durchführen:

  • Verflechtungslinien
  • entfernen Sie unnötige whitespace Charaktere
  • entfernen Sie unnötige Anführungszeichen. Zum Beispiel wird GRENZE = "0" durch BORDER=0 ersetzt)
  • ersetzen Sie einige Anhängsel durch kürzere (z.B ersetzen SCHLAG-Anhängsel durch S, der mit B und EM mit mir stark ist)
,
  • entfernen Sie HTML-Anmerkungen (Anmerkungen innerhalb von Schriften, und Stile werden nicht entfernt)
  • umziehen
  • entfernen Sie genannte meta Anhängsel

Die Wirkung dieser beschränkten Form der Kompression soll das HTML kleiner und schneller codieren lassen, um zu laden, aber schwieriger, manuell zu lesen (so wird der ursprüngliche HTML-Code gewöhnlich behalten, um zu aktualisieren), aber da es vorherrschend gemeint wird, um nur durch einen Browser bearbeitet zu werden, verursacht das keine Probleme. Trotz dieser kleinen Verbesserungen bleibt HTML, das die vorherrschende Sprache für das Web noch ist, vorherrschend Quelle verteilte, interpretierte Preiserhöhungssprache mit der hohen Überfülle.

Kompliziertheit von Kolmogorov

Die Studie, Techniken zu verschlüsseln, ist eingehend in einem Gebiet der Informatik untersucht worden, die durch eine als Kompliziertheit von Kolmogorov bekannte Methode charakterisiert ist, wo ein Wert bekannt als (K) als 'nicht eine berechenbare Funktion' akzeptiert wird. Die Kompliziertheit von Kolmogorov jedes berechenbaren Gegenstands ist die Länge des kürzesten Programms, das es schätzt und dann hinkt. Der invariance Lehrsatz zeigt, dass es nicht wirklich wichtig ist, welcher Computer verwendet wird. Im Wesentlichen deutet das an, dass es keine automatisierte Methode gibt, die ein optimales Ergebnis erzeugen kann und deshalb durch eine Voraussetzung für den menschlichen Einfallsreichtum oder die Neuerung charakterisiert wird.

FFT Beschleunigung

Eine neue bedeutende Neuerung, in Zusammenhang mit FFT Algorithmen, kann Verarbeitungszeiten durch einen Faktor nicht weniger als 10,000 vermindert haben. Der Einfluss dieser Beschleunigung, ermöglicht zum Beispiel, tragbaren Rechengeräten, weniger Macht zu verbrauchen

Siehe auch Algorithmische Wahrscheinlichkeit.

Wirkung, Paradigmen zu programmieren

Um die Wirkung, die verschiedene Programmierparadigmen auf der algorithmischen Leistungsfähigkeit haben, wird wild gekämpft, sowohl mit Unterstützern als auch mit Gegnern für jedes neue Paradigma. Starke Unterstützer der strukturierten Programmierung, wie Dijkstra zum Beispiel, die völlig goto-weniger Programme bevorzugen, werden mit widerstreitenden Beweisen getroffen, die scheinen, seine angenommenen Vorteile ungültig zu machen.

Die Wahrheit ist, selbst wenn der strukturierte Code selbst keinen gotos enthält, erzeugt der Optimierungsbearbeiter, der den binären Code fast sicher schafft, sie (und nicht notwendigerweise auf die effizienteste Weise).

Ähnlich sind OOP Hauptfiguren, die ihr Paradigma fordern, vorgesetzt werden mit der Opposition von starken Skeptikern wie Alexander Stepanov entsprochen, der vorgeschlagen hat, dass OOP einen mathematisch beschränkten Gesichtspunkt zur Verfügung stellt und ihn, "fast so eine große einer Falschmeldung genannt hat wie Künstliche Intelligenz"

Auf lange Sicht stellen Abrisspunkte, mit wahren Beispielen, die einzige echte Hoffnung darauf zur Verfügung, solche Konflikte - mindestens in Bezug auf die Laufzeitleistungsfähigkeit aufzulösen.

Optimierungstechniken

Das Wort optimiert wird normalerweise in Bezug auf ein vorhandenes Programm des Algorithmus/Computers verwendet (d. h. vollendeten Code zu übertreffen). In dieser Abteilung wird es sowohl im Zusammenhang von vorhandenen Programmen als auch im Design und der Durchführung von neuen Algorithmen verwendet, dadurch die allgemeinsten Leistungsfallen vermeidend. Es ist klar verschwenderisch, ein Arbeitsprogramm - beim ersten Verwenden eines Algorithmus zu erzeugen, der alle Leistungsfähigkeitsprobleme ignoriert - um nur dann Abteilungen davon, wenn gefunden, neu entwerfen oder umzuschreiben zu müssen, um schlechte Leistung anzubieten. Optimierung kann in zwei domains: - weit gehend kategorisiert werden

sind
  • Allgemeine Techniken - die ohne Rücksicht auf die Plattform gelten

Spezifische Umgebung

Die Optimierung von Algorithmen hängt oft von den Eigenschaften der Maschine ab der Algorithmus wird auf sowie die Sprache durchgeführt, die der Algorithmus in und gewählte Datentypen geschrieben wird. Zum Beispiel könnte ein Programmierer Code für die Zeitleistungsfähigkeit in einer Anwendung für Hauscomputer optimieren (mit beträchtlichen Beträgen des Gedächtnisses), aber für den Code, der bestimmt ist, um in kleinen, "speicherdichten" Geräten eingebettet zu werden, kann der Programmierer akzeptieren müssen, dass es langsamer einfach wegen des eingeschränkten für jede potenzielle Softwareoptimierung verfügbaren Gedächtnisses laufen wird.

Für eine Diskussion der Hardware-Leistung, sieh den Artikel über die Computerleistung, die solche Dinge wie Zentraleinheitsuhr-Geschwindigkeit, Zyklen pro Instruktion und andere relevante Metrik bedeckt. Für eine Diskussion auf wie die Wahl von besonderen auf einer spezifischen Maschinenwirkungsleistungsfähigkeit verfügbaren Instruktionen, sieh spätere Abteilung 'Wahl der Instruktion und des Datentyps'.

Allgemeine Techniken

  • Geradlinige Suche wie unsortiertes Tabellensuchen kann insbesondere in Bezug auf die Ausführungszeit sehr teuer sein, aber kann bedeutsam durch den Gebrauch von effizienten Techniken wie mit einem Inhaltsverzeichnis versehene Reihe und binäre Suchen reduziert werden. Das Verwenden einer einfachen geradlinigen Suche auf dem ersten Ereignis und das Verwenden eines versteckten Ergebnisses sind danach ein offensichtlicher Kompromiss.
  • Gebrauch des mit einem Inhaltsverzeichnis versehenen Programm-Ausbreitens, das Verwenden von Zweigtischen oder "hat Code eingefädelt", um Programm-Fluss zu kontrollieren, (anstatt vielfach bedingt WENN Behauptungen oder unoptimierter FALL/SCHALTER zu verwenden), kann Instruktionspfad-Länge drastisch reduzieren, gleichzeitig Programm-Größe reduzieren und sogar auch ein Programm leichter machen zu lesen und leichter haltbar (tatsächlich es wird eine 'Entscheidungstabelle' aber nicht wiederholender Spaghetti-Code).
  • Schleife entfaltend durchgeführt manuell, oder mehr gewöhnlich durch einen Optimierungsbearbeiter, kann bedeutende Ersparnisse in einigen Beispielen zur Verfügung stellen. Durch die Verarbeitung von 'Blöcken' von mehreren Reihe-Elementen auf einmal, individuell gerichtet, (zum Beispiel, innerhalb einer Schleife), kann viel Zeigestock-Arithmetik und Ende der Schleife-Prüfung beseitigt werden, auf verminderte Instruktionspfad-Längen hinauslaufend. Andere Schleife-Optimierungen sind auch möglich.

Tunnel-Vision

Es gibt viele Techniken, um Algorithmen zu verbessern, aber sich auf eine einzelne Lieblingstechnik zu konzentrieren, kann zu einer "Tunnel Vision" Mentalität führen. Zum Beispiel, in diesem X86 Zusammenbau-Beispiel, bietet der Autor Schleife an, die sich als eine angemessene Technik entfaltet, die ungefähr 40 % Verbesserungen zu seinem gewählten Beispiel zur Verfügung stellt. Jedoch würde dasselbe Beispiel bedeutsam sowohl aus inlining als auch aus Gebrauch einer trivialen Kuddelmuddel-Funktion einen Nutzen ziehen. Wenn sie durchgeführt wurden entweder als alternative oder ergänzende Techniken, könnte ein noch größerer Prozentsatz-Gewinn erwartet werden. Eine Kombination von Optimierungen kann jemals zunehmende Geschwindigkeit zur Verfügung stellen, aber die Auswahl an der am leichtesten durchgeführten und wirksamsten Technik, aus einem großen Repertoire solcher Techniken, ist als ein Startpunkt wünschenswert.

Abhängigkeitsbäume und Spreadsheets

Spreadsheets sind ein 'spezieller Fall' von Algorithmen, die auf Grund von ihren Abhängigkeitsbäumen selbstoptimieren, die dem Design von Spreadsheets innewohnend sind, um Wiederberechnungen zu reduzieren, wenn sich eine Zelle ändert. Die Ergebnisse von früheren Berechnungen werden innerhalb der Betriebsanleitung effektiv versteckt und nur aktualisiert, wenn ein anderer Zellen haben Wert geändert, es direkt bewirkt.

Tisch lookup

Tisch lookups kann viele Algorithmen effizienter, besonders wenn verwendet, machen, Berechnung mit einer Kompliziertheit der höchsten Zeit zu umgehen. Jedoch, wenn eine breite Eingangsreihe erforderlich ist, können sie bedeutende Lagerungsmittel verbrauchen. In Fällen mit einem spärlichen gültigen Eingangssatz können Kuddelmuddel-Funktionen verwendet werden, um effizienteren lookup Zugang zur Verfügung zu stellen, als ein voller Tisch.

Kuddelmuddel-Funktionsalgorithmen

Eine Kuddelmuddel-Funktion ist jedes bestimmte Verfahren oder mathematische Funktion, die einen großen, vielleicht variable-große Datenmenge in eine kleine Gegebenheit, gewöhnlich eine einzelne ganze Zahl umwandelt, die als ein Index einer Reihe dienen kann. Die durch eine Kuddelmuddel-Funktion zurückgegebenen Werte werden Kuddelmuddel-Werte, Kuddelmuddel-Codes, Kuddelmuddel-Summen oder einfach Kuddelmuddel genannt.

Kuddelmuddel-Funktionen werden oft verwendet, um Tisch lookups zu beschleunigen. Die Wahl einer Hashing-Funktion (um eine geradlinige Suche oder Suche der rohen Gewalt zu vermeiden), hängt kritisch von der Natur der Eingangsdaten und ihrem Wahrscheinlichkeitsvertrieb in der beabsichtigten Anwendung ab.

Triviale Kuddelmuddel-Funktion

Manchmal, wenn die Gegebenheit klein genug ist, kann eine "triviale Kuddelmuddel-Funktion" verwendet werden, um unveränderliche Zeitsuchen an fast Nullkosten effektiv zur Verfügung zu stellen. Das ist für das einzelne Byte lookups besonders wichtig (z.B. ASCII oder EBCDIC Charaktere)

Suche von Schnuren

Das Suchen nach besonderen Textschnuren (zum Beispiel "Anhängsel" oder Schlüsselwörter) in langen Folgen von Charakteren erzeugt potenziell lange Instruktionspfade. Das schließt das Suchen nach Begrenzungszeichen in getrennte Dateien des Kommas oder ähnliche Verarbeitung ein, die sehr einfach (das Verwenden der Aussagenotation zum Beispiel) und effektiv beseitigt werden kann.

Mehrere Methoden, die Kosten für die allgemeine Suche zu reduzieren, sind untersucht worden, und der "Schnur-Suchalgorithmus von Boyer-Moore" (oder Boyer-Moore-Horspool Algorithmus, eine ähnliche, aber modifizierte Version) sind eine Lösung, die, wie man bewiesen hat, höhere Ergebnisse wiederholenden Vergleichen der kompletten Suche gegeben hat, halten die Folge hin.

Krisenherd Analysatoren

Spezielle Systemsoftwareprodukte, die als "Leistung bekannt sind, Analysatoren" sind häufig von Lieferanten verfügbar, um zu helfen, "Krisenherde" - während der wirklichen Ausführung von Computerprogrammen - dem Verwenden echt oder Testdaten zu diagnostizieren - führen sie eine Leistungsanalyse unter allgemein repeatable Bedingungen durch. Sie können Abteilungen des Programms genau feststellen, das aus spezifisch ins Visier genommener Programmierer-Optimierung einen Nutzen ziehen könnte, ohne Zeit notwendigerweise zu verbringen, den Rest des Codes optimierend. Mit Programm-Wiederholungen kann ein Maß der Verhältnisverbesserung dann beschlossen werden zu entscheiden, ob die Optimierung erfolgreich war und wodurch Betrag. Befehlssatz-Simulatoren können als eine Alternative verwendet werden, um die Instruktionspfad-Länge am Maschinencodeniveau zwischen ausgewählten Ausführungspfaden, oder auf der kompletten Ausführung zu messen.

Unabhängig vom Typ des verwendeten Werkzeugs können die quantitativen erhaltenen Werte in der Kombination mit den vorausgesehenen Verminderungen (für den ins Visier genommenen Code) verwendet werden, um ein relatives oder absolutes gesamtes Sparen zu schätzen. Zum Beispiel, wenn 50 % der Gesamtausführungszeit (oder Pfad-Länge) in ein Unterprogramm vertieft sind, dessen Geschwindigkeit durch die Programmierer-Optimierung verdoppelt werden kann, könnte ein gesamtes Sparen von ungefähr 25 % (Gesetz von Amdahl) erwartet werden.

Anstrengungen sind an der Universität Kaliforniens, Irvine gemacht worden, um dynamischen rechtskräftigen Code mit einer Kombination der Krisenherd-Analyse und des Laufzeitprogramm-Spur-Baums zu erzeugen. Ein JIT wie dynamischer Bearbeiter wurde von Andreas Gal und anderen, "gebaut, in dem wichtig (d. h. oft durchgeführt) Kontrollflüsse... träge während der Ausführung" entdeckt werden

Der Abrisspunkt & Wettbewerbsalgorithmen

Für neue Versionen der Software oder Vergleiche mit Wettbewerbssystemen zu versorgen, werden Abrisspunkte manchmal verwendet, die mit der Messung einer Algorithmus-Verhältnisleistung helfen. Wenn ein neuer Sorte-Algorithmus zum Beispiel erzeugt wird, kann es im Vergleich zu seinen Vorgängern sein, um sicherzustellen, dass mindestens es wie zuvor mit bekannten Daten effizient ist - irgendwelche funktionellen Verbesserungen in Betracht ziehend.

Abrisspunkte können von Kunden verwendet werden, wenn man verschiedene Produkte von alternativen Lieferanten vergleicht, um zu schätzen, welches Produkt am besten ihren spezifischen Voraussetzungen in Bezug auf die Funktionalität und Leistung anpassen wird. Zum Beispiel in der Großrechner-Welt bewerben sich bestimmte Eigentumssorte-Produkte von unabhängigen Softwaregesellschaften wie Syncsort mit Produkten von den Hauptlieferanten wie IBM für die Geschwindigkeit.

Einige Abrisspunkte stellen Gelegenheiten zur Verfügung, für eine Analyse zu erzeugen, die die Verhältnisgeschwindigkeit von verschiedenen kompilierten und interpretierten Sprachen zum Beispiel vergleicht

und Das Computersprachabrisspunkt-Spiel vergleicht die Leistung von Durchführungen von typischen Programmierproblemen auf mehreren Programmiersprachen.

(Sogar das Schaffen "tut es selbst" Abrisspunkte, um mindestens eine Anerkennung der Verhältnisleistung von verschiedenen Programmiersprachen, mit einer Vielfalt des Benutzers angegeben Kriterien zu bekommen, ist ziemlich einfach, als diese "Neun Sprachleistungszusammenfassung" von Christopher W. zu erzeugen. Cowell-Schah demonstriert durch das Beispiel)

Kompiliert gegen interpretierte Sprachen

Ein kompilierter Algorithmus wird im Allgemeinen schneller durchführen als der gleichwertige interpretierte Algorithmus einfach, weil etwas Verarbeitung sogar in der Durchlaufzeit erforderlich ist, 'zu verstehen' (d. h. zu dolmetschen), die Instruktionen, eine Ausführung zu bewirken. Ein kompiliertes Programm wird normalerweise Produktion ein Gegenstand oder Maschinencode, der des Algorithmus gleichwertig ist, der bereits durch den Bearbeiter in eine Form bearbeitet worden ist, die mehr sogleich durch den Mikrocode oder die Hardware direkt durchgeführt ist. Die populäre Sprache von Perl ist ein Beispiel einer interpretierten Sprache, und Abrisspunkte zeigen an, dass sie etwa 24mal langsamer durchführt als kompilierter C.

Optimierung von Bearbeitern

Viele Bearbeiter haben Eigenschaften, die versuchen, den Code zu optimieren, den sie erzeugen, einige der Techniken verwertend, die in diesem Artikel und anderen entworfen sind, die zur Kompilation selbst spezifisch sind. Schleife-Optimierung ist häufig der Fokus, Bearbeiter zu optimieren, weil bedeutende Zeit in Programm-Schleifen verbracht wird und parallele in einer Prozession gehende Gelegenheiten häufig durch den automatischen Code erleichtert werden können, der wie sich entfaltende Schleife umstrukturiert. Optimierungsbearbeiter sind keineswegs vollkommen. Es gibt keine Weise, wie ein Bearbeiter versichern kann, dass, für den ganzen Programm-Quellcode, das schnellste (oder am kleinsten) mögliches gleichwertiges kompiliertes Programm Produktion ist; solch ein Bearbeiter ist im Wesentlichen unmöglich, weil er das stockende Problem beheben würde. Zusätzlich haben sogar Optimierungsbearbeiter allgemein keinen Zugang zur Laufzeitmetrik, um ihnen zu ermöglichen, Optimierung durch 'das Lernen' zu verbessern.

Gerade rechtzeitig Bearbeiter

Verarbeiter 'Während der Übertragung' bekannt heute als gerade rechtzeitig oder 'JIT' Bearbeiter verbinden Eigenschaften von interpretierten Sprachen mit kompilierten Sprachen und können auch Elemente der Optimierung in einem größeren oder kleineren Ausmaß vereinigen. Im Wesentlichen kann der JIT Bearbeiter kleine Abteilungen von Quellcodebehauptungen kompilieren (oder bytecode), weil auf sie kürzlich gestoßen wird und (gewöhnlich) das Ergebnis für das nächste Mal behält, wenn dieselbe Quelle bearbeitet wird. Außerdem können vorkompilierte Segmente des Codes in - liniert oder genannt als dynamische Funktionen sein, die selbst ebenso schnell leisten, weil die gleichwertige 'Gewohnheit' Funktion kompiliert hat. Weil der JIT Verarbeiter auch Zugang zur Laufzeitinformation hat (den ein normaler Bearbeiter nicht haben kann), ist es auch dafür möglich, weitere Ausführungen abhängig von Eingang zu optimieren und auch andere introspektive Laufzeitoptimierung durchzuführen, als Ausführung weitergeht. Ein JIT Verarbeiter, oder kann nicht, kann sich selbst vereinigen, Code oder seine Entsprechung durch das Schaffen 'schnellen Pfads' Wege durch einen Algorithmus modifizierend. Es kann auch solche Techniken als dynamische Bruchkaskadierung oder jedes andere ähnliche auf der gesammelten wirklichen Laufzeitmetrik gestützte Laufzeitgerät verwenden.

Es ist deshalb völlig möglich, dass ein JIT Bearbeiter könnte (Schalter intuitiv) führen noch schneller durch als ein optimal 'optimiertes' kompiliertes Programm.

Das Selbständern des Codes

Wie oben erwähnt gerade rechtzeitig machen Bearbeiter häufig umfassenden Gebrauch, Code zu selbstmodifizieren, um die wirklichen Maschineninstruktionen zu erzeugen, die erforderlich sind, durchgeführt zu werden. Die Technik kann auch verwendet werden, um Instruktionspfad-Längen in Anwendungsprogrammen zu reduzieren, wo sonst wiederholende bedingte Tests innerhalb des Hauptprogramm-Flusses sonst erforderlich sein könnten. Das kann besonders nützlich sein, wo eine U-Boot-Routine Beseitigen-Code eingebettet haben kann, der irgendein (Prüfung der Weise) aktiv oder (Produktionsweise) abhängig von einem Eingangsparameter untätig ist. Eine einfache Lösung mit einer Form des dynamischen Verschickens besteht darin, wo der U-Boot-Routine-Zugang-Punkt an der Initialisierung abhängig von Eingangsparameter dynamisch 'getauscht' wird. Zugang-Punkt A) schließt den Beseitigen-Codeprolog ein, und Zugang spitzen an, dass B) den Prolog ausschließt; so alle oben außer dem anfänglichen 'Test und Tausch' beseitigend (selbst wenn Test/Beseitigen ausgewählt wird, wenn die Gemeinkosten einfach der Code des Tests/Beseitigens selbst sind).

Genetischer Algorithmus

In der Welt verwandter Algorithmen der Leistung lohnt es sich, die Rolle von genetischen Algorithmen zu erwähnen, die sich mit ähnlichen Methoden an der natürlichen Welt im Beseitigen untergeordneter Algorithmen zu Gunsten von effizienteren Versionen bewerben.

Gegenstand-Code optimizers

Ein Eigentumsprogramm optimizers wie das "COBOL Optimizer, der" von Capex Corporation Mitte der 1970er Jahre für das COBOL entwickelt ist, hat wirklich den ungewöhnlichen Schritt gemacht, den Gegenstand-Code (oder binäre Datei) nach der normalen Kompilation zu optimieren. Dieser Typ von optimizer, kürzlich manchmal gekennzeichnet als ein "Postpass" optimizer oder Guckloch optimizer, hat in diesem Fall auf Kenntnisse von 'Schwächen' im Standardbearbeiter von IBM COBOL abgehangen und hat wirklich ersetzt (oder hat geflickt) Abteilungen des Gegenstand-Codes mit dem effizienteren Code.

Mehrere andere Lieferanten haben kürzlich dieselbe Annäherung angenommen. Sieh Hauptartikel für die Liste dieser Produkte

Anordnung von Daten

Die meisten Verarbeiter führen schneller durch, wenn bestimmte Datenwerte auf dem Wort, doubleword oder den Seitengrenzen ausgerichtet werden. Entwerfen Sie wenn möglich, Strukturen/angeben Sie, um passende Anordnungen zu befriedigen. Das vermeidet Ausnahmen.

Gegend der Verweisung

Um geheimes Lager Fräulein-Ausnahmen zu reduzieren, indem Sie gute Raumgegend der Verweisung zur Verfügung stellen, geben Sie 'hohe Frequenz '/volatile Arbeitslagerungsdaten innerhalb der definierten Struktur (En) an, so dass sie auch von aneinander grenzenden Abteilungen des Gedächtnisses zugeteilt (aber nicht vielleicht über viele Seiten gestreut werden). Gruppe hat nah Datenwerte auch 'physisch' eng miteinander innerhalb dieser Strukturen verbunden. Denken Sie die Möglichkeit, eine 'künstliche' Struktur zu schaffen, um einige sonst ohne Beziehung, aber dennoch oft Verweise angebracht, Sachen zusammen zu gruppieren.

Wahl der Instruktion oder des Datentyps

Besonders auf einer Zusammenbau-Sprache (obwohl auch anwendbar, auf HLL Behauptungen), die Wahl einer besonderen 'Instruktion' oder Datentyps, kann einen großen Einfluss auf Ausführungsleistungsfähigkeit haben. Im Allgemeinen, Instruktionen, dass Prozessvariablen solcher, wie unterzeichnet, oder nicht unterzeichnete 16-bit- oder ganze 32-Bit-Zahlen schneller sind als diejenigen, die Schwimmpunkt oder gepackte Dezimalzahl bearbeiten. Moderne Verarbeiter sind sogar dazu fähig, vielfachen 'festen Punkt' Instruktionen in der Parallele mit der gleichzeitigen Ausführung einer Schwimmpunkt-Instruktion durchzuführen. Wenn die größte zu stoßende ganze Zahl durch den 'schnelleren' Datentyp angepasst werden kann, die Variablen definierend, weil dieser Typ auf schnellere Ausführung - seitdem hinauslaufen wird, wird sogar ein Nichtoptimierungsbearbeiter tatsächlich 'gezwungen', passende Instruktionen zu wählen, die schneller durchführen werden, als mit mit 'langsameren' Instruktionen vereinigten Datentypen der Fall gewesen wäre. Assemblerprogrammierer (und Optimierungsbearbeiter-Schriftsteller) können dann auch aus der Fähigkeit einen Nutzen ziehen, bestimmte allgemeine Typen der Arithmetik zum Beispiel - Abteilung durch 2, 4, 8 usw. durchzuführen, indem sie die sehr viel schnelleren binären Verschiebungsrecht-Operationen (in diesem Fall durch 1, 2 oder 3 Bit) durchführen.

Wenn die Wahl des Eingangsdatentyps nicht unter der Kontrolle des Programmierers ist, obwohl vorherige Konvertierung (außerhalb einer Schleife zum Beispiel) zu einem schnelleren Datentyp einige oben trägt, kann es häufig lohnend sein, wenn die Variable dann als ein Schleife-Schalter besonders verwendet werden soll, wenn die Zählung ganz ein hoher Wert sein konnte oder es viele Eingangswerte gibt, um in einer Prozession zu gehen. Wie oben erwähnt kann die Wahl von individuellen Assemblerbefehlen (oder sogar manchmal gerade ihre Ordnung der Ausführung) auf besonderen Maschinen die Leistungsfähigkeit eines Algorithmus betreffen. Sieh Zusammenbau-Optimierungstipps für eine ziemlich zahlreiche geheimnisvolle Liste von verschiedenen technisch (und manchmal nichtintuitiv) Rücksichten für die Wahl von Montageanleitungen auf verschiedenen Verarbeitern, die auch die Verdienste jedes Falls bespricht. Manchmal können Mikrocode oder Hardware-Marotten auf unerwartete Leistungsunterschiede zwischen Verarbeitern hinauslaufen, die Assemblerprogrammierer für aktiv codieren können - oder spezifisch vermeiden, wenn Strafen - etwas resultieren, was sogar der beste Optimierungsbearbeiter nicht entworfen werden darf, um zu behandeln.

Datenkörnung

Das größere die Körnung von Datendefinitionen (wie das Aufspalten einer geografischen Adresse in getrennte Felder der Straße/Stadt/Postleitzahl) kann Leistung Oberimplikationen während der Verarbeitung haben. Die höhere Körnung in diesem Beispiel deutet an, dass mehr Verfahren Objektorientierte Programmierung und parallele Rechenumgebungen herbeiruft, da auf die zusätzlichen Gegenstände über vielfache Methode-Anrufe aber nicht vielleicht ein zugegriffen wird.

Unterprogramm-Körnung

Für die strukturierte Programmierung und Verfahrensprogrammierung im Allgemeinen wird großer Wert auf das Entwerfen von Programmen als eine Hierarchie (oder mindestens eine Reihe) Unterprogramme gelegt. Für den Gegenstand orientierte Programmierung ist der Methode-Anruf (ein Unterprogramm-Anruf) die Standardmethode, alle Werte in Gegenständen zu prüfen und zu setzen und so zuzunehmen, Datenkörnung verursacht folglich vergrößerten Gebrauch von Unterprogrammen.

Je größer die Körnung des Unterprogramm-Gebrauchs, desto größer das Verhältnis der Verarbeitungszeit, die dem Mechanismus der Unterprogramm-Verbindungen selbst gewidmet ist. Die Anwesenheit eines (genannten) Unterprogramms in einem Programm trägt nichts Zusätzliches zur Funktionalität des Programms bei. Das Ausmaß, in denen Unterprogrammen (und ihre folgenden Speichervoraussetzungen) die gesamte Leistung des ganzen Algorithmus beeinflusst, hängt weit gehend von der wirklichen Durchführung ab.

In Zusammenbau-Sprachprogrammen braucht die Beschwörung eines Unterprogramms nicht viel oben einzuschließen, normalerweise gerade einige Maschineninstruktionen zur normalen Instruktionspfad-Länge hinzufügend, jeder, die Kontrolle verändernd, fließt entweder ins Unterprogramm oder davon (das Sparen des Staates auf einem Stapel zurückkehrend, der, abhängig von der Kompliziertheit des Unterprogramms und seiner Voraussetzung fakultativ ist, um allgemeine Zweck-Register wiederzuverwenden). In vielen Fällen können kleine Unterprogramme, die oft verwendete Datentransformationen mit 'allgemeinen Zweck' Arbeitsbereiche durchführen, ohne das Bedürfnis vollbracht werden, irgendwelche Register einschließlich des Rückregisters zu sparen oder wieder herzustellen.

Im Vergleich rufen HLL Programme normalerweise immer einen 'Standard'-Verfahren-Anruf an (die Benennen-Tagung), der das Sparen des Programm-Staates standardmäßig und gewöhnlich Zuteilen des zusätzlichen Gedächtnisses auf dem Stapel einschließt, um alle Register und andere relevante Zustanddaten (der Prolog und Schlusswort-Code) zu sparen. Recursion in einem HLL Programm kann sich folglich bedeutend oben sowohl im Gedächtnis als auch in Ausführungszeit verzehren, den Stapel zur erforderlichen Tiefe führend.

Guy Steele hat in einer 1977-Zeitung darauf hingewiesen, dass eine gut bestimmte Programmiersprache-Durchführung sehr niedrige allgemeine Kosten für die Verfahrensabstraktion haben kann (aber jammert in den meisten Durchführungen, dass sie selten das in der Praxis erreichen - "ziemlich gedankenlos oder unbesonnen in dieser Beziehung" zu sein). Steele beschließt, dass "wir eine gesunde Rücksicht für Verfahren-Anrufe" haben sollten (weil sie stark sind), aber er hat auch gewarnt, "verwenden sie sparsam"

Sieh Abteilung Kosten für die Diskussion wie inlining Vermeiden

Unterprogramme können verwendet werden, um Leistung zu verbessern. Für die javanische Sprache kann der Gebrauch des "" Schlüsselwortes verwendet werden, um Methode inlining zu zwingen (auf Beseitigung des Methode-Anrufs, keiner dynamischen Absendung und der Möglichkeit zum unveränderlich-fachen der Wert - ohne Code hinauslaufend, der an der Durchlaufzeit durchgeführt ist)

Die Wahl der Sprache / hat Sprachen gemischt

Einige Computersprachen können Algorithmen effizienter durchführen als andere. Wie festgesetzt, bereits leisten interpretierte Sprachen häufig weniger effizient als kompilierte Sprachen. Außerdem, wo möglich, können 'hoher Gebrauch' und zeitabhängige Abteilungen des Codes auf einer Sprache wie Monteur geschrieben werden, der gewöhnlich schneller durchführen und besseren Gebrauch von Mitteln auf einer besonderen Plattform machen kann als der gleichwertige HLL-Code auf derselben Plattform. Diese Abteilung des Codes kann entweder statisch genannt oder dynamisch (Außenfunktion) angerufen oder innerhalb des höheren Niveau-Codes (z.B Assemblerbefehle eingebettet werden, die in einem Sprachprogramm 'von C' eingebettet sind).

Die Wirkung von höheren Niveaus der Abstraktion, wenn man einen HLL verwendet, ist als die Abstraktionsstrafe beschrieben worden

Programmierer, die mit dem Assembler (zusätzlich zu ihrem gewählten HLL) vertraut sind und auch mit dem Code vertraut sind, der durch den HLL unter bekannten Bedingungen erzeugt wird, können manchmal HLL Sprachprimitive dieser Sprache verwenden, um in den Assembler fast identischen Code zu erzeugen. Das wird höchstwahrscheinlich nur auf Sprachen möglich sein, die Zeigestöcke wie PL/1 oder C unterstützen. Das wird erleichtert, wenn der gewählte HLL Bearbeiter einen fakultativen Monteur zur Verfügung stellt, der als ein Teil seines Ausdrucks Schlagseite hat, so dass verschiedene Alternativen erforscht werden können, ohne auch Fachmann-Kenntnisse des Bearbeiters internals zu brauchen.

Softwaregültigkeitserklärung gegen die Hardware-Gültigkeitserklärung

Eine Optimierungstechnik, die oft auf 'Vermächtnis'-Plattformen ausgenutzt wurde, war die des Erlaubens der Hardware (oder Mikrocode), um Gültigkeitserklärung auf numerischen Datenfeldern wie diejenigen durchzuführen, die in codiert sind (oder zu umgewandelt sind) gepackte Dezimalzahl (oder hat BCD eingepackt).

Die Wahl war, Verarbeitungszeit entweder auszugeben, jedes Feld für einen gültigen numerischen Inhalt in der besonderen inneren Darstellung gewählt überprüfend oder einfach anzunehmen, dass die Daten richtig waren und lassen Sie die Hardware den Fehler nach der Ausführung entdecken. Die Wahl war hoch bedeutend, weil, um für die Gültigkeit auf vielfachen Feldern (für manchmal viele Millionen von Eingangsaufzeichnungen) zu überprüfen, sie wertvolle Computermittel besetzen konnte. Seitdem Eingangsdatenfelder jedenfalls oft von der Produktion der früheren Computerverarbeitung gebaut wurden, war die wirkliche Wahrscheinlichkeit eines Feldes, das ungültige Daten enthält, außerordentlich niedrig und gewöhnlich das Ergebnis von etwas 'Bestechung'.

Die Lösung war sich zu vereinigen ein 'Ereignis-Dressierer' für die Hardware hat Bedingung ('Datenausnahme)' entdeckt, der das gelegentliche irregeführte Datenfeld und entweder 'Bericht abfangen, korrigieren und weitergehen' oder mehr gewöhnlich den Lauf mit einer Kernmüllkippe abbrechen würde, um zu versuchen, den Grund für die schlechten Daten zu bestimmen.

Ähnliche Ereignis-Dressierer werden oft in gestützten Anwendungen des heutigen Webs verwertet, um andere außergewöhnliche Bedingungen zu behandeln, aber wiederholt Syntaxanalyse des Dateneingangs, um seine Gültigkeit vor der Ausführung zu sichern, ist dennoch viel mehr gewöhnlich - teilweise geworden, weil Verarbeiter schneller geworden sind (und das wahrgenommene Bedürfnis nach der Leistungsfähigkeit in diesem Gebiet weniger bedeutend), aber, vorherrschend - weil Datenstrukturen 'weniger formalisiert' (z.B.csv und.tsv Dateien) oder einzigartig identifizierbar (z.B gepackte Dezimalzahl) geworden sind. Die potenziellen Ersparnisse mit diesem Typ der Technik können deshalb in den allgemeinen Nichtgebrauch demzufolge gefallen sein und deshalb Datengültigkeitserklärungen wiederholt haben und wiederholt haben, dass Datenkonvertierungen ein akzeptierter oben geworden sind. Komischerweise ist eine Folge dieser Bewegung zu weniger formalisierten Datenstrukturen, dass eine Bestechung dessen, ein numerischer binärer Wert der ganzen Zahl sagt, wird überhaupt durch die Hardware nach der Ausführung nicht entdeckt (zum Beispiel: ist ein ASCII hexadecimal schätzen '20202020' ein gültiger unterzeichneter oder nicht unterzeichneter binärer Wert - oder einfach eine Reihe von Formblättern die hat es verdorben?)

Algorithmen für den Vektoren & die Superskalarverarbeiter

Algorithmen für Vektor-Verarbeiter sind gewöhnlich verschieden als diejenigen für Skalarverarbeiter, da sie vielfache Instruktionen bearbeiten können und/oder vielfache Datenelemente in der Parallele (für Beispiele dieser Unterschiede sieh 'Beschreibung' im Hauptartikel). Der Prozess, einen Algorithmus von einem Skalar bis einen Vektor-Prozess umzuwandeln, ist als vectorization bekannt, und Methoden, um diese Transformation automatisch durchzuführen, werden ständig so effizient wie möglich gesucht.

Es gibt innere Beschränkungen, um Instruktionsniveau-Parallelismus in Superskalarverarbeitern durchzuführen (die in der 'Beschränkungs'-Abteilung im Hauptartikel besprochen werden), aber, hauptsächlich, können die Gemeinkosten im Entscheiden sicher, wenn besondere Befehlsfolgen in der Parallele bearbeitet werden können, manchmal den Leistungsfähigkeitsgewinn auf diese Weise überschreiten. Die erreichbare Verminderung wird in erster Linie durch das (etwas offensichtliche) Gesetz geregelt, das als das Gesetz von Amdahl bekannt ist, das im Wesentlichen feststellt, dass die Verbesserung von der parallelen Verarbeitung durch seinen langsamsten folgenden Bestandteil bestimmt wird. Algorithmen, die für diese Klasse des Verarbeiters deshalb entworfen sind, verlangen mehr Sorge, wenn sie die potenziellen Gewinne nicht unwissentlich stören sollen.

Das Vermeiden von Kosten

  • Das Definieren von Variablen als ganze Zahlen für die mit einem Inhaltsverzeichnis versehene Reihe, anstatt Punkt schwimmen zu lassen, wird auf schnellere Ausführung hinauslaufen (sieh oben).
  • Das Definieren von Strukturen, deren Struktur-Länge ein Vielfache einer Macht 2 (2,4,8,16 usw.) ist, wird dem Bearbeiter erlauben, Reihe-Indizes durch die Verschiebung eines binären Index durch 1 zu berechnen, 2 oder mehr Bit nach links, anstatt eine multiplizieren Instruktion zu verwenden, werden auf schnellere Ausführung hinauslaufen. Das Hinzufügen einer sonst überflüssigen kurzen Füller-Variable, um' die Länge eines Struktur-Elements 'auszupolstern, um 8 Bytes zu sagen, als sonst es 6 oder 7 Bytes gewesen wären, kann gesamte Verarbeitungszeit durch einen lohnenden Betrag für die sehr große Reihe reduzieren. Sieh für erzeugte Codeunterschiede für C bezüglich des Beispiels.
  • In Bezug auf Bit definierte Lagerung, wenn Bytes genügen würden, kann mit äußerst langen Pfad-Längen unachtsam verbunden sein, die bitwise Operationen statt der effizienteren einzelnen Instruktion 'vielfaches Byte' Kopie-Instruktionen einschließen. (Das gilt für 'echte' absichtliche bitwise Operationen - verwendet zum Beispiel statt der Multiplikation oder Abteilung durch Mächte 2 oder für WAHRE/FALSCHE Fahnen nicht.)
  • Der unnötige Gebrauch der zugeteilten dynamischen Lagerung, wenn statische Lagerung genügen würde, kann die Verarbeitung oben wesentlich - sowohl Erhöhung von Speichervoraussetzungen als auch die verbundenen allocation/deallocation allgemeinen Pfad-Länge-Kosten für jeden Funktionsanruf vergrößern.
  • Der übermäßige Gebrauch von Funktionsaufrufen nach sehr einfachen Funktionen, aber nicht Reihenbehauptungen, kann auch wesentlich zu Instruktionspfad-Längen beitragen und allgemeine Kosten aufschobern/unaufschobern. Für besonders dringende Systeme, die nicht auch sind, codieren Größe empfindliche, automatische oder manuelle Reihenvergrößerung kann Pfad-Länge durch das Beseitigen aller Instruktionen reduzieren, die die Funktion nennen und davon zurückkehren. (Eine begrifflich ähnliche Methode, sich entfaltende Schleife, beseitigt die Instruktionen, die erforderlich sind, sich niederzulassen und eine Schleife durch stattdessen zu begrenzen; das Wiederholen der Instruktionen innerhalb der Schleife mehrmals. Das beseitigt natürlich den Zweig zurück Instruktion, aber kann auch die Größe der binären Datei oder, im Fall von JIT gebauter Code, dynamisches Gedächtnis vergrößern. Außerdem muss Sorge mit dieser Methode, dieser genommen werden Wiederrechenadressen für jede Behauptung innerhalb einer abgewickelten mit einem Inhaltsverzeichnis versehenen Schleife sind nicht teurer, als das Erhöhen von Zeigestöcken innerhalb der ehemaligen Schleife gewesen wäre. Wenn absolute Indizes im erzeugten verwendet (oder manuell geschaffen werden) abgewickelter Code, aber nicht Variablen, kann der geschaffene Code wirklich im Stande sein, erzeugte Zeigestock-Arithmetik-Instruktionen zusammen, mit Ausgleichen stattdessen zu vermeiden).

:Memory-Management

:Whenever-Gedächtnis wird automatisch zugeteilt (zum Beispiel in HLL Programmen, wenn man ein Verfahren nennt, oder wenn man einen Systemanruf ausgibt), es wird normalerweise veröffentlicht (oder 'hat '/'deallocated '/'gelöscht' befreit) automatisch, wenn es - so das Erlauben davon nicht mehr erforderlich ist, zu einem anderen Zweck sofort wiederverwendet zu werden. Ein Speichermanagement kann durch den Bearbeiter, als in diesem Beispiel leicht vollbracht werden. Jedoch, wenn Gedächtnis ausführlich zugeteilt wird (zum Beispiel in OOP, wenn "neu", wird für einen Gegenstand angegeben), das Veröffentlichen des Gedächtnisses wird häufig einem asynchronen 'Müllmann' verlassen, der das Gedächtnis bei erster Gelegenheit nicht notwendigerweise veröffentlicht (sowie einige zusätzliche Zentraleinheitsmittel verbrauchend, die entscheiden, ob es sein kann). Die aktuelle Tendenz scheint dennoch, zur Einnahme vollen Vorteils dieser völlig automatisierten Methode trotz des Umtauschs in der Leistungsfähigkeit zu sein - weil es gefordert wird, dass es Programmierung leichter macht. Einige funktionelle Sprachen sind als 'faule funktionelle Sprachen' wegen ihrer Tendenz bekannt, Berechnung in der Form von zugeteiltem thunks zu verzögern, zu bedeutendem Gebrauch der Müll-Sammlung führend, und können viel mehr Gedächtnis infolgedessen verbrauchen.

  • Reihe-Verarbeitung kann Programmierung vereinfachen, aber der Gebrauch von getrennten Behauptungen, um verschiedene Elemente derselben Reihe zu summieren, kann Code erzeugen, der nicht leicht optimiert wird und das vielfache Pässe der Reihe verlangt, die in einem einzelnen Pass sonst bearbeitet worden sein könnte. Es kann auch Daten kopieren, wenn das Reihe-Schneiden verwendet wird, zu vergrößertem Speichergebrauch führend und oben kopierend.
  • In OOP, wenn, wie man bekannt, ein Gegenstand unveränderlich ist, kann er einfach durch das Bilden einer Kopie einer Verweisung darauf kopiert werden, anstatt den kompletten Gegenstand zu kopieren. Weil eine Verweisung (normalerweise nur die Größe eines Zeigestocks) gewöhnlich viel kleiner ist als der Gegenstand selbst, läuft das auf Speicherersparnisse und eine Zunahme in der Ausführungsgeschwindigkeit hinaus.

Lesbarkeit, Handel offs und Tendenzen

Man muss in der Verfolgung des guten Codierstils sorgfältig sein, um Leistungsfähigkeit nicht überzubetonen. Oft ist ein sauberes, lesbares und 'verwendbares' Design viel wichtiger als ein schnelles, effizientes Design, das hart ist zu verstehen. Es gibt Ausnahmen zu dieser 'Regel' (wie eingebettete Systeme, wo Raum dichte und in einer Prozession gehende Macht minimal ist), aber diese sind seltener, als man erwarten könnte.

Jedoch, zunehmend, für viele 'dringende' Anwendungen wie Luftlinienbedenken-Systeme, haben Anwendungen des Punkts des Verkaufs, ATMs (Kassenpunkt-Maschinen), Luftfahrtgesellschaft-Leitungssysteme, Kollisionsvermeidungssysteme und zahlreiches modernes Web Anwendungen gestützt - in einer Echtzeitumgebung funktionierend, wo die Geschwindigkeit der Antwort grundsätzlich ist - gibt es wenig Alternative.

Bestimmung, wenn Optimierung lohnend

ist

Die wesentlichen Kriterien, um optimierten Code zu verwenden, sind natürlich nach dem erwarteten Gebrauch des Algorithmus abhängig. Wenn es ein neuer Algorithmus ist und dabei ist, im Gebrauch viele Jahre lang zu sein, und Geschwindigkeit wichtig ist, lohnt es sich, eine Zeit zu verbringen, den Code entwerfend, um so effizient zu sein, wie möglich vom Anfang. Wenn sich ein vorhandener Algorithmus erweist, zu langsam zu sein, oder Gedächtnis ein Problem wird, klar muss etwas getan werden, um es zu verbessern.

Für die durchschnittliche Anwendung, oder für einmalige Anwendungen, ineffiziente Codiertechniken und ermutigend vermeidend, kann der Bearbeiter, um wo möglich zu optimieren, genügend sein.

Ein einfacher Weg (mindestens für Mathematiker), um zu bestimmen, ob eine Optimierung lohnend ist, ist wie folgt: Lassen Sie die ursprünglichen Voraussetzungen der Zeit und Raums (allgemein in der Großen-O Notation) des Algorithmus sein und. Lassen Sie den neuen Code verlangen und Zeit und Raum beziehungsweise. Wenn

Implikationen für die algorithmische Leistungsfähigkeit

Ein neuer Bericht, veröffentlicht im Dezember 2007, aus dem Globalen Handlungsplan, hat eine mit Sitz im vereinigtem Königreich Umweltorganisation gefunden, dass Computerserver "mindestens eine so große Drohung gegen das Klima sind wie SUVs oder die globale Flugzeugindustrie", Aufmerksamkeit auf den Kohlenstoff-Fußabdruck von IHM Industrie im Vereinigten Königreich lenkend.

Gemäß einem Umweltforschungsbrief-Bericht veröffentlicht im September 2008, "Hat Gesamtmacht, die durch die Informationstechnologieausrüstung in Datenzentren verwendet ist, ungefähr 0.5 % des Weltelektrizitätsverbrauchs 2005 vertreten. Wenn das Abkühlen und Hilfsinfrastruktur eingeschlossen wird, ist diese Zahl ungefähr 1 %. Die Gesamtdatenzentrum-Macht-Nachfrage 2005 ist (in Höchstbegriffen) zu ungefähr siebzehn 1000 MW Kraftwerke für die Welt gleichwertig."

Einige Mediaberichte behaupten, dass das Durchführen von zwei Suchen von Google von einem Tischcomputer über denselben Betrag des Kohlendioxyds wie das Kochen eines Kessels für eine Tasse Tee gemäß der neuen Forschung erzeugen kann; jedoch wird die sachliche Genauigkeit dieses Vergleichs diskutiert, und der Autor der fraglichen Studie behauptet, dass der zwei statistische Suchteekessel eine Missdeutung seiner Arbeit ist.

Greentouch, ein kürzlich feststehendes Konsortium der Hauptinformation und Kommunikationstechnologie (ICT), den Industrie, akademische und nichtstaatliche Forschungsexperten, selbst die Mission des Reduzierens gesetzt hat, reduzieren Energieverbrauch pro Benutzer durch einen Faktor 1000 von aktuellen Niveaus. "Die tausendfache Verminderung ist zum im Stande Sein grob gleichwertig, die Kommunikationsnetze in der Welt einschließlich des Internets seit drei Jahren mit demselben Betrag der Energie anzutreiben, die es zurzeit bringt, um sie seit einem einzelnen Tag zu führen". Die erste Sitzung wird im Februar 2010 den fünfjährigen Plan der Organisation, das erste Jahr deliverables und die Mitglied-Rollen und die Verantwortungen gründen. Probleme des geistigen Eigentums werden gerichtet und in der anfänglichen Planung des Forums von Sitzungen definiert. Die Bedingungen für die Forschung und die Ergebnisse dieser Forschung werden hoher Vorrang für die Diskussion in der anfänglichen Phase der Forschungsforum-Entwicklung sein.

Computer, die zunehmend stärker im Laufe der letzten wenigen Jahrzehnte geworden sind, Betonung war auf einer Mentalität 'der rohen Gewalt'. Das kann im Licht dieser Berichte und mehr Anstrengung nachgeprüft werden müssen, die in die Zukunft auf abnehmenden Kohlenstoff-Fußabdrücken durch die Optimierung gelegt ist. Es ist eine rechtzeitige Gedächtnishilfe, dass algorithmische Leistungsfähigkeit gerade ein anderer Aspekt der allgemeineren thermodynamischen Leistungsfähigkeit ist. Die echten Wirtschaftsvorteile eines optimierten Algorithmus sind jedenfalls, dass mehr Verarbeitung für dieselben Kosten getan werden kann, oder dass nützliche Ergebnisse auf eine rechtzeitigere Weise und schließlich gezeigt, eher gehandelt werden können.

Kritik des aktuellen Staates der Programmierung

  • David May FRS ein britischer Computerwissenschaftler und zurzeit Professor der Informatik an der Universität Bristols und dem Gründer und CTO von XMOS Halbleiter, glaubt, dass eines der Probleme ist, dass es ein Vertrauen auf dem Gesetz von Moore gibt, um Wirkungslosigkeit zu lösen. Er hat eine 'Alternative' zum Gesetz von Moore vorgebracht (das Gesetz von May) hat wie folgt festgesetzt: Er setzt fort, festzusetzen
  • Softwareautor Adam N. Rosenburg in seinem blog "Der Misserfolg des Digitalcomputers", hat den aktuellen Staat der Programmierung als das Nähern des "Softwareereignis-Horizonts", beschrieben (auf den "Romanschuh-Ereignis-Horizont anspielend, der" von Douglas Adams im Handbuch seines Trampers zum Milchstraße-Buch beschrieben ist). Er schätzt ein, dass es einen 70-DB-Faktor-Verlust der Produktivität oder "99.99999 Prozent seiner Fähigkeit gegeben hat, die Waren" seit den 1980er Jahren zu liefern - "Als Arthur C. Clarke die Wirklichkeit der Computerwissenschaft 2001 zum Computer HAL in seinem Buch verglichen hat, hat er hingewiesen, wie wunderbar kleine und starke Computer nur waren, wie enttäuschende Computerprogrammierung geworden war".
  • Conrad Weisert führt Beispiele an, von denen einige in ACM SIGPLAN (Special Interest Group auf Programmiersprachen) Benachrichtigungen, Dezember 1995 veröffentlicht wurden in: "Grausame Programmierung Gedeiht"
  • Der Mitbegründer von Marc Andreessen von Netscape wird in "Außenseitern bei der Arbeit" zitiert (internationale Standardbuchnummer 0060779616) sagend, dass "Fünf große Programmierer 1,000 mittelmäßige Programmierer völlig überbieten können. "
http://www.linkedin.com/news?actionBar=&articleID=590198259&ids=0NdjgSd3wOejkIc3cPej0VczARb3ARczwVcj0VdiMVczcUcP8OejkIc3gTdj0TczAR&aag=true&freq=weekly&trk=eml-tod-b-ttle-96

Geführter Code

Für die Algorithmus-Durchführung in einem "geführten Code" Umgebung (wie die.Net Plattform) gibt es viele Probleme, die an die Leistung stoßen. Das sind Verbindungen zu drei von ihnen im Microsoft.Net Umgebung.

Konkurrenzen für die besten Algorithmen

Die folgenden Konkurrenzen laden Einträge zu den besten Algorithmen ein, die auf einigen willkürlichen Kriterien gestützt sind, die durch den judges: - entschieden sind

Siehe auch

  • Das Arithmetik-Codieren - eine Form der Wärmegewicht-Verschlüsselung der variablen Länge für die effiziente Datenkompression
  • Assoziative Reihe - eine Datenstruktur, die das effizientere Verwenden Bäume von Patricia oder Judy gemacht werden kann, ordnet
  • Binärer Suchalgorithmus - eine einfache und effiziente Technik, um zu suchen, hat Reihe sortiert
  • Abrisspunkt - eine Methode, um vergleichende Ausführungszeiten in definierten Fällen zu messen
  • Bester, schlechtester und durchschnittlicher Fall - Rücksichten, um Ausführungszeiten in drei Drehbüchern zu schätzen
  • Zweigtisch - eine Technik, um Instruktionspfad-Länge, Größe des Maschinencodes, (und häufig auch Gedächtnis) zu reduzieren
  • Vergleich, Paradigmen - Paradigma spezifische Leistungsrücksichten zu programmieren
  • Bearbeiter-Optimierung - Bearbeiter-abgeleitete Optimierung
  • Rechenbetonte Kompliziertheitstheorie
  • Computerleistung, - Computerhardware-Metrik
  • Datenkompression - abnehmende Übertragungsbandbreite und Plattenlagerung
  • Datenbankindex - eine Datenstruktur, die die Geschwindigkeit von Datenwiederauffindungsoperationen auf einem Datenbanktisch verbessert
  • Wärmegewicht-Verschlüsselung - Verschlüsselung von Daten effizient mit der Frequenz des Ereignisses von Schnuren als ein Kriterium für den Ersatz
  • Müll-Sammlung - das automatische Freigeben des Gedächtnisses nach dem Gebrauch
  • Grüne Computerwissenschaft - eine Bewegung, 'um grünere' Technologien durchzuführen, weniger Mittel verbrauchend
  • Algorithmus von Huffman - ein Algorithmus für effiziente Daten, die verschlüsseln
  • Gegend der Verweisung - für die Aufhebung, Verzögerungen zu verstecken, die durch den nichtlokalen Speicherzugang verursacht sind
  • Schleife-Optimierung
  • Speichermanagement
  • Optimierung (Informatik)
  • Leistungsanalyse - Methoden, wirkliche Leistung eines Algorithmus an der Durchlaufzeit zu messen
  • Echtzeitcomputerwissenschaft - weitere Beispiele von zeitkritischen Anwendungen
  • Laufzeitanalyse - Bewertung von erwarteten Durchlaufzeiten und einer Skalierbarkeit eines Algorithmus
  • Das Supereinfädeln
  • Gleichzeitige Nebenläufigkeit
  • Spekulative Ausführung oder Eifrige Ausführung
  • Gewindecode - ähnlich dem virtuellen Methode-Tisch oder Zweigtisch
  • Virtueller Methode-Tisch - Zweigtisch mit dynamisch zugeteilten Zeigestöcken, um zu entsenden
  • Die Besserung der Geführten Codeleistung - Microsoft MSDN Library

Links


Narrowboat / Giovanni Schiaparelli
Impressum & Datenschutz