Algorithmische Effizienz

Im Informatik, Algorithmische Effizienz ist eine Eigenschaft von einem Algorithmus das bezieht sich auf die Menge an Rechenressourcen verwendet vom Algorithmus. Ein Algorithmus muss sein analysiert Um den Ressourcenverbrauch und die Effizienz eines Algorithmus zu bestimmen, kann anhand der Verwendung verschiedener Ressourcen gemessen werden. Algorithmische Effizienz kann als analog zum Ingenieurwesen angesehen werden Produktivität für einen sich wiederholenden oder kontinuierlichen Prozess.

Für maximale Effizienz ist es wünschenswert, die Ressourcenverbrauch zu minimieren. Verschiedene Ressourcen wie z. Zeit und Platz Komplexität kann nicht direkt verglichen werden, so dass von zwei Algorithmen als effizienter angesehen wird, hängt häufig davon ab, welches Maß für die Effizienz als am wichtigsten angesehen wird.

Zum Beispiel, Blasenart und Timsort sind beide Algorithmen zur Sortierung einer Liste von Gegenständen vom kleinsten bis größten. Bubble -Sortierung sortiert die Liste rechtzeitig proportional zur Anzahl der quadratischen Elemente (, sehen Big O Notation), erfordert aber nur eine kleine Menge zusätzlicher Erinnerung was in Bezug auf die Länge der Liste konstant ist (). Timsort sortiert die Liste rechtzeitig linearithmisch (proportional zu einer Menge mal sein Logarithmus) in der Liste der Liste (Länge der Liste), hat aber eine Platzanforderung linear in der Länge der Liste (). Wenn große Listen für eine bestimmte Anwendung mit hoher Geschwindigkeit sortiert werden müssen, ist Timsort eine bessere Wahl. Wenn die Minimierung des Gedächtnisausdrucks der Sortierung jedoch wichtiger ist, ist die Bubble -Sortierung eine bessere Wahl.

Hintergrund

Die Bedeutung der Effizienz in Bezug auf die Zeit wurde durch hervorgehoben Ada Lovelace im Jahr 1843 wie angewendet auf Charles BabbageMechanisch analytischer Motor:

"In fast jeder Berechnung ist eine große Vielfalt von Arrangements für die Nachfolge der Prozesse möglich, und verschiedene Überlegungen müssen die Auswahl unter ihnen für die Zwecke eines berechnenden Engine beeinflussen. Ein wesentliches Objekt besteht darin mindestens die Zeit, die zum Abschluss der Berechnung erforderlich ist. "[1]

Frühzeitig elektronische Computer hatte beide begrenzt Geschwindigkeit und begrenzt Arbeitsspeicher. Daher a Raum-Zeit-Kompromiss aufgetreten. EIN Aufgabe könnte einen schnellen Algorithmus verwenden, der viel Speicher hat, oder es könnte einen langsamen Algorithmus verwenden, der wenig Speicher hat. Der technische Kompromiss sollte dann den schnellsten Algorithmus verwenden, der in den verfügbaren Speicher passen könnte.

Moderne Computer sind erheblich schneller als die frühen Computer und verfügen über eine viel größere Menge an Speicher (Gigabyte statt Kilobyten). Nichtsdestotrotz, Donald Knuth betonte, dass Effizienz immer noch eine wichtige Überlegung ist:

"In etablierten Ingenieurdisziplinen gilt eine Verbesserung von 12%, die leicht erhalten wird, niemals als marginal angesehen, und ich glaube, dass der gleiche Standpunkt in der Software -Engineering herrschen sollte."[2]

Überblick

Ein Algorithmus wird als effizient angesehen, wenn sein Ressourcenverbrauch, auch als Rechenkosten bezeichnet, auf oder unter einem akzeptablen Niveau liegt. Unglücklicherweise bedeutet "akzeptabel": Es wird in angemessener Zeit oder Platz auf einem verfügbaren Computer ausgeführt, normalerweise als Funktion der Größe des Eingangs. Seit den Computern der 1950er Jahre verzeichnete Computer sowohl die verfügbare Rechenleistung als auch die verfügbare Menge an Speicher, sodass die aktuellen akzeptablen Ebenen auch vor 10 Jahren inakzeptabel gewesen wären. In der Tat dank der ungefähre Verdoppelung der Computerkraft alle 2 Jahre, Aufgaben, die für die moderne Akzeptanz akzeptabel sind Smartphones und eingebettete Systeme Möglicherweise war für die Industrie unannehmbar ineffizient gewesen Server vor 10 Jahren.

Computerhersteller bringen häufig neue Modelle heraus, oft mit höher Leistung. Die Softwarekosten können ziemlich hoch sein. In einigen Fällen kann der einfachste und billigste Weg, eine höhere Leistung zu erzielen kompatibel mit einem vorhandenen Computer.

Es gibt viele Möglichkeiten, wie die von einem Algorithmus verwendeten Ressourcen gemessen werden können: Die beiden häufigsten Maßnahmen sind Geschwindigkeit und Speicherverwendung; Andere Maßnahmen können die Übertragungsgeschwindigkeit, die temporäre Festplattennutzung, die Verwendung von Langzeitdisksen, Stromverbrauch, umfassen Eigentumsgesamtkosten, Reaktionszeit zu externen Reizen usw. Viele dieser Maßnahmen hängen von der Größe der Eingabe zum Algorithmus ab, d. H. Die zu verarbeitende Datenmenge. Sie können auch von der Art und Weise abhängen, in der die Daten angeordnet sind. Zum Beispiel einige Sortieren von Algorithmen Führen Sie die bereits sortierten Daten oder die in umgekehrten Reihenfolge sortiert.

In der Praxis gibt es andere Faktoren, die die Effizienz eines Algorithmus beeinflussen können, z. B. Anforderungen an Genauigkeit und/oder Zuverlässigkeit. Wie unten beschrieben, kann die Art und Weise, wie ein Algorithmus implementiert wird Optimierung Ausgaben.

Theoretische Analyse

Im theoretischen Analyse von AlgorithmenDie normale Praxis besteht darin, ihre Komplexität im asymptotischen Sinne abzuschätzen. Die am häufigsten verwendete Notation zur Beschreibung des Ressourcenverbrauchs oder der "Komplexität" ist Donald Knuth's Big O NotationDarstellung der Komplexität eines Algorithmus als Funktion der Größe des Eingangs . Big o Notation ist eine asymptotisch Maß für die Funktionskomplexität, wo Ungefähr bedeutet, dass die Zeitanforderung für einen Algorithmus proportional ist , Weglassen Begriffe niedrigerer Ordnung das trägt weniger als bei zum Wachstum der Funktion als wächst willkürlich groß. Diese Schätzung kann irreführend sein, wenn ist klein, aber im Allgemeinen ausreichend genau, wenn ist groß, da die Notation asymptotisch ist. Zum Beispiel kann die Blasensorten schneller sein als Zusammenführen, sortieren wenn nur wenige Gegenstände sortiert werden sollen; Jede Implementierung wird jedoch wahrscheinlich die Leistungsanforderungen für eine kleine Liste erfüllen. In der Regel interessieren sich Programmierer an Algorithmen, die Skala Effizient zu großen Eingangsgrößen, und die Zusammenführungssortierung wird gegenüber der Blasensorte für Längenlisten bevorzugt, die in den meisten datenintensiven Programmen auftreten.

Einige Beispiele für große O -Notation, die auf die asymptotische Zeitkomplexität von Algorithmen angewendet werden, umfassen:

Notation Name Beispiele
Konstante Finden des Medianes aus einer sortierten Liste von Messungen; Verwenden einer konstanten Größe Nachschlagwerk; Mit einem geeigneten Hash-Funktion für den Blick auf einen Artikel.
logarithmisch Finden eines Elements in einem sortierten Array mit a binäre Suche oder eine ausgewogene Suche Baum sowie alle Operationen in a Binomialhaufen.
linear Finden eines Elements in einer ungeortierten Liste oder einem missgebildeten Baum (schlimmster Fall) oder in einem ungeortierten Array; Zwei hinzufügen n-bit Ganzzahlen von Ripple Carry.
linearithmisch, loglinear oder quasilear Ausführen a Schnelle Fourier-Transformation; Haufen, schnelle Sorte (Bester und durchschnittlicher Fall), oder Zusammenführen, sortieren
quadratisch Multiplizieren zwei n-Digit -Zahlen von Ein einfacher Algorithmus; Blasenart (Schlimmste Fall oder naive Implementierung), Shell -Sortierung, schnelle Sorte (schlimmsten Fall), Auswahlsorten oder Sortieren durch Einfügen
exponentiell Finden Sie das Optimale (nichtungefähr) Lösung für die Problem mit reisenden Verkäufern Verwendung Dynamische Programmierung; Bestimmen Sie, ob zwei logische Aussagen gleichwertig sind Verwendung Brute-Force-Suche

Benchmarking: Messung der Leistung

Für neue Softwareversionen oder um Vergleiche mit wettbewerbsfähigen Systemen zur Verfügung zu stellen, Benchmarks werden manchmal verwendet, was beim Messen eines Algorithmen relativer Leistung hilft. Wenn eine neue Sortieren Sie den Algorithmus wird zum Beispiel mit seinen Vorgängern verglichen werden, um sicherzustellen, dass es zumindest mit bekannten Daten effizient ist, unter Berücksichtigung von Funktionsverbesserungen. Benchmarks können von Kunden verwendet werden, wenn verschiedene Produkte von alternativen Lieferanten verglichen werden, um zu schätzen, welches Produkt ihre spezifischen Anforderungen an Funktionalität und Leistung am besten entspricht. Zum Beispiel in der Mainframe Welt bestimmte proprietär Sortieren Produkte von unabhängigen Softwareunternehmen wie z. Synksort konkurrieren mit Produkten von großen Lieferanten wie z. IBM für Geschwindigkeit.

Einige Benchmarks bieten Möglichkeiten, eine Analyse zu erzeugen, um die relative Geschwindigkeit verschiedener kompilierter und interpretierter Sprachen zu vergleichen[3][4] und Das Computer mit Computersprachen -Benchmarks Spiel Vergleicht die Leistung von Implementierungen typischer Programmierprobleme in mehreren Programmiersprachen.

Sogar erstellen "mach es selbst"Benchmarks können die relative Leistung verschiedener Programmiersprachen unter Verwendung einer Vielzahl von benutzerdefinierten Kriterien demonstrieren. Dies ist recht einfach, da Christopher W. Cowell-Shah anhand von gutem Beispiel vorliegt.[5]

Implementierungsbedenken

Implementierungsprobleme können sich auch auf die Effizienz auswirken, z. B. die Wahl der Programmiersprache oder die Art und Weise, wie der Algorithmus tatsächlich codiert wird,[6] oder die Wahl von a Compiler für eine bestimmte Sprache oder die Kompilierungsoptionen gebraucht oder sogar die Betriebssystem verwendet werden. In vielen Fällen eine von einem implementierte Sprache Dolmetscher Kann viel langsamer sein als eine von einem Compiler implementierte Sprache.[3] Siehe die Artikel über Just-in-Time-Zusammenstellung und interpretierte Sprachen.

Es gibt andere Faktoren, die Zeit- oder Raumprobleme beeinflussen können, die jedoch außerhalb der Kontrolle eines Programmierers liegen können. diese beinhalten Datenausrichtung, Datengranularität, Cache -Lokalität, Cache -Kohärenz, Müllsammlung, Parallelität auf Befehlsebene, Multi-Threading (entweder auf Hardware oder Software), Gleichzeitiges Multitasking, und Subroutine Anrufe.[7]

Einige Prozessoren haben Fähigkeiten für Vektorverarbeitung, die a erlauben einzelne Anweisungen zum Betrieb an mehreren Operanden; Es kann für einen Programmierer oder Compiler einfach sein, diese Funktionen zu nutzen. Algorithmen, die für die sequentielle Verarbeitung ausgelegt sind Parallelverarbeitungoder sie könnten leicht neu konfiguriert werden. Wie parallel und verteiltes Computer In den späten 2010er Jahren werden mehr Investitionen effizient gemacht hohes Level Apis für parallele und verteilte Computersysteme wie z. CUDA, Tensorflow, Hadoop, OpenMP und MPI.

Ein weiteres Problem, das bei der Programmierung auftreten kann, ist, dass Prozessoren mit demselben kompatibel sind Befehlssatz (wie zum Beispiel x86-64 oder ARM) können eine Anweisung auf unterschiedliche Weise implementieren, so dass Anweisungen, die in einigen Modellen relativ schnell sind, für andere Modelle relativ langsam sein können. Dies stellt häufig Herausforderungen vor Compiler optimieren, was viel Wissen über die spezifischen Kenntnisse haben muss Zentralprozessor und andere Hardware, die auf dem Kompilierungsziel verfügbar sind, um ein Programm für die Leistung am besten zu optimieren. Im Extremfall kann ein Compiler dazu gezwungen werden emulieren, nacheifern Anweisungen, die nicht auf einer Compilation -Zielplattform unterstützt werden, um sie dazu zu zwingen Code generieren oder Verknüpfung ein externes Bibliotheksanruf Um ein Ergebnis zu erzielen, das auf dieser Plattform ansonsten unzureichend ist, auch wenn es auf anderen Plattformen nativ unterstützt und effizienter in Hardware ist. Dies ist oft der Fall in eingebettete Systeme in Gedenken an schwimmende Punktarithmetik, wo klein und geringer Strom Mikrocontroller Oft mangelt es Hardware-Unterstützung für Floating-Punkt-Arithmetik und erfordern somit rechnerisch teure Softwareroutinen, um Gleitkomma-Berechnungen zu erstellen.

Messungen des Ressourcenverbrauchs

Maßnahmen werden normalerweise als Funktion der Größe des Eingangs ausgedrückt .

Die beiden häufigsten Maßnahmen sind:

  • Zeit: Wie lange dauert der Algorithmus, um fertig zu werden?
  • Platz: Wie viel Arbeitsspeicher (normalerweise RAM) wird vom Algorithmus benötigt? Dies enthält zwei Aspekte: die vom Code benötigte Speichermenge (Nutzung des Hilfsraums) und die Menge an Speicher, die für die Daten benötigt wird, für die der Code arbeitet (intrinsische Raumnutzung).

Für Computer, deren Strom von einer Batterie geliefert wird (z. Laptops und Smartphones) oder für sehr lange/große Berechnungen (z. Supercomputer), andere Interessensmaßnahmen sind:

  • Direkter Stromverbrauch: Strom benötigt direkt, um den Computer zu betreiben.
  • Indirekter Stromverbrauch: Kraft zum Abkühlen, Beleuchtung usw. benötigt.

Ab 2018Der Stromverbrauch wächst als wichtige Metrik für Rechenaufgaben aller Art und in allen Skalen von eingebettet Internet der Dinge Geräte zu System-on-Chip Geräte zu Serverfarmen. Dieser Trend wird oft als als bezeichnet umweltfreundliche Computernutzung.

In einigen Fällen können auch weniger häufige Messungen der Recheneffizienz relevant sein:

  • Übertragungsgröße: Bandbreite könnte ein begrenzender Faktor sein. Datenkompression Kann verwendet werden, um die zu übertragende Datenmenge zu reduzieren. Das Anzeigen eines Bildes oder Bildes (z. B. Google -Logo) kann zu Zehntausenden von Bytes (in diesem Fall 48K) im Vergleich zu sechs Bytes für den Text "Google" übertragen werden. Dies ist wichtig für E/A -gebundenes Computing Aufgaben.
  • Externer Raum: Platz für eine Festplatte oder ein anderes externes Speichergerät; Dies könnte für die vorübergehende Lagerung sein, während der Algorithmus durchgeführt wird, oder es könnte eine langfristige Lagerung sein, die zur zukünftigen Referenz weitergeführt werden muss.
  • Reaktionszeit (Latenz): Dies ist besonders relevant in a Echtzeitanwendung Wenn das Computersystem muss reagieren schnell auf ein externes Ereignis.
  • Eigentumsgesamtkosten: insbesondere wenn ein Computer einem bestimmten Algorithmus gewidmet ist.

Zeit

Theorie

Analysieren der Algorithmus, typischerweise verwendet Zeitkomplexität Analyse, um eine Schätzung der Laufzeit als Funktion der Größe der Eingabedaten zu erhalten. Das Ergebnis wird normalerweise unter Verwendung Big O Notation. Dies ist nützlich, um Algorithmen zu vergleichen, insbesondere wenn eine große Datenmenge verarbeitet werden soll. Es sind detailliertere Schätzungen erforderlich, um die Algorithmusleistung zu vergleichen, wenn die Datenmenge gering ist, obwohl dies wahrscheinlich weniger wichtig ist. Algorithmen, die eine parallele Verarbeitung umfassen vielleicht schwieriger zu analysieren.

Trainieren

Verwenden ein Benchmark zum Zeitpunkt der Verwendung eines Algorithmus. Viele Programmiersprachen haben eine verfügbare Funktion, die bietet CPU -Zeitnutzung. Für langjährige Algorithmen könnte auch die verstrichene Zeit von Interesse sein. Die Ergebnisse sollten im Allgemeinen über mehrere Tests gemittelt werden.

Runbasierte Profilerstellung kann sehr empfindlich für die Hardwarekonfiguration und die Möglichkeit anderer Programme oder Aufgaben sein, die gleichzeitig in einem ausgeführt werden Multi-Processing und Mehrprogrammierung Umgebung.

Diese Art von Test hängt auch stark von der Auswahl einer bestimmten Programmiersprache, eines Compiler- und Compiler -Optionen ab. Daher müssen alle verglichen werden Algorithmen müssen unter denselben Bedingungen implementiert werden.

Platz

Dieser Abschnitt befasst sich mit der Verwendung von Speicherressourcen (Register, Zwischenspeicher, RAM, virtueller Speicher, Sekundärspeicher) während der Algorithmus ausgeführt wird. Wie bei der obigen Zeitanalyse, analysieren der Algorithmus, typischerweise verwendet Raumkomplexität Analyse, um eine Schätzung des Laufzeitspeichers zu erhalten, das als Funktion als Größe der Eingabedaten benötigt wird. Das Ergebnis wird normalerweise unter Verwendung Big O Notation.

Es sind bis zu vier Aspekte der Speicherverwendung zu berücksichtigen:

  • Die Menge an Speicher, die erforderlich ist, um den Code für den Algorithmus zu halten.
  • Die Menge an Speicher für die benötigt Eingabedaten.
  • Die Menge an Speicher, die für jeden benötigt wird Ausgabedaten.
  • Die Menge des Speichers als Arbeitsbereich während der Berechnung.

Frühe elektronische Computer und frühe Heimcomputer hatten relativ geringe Mengen an Arbeitsspeicher. Zum Beispiel die 1949 Automatischer Taschenrechner für elektronische Verzögerungsspeicher (EDSAC) hatte ein maximales Arbeitsgedächtnis von 1024 17-Bit-Wörtern, während der Sinclair von 1980 ZX80 kam zunächst mit 1024 8-Bit-Bytes des Arbeitsgedächtnisses. In den späten 2010er Jahren ist es typisch für persönliche Computer zwischen 4 und 32 haben Gb von RAM, eine Erhöhung von über 300 Millionen Mal so viel Gedächtnis.

Zwischen- und Gedächtnishierarchie

Aktuelle Computer können relativ große Mengen an Speicher haben (möglicherweise Gigabyte). Daher ist es viel geringer, einen Algorithmus in eine enge Menge an Speicher zu drücken, als es früher war. Das Vorhandensein von vier verschiedenen Gedächtniskategorien kann jedoch von Bedeutung sein:

  • Prozessorregister, die schnellsten Computerspeichertechnologien mit dem geringsten Speicherplatz. Die meisten direkten Berechnungen auf modernen Computern erfolgen bei Quell- und Zieloperanden in Registern, bevor sie bei Bedarf auf den Cache, den Hauptspeicher und den virtuellen Speicher aktualisiert werden. Auf einen ProzessorkernEs gibt typischerweise in der Reihenfolge von Hunderten von Bytes oder weniger der Verfügbarkeit der Register, obwohl a Datei registrieren kann mehr physikalische Register enthalten als Architektur Register, die in der Anweisungs -Set -Architektur definiert sind.
  • Cache-Speicher ist der zweitschnellste und zweitkleinste Speicher in der Speicherhierarchie. Caches sind in CPUs, GPUs, Festplatten und externen Peripheriegeräten vorhanden und werden typischerweise in implementiert statischer Widder. Speicherdaches sind mehrstufig; Niedrigere Werte sind größer, langsamer und typischerweise geteilt zwischen Prozessorkerne in Multi-Core-Prozessoren. Um Operanden im Cache -Speicher zu verarbeiten, a Verarbeitungseinheit Muss die Daten aus dem Cache abrufen, den Vorgang in Registern ausführen und die Daten zurück in den Cache schreiben. Dies funktioniert mit vergleichbarer Geschwindigkeit (etwa 2-10-mal langsamer) mit der CPU oder der GPUs Arithmetik-Logikeinheit oder schwimmende Punkteinheit wenn in der L1 -Cache.[8] Es ist ungefähr 10 -mal langsamer, wenn es einen L1 gibt Cache Miss und es muss abgerufen und an die geschrieben werden L2 Cacheund weitere 10 -mal langsamer, wenn es einen L2 -Cache -Fehlschlag gibt und er muss von einem abgerufen werden L3 Cache, Falls vorhanden.
  • Hauptgedächtnis des Hauptgedächtnisses wird am häufigsten in umgesetzt in Dynamischer RAM (Dram). Der Hauptgedächtnis ist viel größer (typischerweise Gigabyte im Vergleich zu ~ 8 Megabyte) als ein L3-CPU-Cache, mit Lese- und Schreiblatenzen in der Regel 10-100-mal langsamer.[8] Ab 2018, RAM wird zunehmend implementiert On-Chip von Prozessoren als CPU- oder GPU -Speicher.
  • Virtueller Speicher wird am häufigsten in Bezug auf implementiert Zweitlager so wie ein Festplatteund ist eine Erweiterung der Speicherhierarchie Das hat viel größerer Speicherplatz, aber viel größerer Latenz, typischerweise etwa 1000 -mal langsamer als a Cache Miss für einen Wert im RAM.[8] Obwohl sie ursprünglich motiviert ist, den Eindruck höherer Gedächtni zu erwecken, als wirklich verfügbar zu sein, ist das virtuelle Gedächtnis für die zeitgenössische Verwendung für seine wichtiger Zeitraum-Kompromiss und die Verwendung der Verwendung von ermöglichen virtuelle Maschinen.[8] Cache -Fehler aus dem Hauptspeicher werden genannt Seitenfehlerund eine enorme Leistungsstrafen für Programme.

Ein Algorithmus, dessen Speicherbedarf in den Cache -Speicher passt, ist viel schneller als ein Algorithmus, der in den Hauptspeicher passt, was wiederum sehr viel schneller sein wird als ein Algorithmus, der auf virtuelles Speicher zurückgreifen muss. Aus diesem Grund, Cache -Ersatzrichtlinien sind für Hochleistungs-Computing äußerst wichtig, wie es sind Cache-bewusstes Programmieren und Datenausrichtung. Um das Problem weiter zu erschweren, haben einige Systeme bis zu drei Cache -Speicherebenen mit unterschiedlichen effektiven Geschwindigkeiten. Verschiedene Systeme haben unterschiedliche Mengen dieser verschiedenen Speichertypen, sodass der Effekt des Algorithmusspeicherbedarfs von einem System zu einem anderen stark variieren kann.

Wenn ein Algorithmus und seine Daten nicht in den Hauptspeicher passen, konnte der Algorithmus nicht verwendet werden, wenn der Algorithmus nicht verwendet werden konnte. Heutzutage scheint die Verwendung des virtuellen Speichers viel Speicher zu liefern, aber auf Kosten der Leistung. Wenn ein Algorithmus und seine Daten in den Cache -Speicher passen, kann eine hohe Geschwindigkeit erhalten werden. In diesem Fall hilft das Minimieren von Platz auch dazu, die Zeit zu minimieren. Dies nennt man die Prinzip der Lokalitätund kann unterteilt werden in Referenzort, räumliche Lokalität und Temporale Lokalität. Ein Algorithmus, der nicht vollständig in den Cache -Speicher passt, aber die Referenzlokalität aufweist, kann einigermaßen gut abschneiden.

Kritik am aktuellen Programm der Programmierung

Hälften der Software -Effizienz alle 18 Monate, das das Gesetz von Moore entschädigt

Mai geht weiter:

In allgegenwärtigen Systemen kann die Halbierung der ausgeführten Anweisungen die Akkulaufzeit verdoppeln und Big Data -Sets bieten große Möglichkeiten für bessere Software und Algorithmen: Reduzierung der Anzahl der Vorgänge von n×N bis n×Log (n) hat einen dramatischen Effekt, wenn n groß ist ... für n = 30 Milliarden ist diese Änderung so gut wie 50 Jahre Technologieverbesserungen.

  • Softwareautor Adam N. Rosenburg in seinem Blog "Der Fehler des digitalen Computers", hat den aktuellen Programm der Programmierung als" Software -Ereignis -Horizont "bezeichnet (anspielt auf die Fiktiven"Schuhereignis Horizont" beschrieben von Douglas Adams in seinem Per Anhalter durch die Galaxis Buchen[10]). Er schätzt, dass es seit den 1980er Jahren einen Produktivitätsverlust von 70 dB -Faktoren oder "99,99999 Prozent des Liefers, die Waren liefern" vorhanden hat - " Arthur C. Clarke Vergleiche die Realität des Computers im Jahr 2001 mit dem Computer Hal 9000 in seinem Buch 2001: Ein Weltraum -OdysseyEr wies darauf hin, wie wunderbar kleine und leistungsstarke Computer waren, aber wie enttäuschendes Computerprogrammierung geworden war. "

Wettbewerbe für die besten Algorithmen

Die folgenden Wettbewerbe laden Einträge für die besten Algorithmen ein, basierend auf einigen willkürlichen Kriterien, die von den Richtern entschieden wurden:

Siehe auch

Verweise

  1. ^ Grün, Christopher, Klassiker in der Geschichte der Psychologie, abgerufen 19. Mai 2013
  2. ^ Knuth, Donald (1974), "Strukturierte Programmierung mit Aussagen" (PDF), Computerumfragen, 6 (4): 261–301, Citeseerx 10.1.1.103.6084, doi:10.1145/356635.356640, S2CID 207630080, archiviert von das Original (PDF) am 24. August 2009, abgerufen 19. Mai 2013
  3. ^ a b "Floating Point Benchmark: Vergleich von Sprachen (Fourmilog: Niemand wagt es Grund)". Fourmilab.ch. 4. August 2005. Abgerufen 14. Dezember 2011.
  4. ^ "Whetstone Benchmark -Geschichte". Roylongbottom.org.uk. Abgerufen 14. Dezember 2011.
  5. ^ OSNews Staff. "Neun Sprachleistungserziehung: Benchmarking Math & Datei I/O". www.osnews.com. Abgerufen 18. September 2018.
  6. ^ Kriegel, Hans-Peter; Schubert, Erich; Zimek, Arthur (2016). "Die (schwarze) Kunst der Laufzeitbewertung: Vergleichen wir Algorithmen oder Implementierungen?". Wissens- und Informationssysteme. 52 (2): 341–378. doi:10.1007/s10115-016-1004-2. ISSN 0219-1377. S2CID 40772241.
  7. ^ Guy Lewis Steele, Jr. "Debunking des Mythos" teurer Verfahren "oder als schädlich als schädlich oder, Lambda: The Ultimate Goto". MIT AI Lab. AI Lab Memo AIM-443. Oktober 1977.[1]
  8. ^ a b c d Hennessy, John L; Patterson, David A; Asanović, Krste; Bakos, Jason D; Colwell, Robert P; Bhattacharjee, Abhishek; Conte, Thomas M; Duato, José; Franklin, Diana; Goldberg, David; Jouppi, Norman P.; Li, Sheng; Muralimanohar, Naveen; Peterson, Gregory D; Pinkston, Timothy Mark; Ranganathan, Prakash; Wood, David Allen; Jung, Clifford; Zaky, Amr (2011). Computerarchitektur: Ein quantitativer Ansatz (Sechstes Ausgabe). ISBN 978-0128119051. OCLC 983459758.
  9. ^ "Archivierte Kopie" (PDF). Archiviert von das Original (PDF) am 3. März 2016. Abgerufen 23. Februar 2009.{{}}: CS1 Wartung: Archiviertes Kopie als Titel (Link)
  10. ^ "Der Fehler des digitalen Computers".
  11. ^ Fagone, Jason (29. November 2010). "Teen Mathematletes kämpfen bei Algorithmus Olympics". Verdrahtet.