„Laufzeit (Informatik)“ – Versionsunterschied
[ungesichtete Version] | [gesichtete Version] |
Keine Bearbeitungszusammenfassung |
K Bot: Räume alte Interwikilinks auf |
||
(107 dazwischenliegende Versionen von 83 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Der Begriff '''Laufzeit''' ({{enS|''runtime''}}) beschreibt in der [[Informatik]] einerseits die Zeitdauer, die ein [[Computerprogramm|Programm]], ausgeführt durch einen [[Computer|Rechner]], zur Bewältigung einer Aufgabe benötigt. |
|||
{{Überarbeiten}} |
|||
Unter der '''Laufzeit''' (Direktübersetzung aus dem englischen ''runtime'') versteht man in der [[Informatik]] die Zeitspanne, innerhalb deren ein [[Compiler|kompiliertes]] oder [[Interpreter|interpretiertes]] [[Computerprogramm|Programm]] im [[Arbeitsspeicher]] residiert und ausgeführt wird, d.h. [[Maschinenbefehl]]e an die [[CPU]] gesendet werden. Erst zur Laufzeit zeigen sich Mängel in der [[Optimierung]] und Fehler, die mit unvollständiger [[Initialisierung]] von [[Variablen]] zu tun haben. |
|||
Andererseits wird mit ''Laufzeit'' auch allgemein die Programmlebensphase der Ausführung bezeichnet, die der [[Kompilierung]] ([[Übersetzungszeit]]) folgt. |
|||
Eine andere Bedeutung des Begriffes "Laufzeit" ist die Zeit (Anzahl der Rechenschritte) die zur Ausführung eines [[Algorithmus]] notwendig ist - siehe dazu ''[[Zeitkomplexität]]''. |
|||
== Laufzeit als Dauer der Ausführung == |
|||
== Lebenzyklus eines Programms zur Laufzeit== |
|||
Die Länge der Zeitspanne, die zur Lösung einer Aufgabe benötigt wird, lässt sich häufig nur durch Ausprobieren bestimmen. Jeder Befehl eines Programms in einer [[Höhere Programmiersprache|höheren Programmiersprache]] wird vom [[Compiler]] in eine vorher nicht zwingend bekannte Anzahl von [[Maschinenbefehl]]en übersetzt. Die Ausführung eines Befehls kann, je nach Hardware, weitere Verzögerungen ergeben – wenn z. B. Daten zwischen [[Random Access Memory|Hauptspeicher]] und [[Cache]] ausgetauscht oder von der Festplatte in den Speicher eingelagert werden müssen ([[Paging]]). Weitere Abhängigkeiten ergeben sich von [[Betriebssystem]], [[Taktsignal|CPU-Taktrate]], Größe des Hauptspeichers, Übertragungsrate des internen [[Bus (Datenverarbeitung)|Bus]]-Systems usw. Auch möchte man etwa abschätzen, wie sich das untersuchte Programm unter Variation der Größen der Eingangsvariablen, der Instanzen, verhält. |
|||
=== Unix === |
|||
=== Windows === |
|||
=== DOS=== |
|||
===Mac=== |
|||
⚫ | |||
⚫ | |||
In der Informatik gibt man daher Laufzeiten von Algorithmen nicht in Zeiteinheiten an. Stattdessen sucht man eine obere Schranke an die Anzahl der einfachen Operationen, auch Elementarschritte, in der Größe der Instanz und verwendet die [[Landau-Notation]]. |
|||
Im Gegensatz zu den durch Compiler oder Interpreter auffindbaren und behebbaren Syntaxfehlern führen Laufzeitfehler in der Regel zum Absturz eines Programms. Die häufigsten Laufzeitfehler sind die, bei denen das Programm versucht nicht-initialisierte oder geschützte Speicherbereiche zu lesen oder zu beschreiben. |
|||
Einige Beispiele anhand eines Programms, das ''n'' Zahlen sortiert: |
|||
== Laufzeitbibliotheken == |
|||
* <math>\mathcal{O} (n)</math> beschreibt ein lineares Wachstum. Solch ein Programm macht pro eingegebener Zahl nur eine konstante Anzahl von Rechenschritten. Werden beispielsweise doppelt so viele Zahlen eingegeben, so verdoppelt sich auch die Ausführungsdauer. |
|||
Eine [[Laufzeitbibliothek]] (auch [[Bibliothek (Programmierung)|dynamische Bibliothek]]) enthält häufig benötigte Funktionen, die aus einem Programm heraus zur Laufzeit direkt aufgerufen werden können. Dies vereinfacht das Programmieren, da viele grundlegende Funktionen bereits in Laufzeitbibliotheken vorhanden sind und deshalb nicht ständig neu programmiert werden müssen. |
|||
* <math>\mathcal{O} (n^2)</math> bedeutet quadratisches Wachstum. Das Sortierprogramm macht pro eingegebener Zahl eine konstante Anzahl von Durchläufen durch die ganze Liste. Bei doppelter Größe der Eingabedaten kommt es hier also etwa zu einer Vervierfachung der Ausführungsdauer. |
|||
* <math>\mathcal{O} (2^{n})</math> würde schließlich exponentielles Wachstum bedeuten. Im Beispiel des Sortierprogramms würde sich mit jeder weiteren Zahl die Laufzeit (ungefähr) verdoppeln, was bereits bei verhältnismäßig kleinen Eingabegrößen zu extrem langen Laufzeiten führt. Solch einen Zeitverbrauch erreicht ein Sortierprogramm beispielsweise, indem es alle möglichen Reihenfolgen der Zahlen daraufhin testet, ob sie sortiert sind. |
|||
Verfahren mit exponentieller Laufzeit versucht man daher nach Möglichkeit zu vermeiden – ob das überhaupt geht, ist eine der Fragen, die man sich in der Theoretischen Informatik stellt (vgl. dazu [[Komplexitätstheorie]] und [[NP-vollständig]]). Angestrebt werden Verfahren mit polynomieller (<math>\mathcal{O}(n^k)</math> für eine geeignete natürliche Zahl <math>k</math>) oder noch besser logarithmischer Laufzeit <math>\mathcal{O} (\log n)</math>. Heute gebräuchliche [[Sortierverfahren]] erreichen meist eine [[worst case]] Laufzeit von <math>\mathcal{O} (n \log n)</math> oder <math>\mathcal{O}( n^2)</math>. Man beachte dabei, dass ein Programm im Grunde dreigeteilt ist – Eingabe, Verarbeitung, Ausgabe – und dass sich nur der mittlere Teil in dieser Hinsicht optimieren lässt (Ein- und Ausgabe haben in der Regel lineares Zeitverhalten – es muss ja jeder einzelne Wert eingelesen/ausgegeben werden). |
|||
⚫ | |||
⚫ | |||
=== Konkrete Laufzeitbestimmung (Profiling) === |
|||
Die konkrete Laufzeitbestimmung von Programmen und insbesondere Programmteilen wird in der Softwareentwicklung als ''Profiling'' bezeichnet. Eine Software, die Profiling unterstützt, indem sie das zu untersuchende Programm mit Code zur Laufzeiterfassung ergänzt ([[Instrumentierung (Softwareentwicklung)|instrumentiert]]) und die Resultate der Laufzeitbestimmung aufbereitet, wird als [[Profiler (Programmierung)|Profiler]] bezeichnet. Profiler sind häufig als Teil einer [[Integrierte Entwicklungsumgebung|integrierten Entwicklungsumgebung]] realisiert. |
|||
== Laufzeit als Ausführungsphase eines Programms, des Weiteren Vorgänge außerhalb des Laufzeitkontexts == |
|||
[[da:Kørsel (datalogi)]] |
|||
Laufzeit ''({{lang|en|runtime}})'' bezeichnet auch die Phase der ''Ausführung'' eines Programms in einem spezifischen Laufzeitkontext: variierende Hardwareeigenschaften, Eingabeparameter und [[Benutzer]]-Interaktion. Das Programm befindet sich zur Laufzeit typischerweise in einer Verwendung in einem Kontext, der in dieser exakten Konstellation durch den [[Softwareentwickler|Entwickler]] nicht (oder nur näherungsweise über [[Dynamische Code-Analyse]]) vorhersehbar war. |
|||
[[en:Execution time]] |
|||
[[it:Run-time]] |
|||
Da nun beim Ausführen in diesen variierenden Kontexten bestimmte Programmeigenheiten – insbesondere Fehler – erstmals auftreten können, erhält der Entwickler häufig nur auf diesem Wege die Hinweise für notwendige Änderungen am Programm. Im weiteren Sinn kann somit auch die reguläre Ausführung eines Programms als Teil des Entwicklungsprozesses angesehen werden. |
|||
Weitere Phasen sind z. B. die [[Übersetzungszeit]] (engl. {{lang|en|''compile time''}}) als Phase bis zum Zeitpunkt der [[Kompilierung|automatischen Übersetzung]] des [[Quelltext]]es und die {{lang|en|''link time''}} für den Zeitpunkt, zu dem das Programm aus seinen binären Programmkomponenten zu einer ausführbaren Einheit [[Linker (Computerprogramm)|zusammengeführt]] wird. Manchmal wird die Phase des eigentlichen Programmierens und Modellierens als {{lang|en|''precompile time''}} bezeichnet. |
|||
⚫ | |||
⚫ | |||
* [[Zeitkomplexität|Asymptotische Laufzeit (Zeitkomplexität)]] |
|||
* [[Maximale Laufzeit]] |
|||
* [[Amortisierte Laufzeitanalyse]] |
|||
* [[Laufzeitbibliothek]] |
|||
* [[Laufzeitumgebung]] |
|||
[[Kategorie:Programmierung]] |
|||
[[Kategorie:Zeitraum]] |
Aktuelle Version vom 17. Januar 2022, 00:05 Uhr
Der Begriff Laufzeit (englisch runtime) beschreibt in der Informatik einerseits die Zeitdauer, die ein Programm, ausgeführt durch einen Rechner, zur Bewältigung einer Aufgabe benötigt.
Andererseits wird mit Laufzeit auch allgemein die Programmlebensphase der Ausführung bezeichnet, die der Kompilierung (Übersetzungszeit) folgt.
Laufzeit als Dauer der Ausführung
[Bearbeiten | Quelltext bearbeiten]Die Länge der Zeitspanne, die zur Lösung einer Aufgabe benötigt wird, lässt sich häufig nur durch Ausprobieren bestimmen. Jeder Befehl eines Programms in einer höheren Programmiersprache wird vom Compiler in eine vorher nicht zwingend bekannte Anzahl von Maschinenbefehlen übersetzt. Die Ausführung eines Befehls kann, je nach Hardware, weitere Verzögerungen ergeben – wenn z. B. Daten zwischen Hauptspeicher und Cache ausgetauscht oder von der Festplatte in den Speicher eingelagert werden müssen (Paging). Weitere Abhängigkeiten ergeben sich von Betriebssystem, CPU-Taktrate, Größe des Hauptspeichers, Übertragungsrate des internen Bus-Systems usw. Auch möchte man etwa abschätzen, wie sich das untersuchte Programm unter Variation der Größen der Eingangsvariablen, der Instanzen, verhält.
Asymptotische Laufzeit von Algorithmen
[Bearbeiten | Quelltext bearbeiten]In der Informatik gibt man daher Laufzeiten von Algorithmen nicht in Zeiteinheiten an. Stattdessen sucht man eine obere Schranke an die Anzahl der einfachen Operationen, auch Elementarschritte, in der Größe der Instanz und verwendet die Landau-Notation.
Einige Beispiele anhand eines Programms, das n Zahlen sortiert:
- beschreibt ein lineares Wachstum. Solch ein Programm macht pro eingegebener Zahl nur eine konstante Anzahl von Rechenschritten. Werden beispielsweise doppelt so viele Zahlen eingegeben, so verdoppelt sich auch die Ausführungsdauer.
- bedeutet quadratisches Wachstum. Das Sortierprogramm macht pro eingegebener Zahl eine konstante Anzahl von Durchläufen durch die ganze Liste. Bei doppelter Größe der Eingabedaten kommt es hier also etwa zu einer Vervierfachung der Ausführungsdauer.
- würde schließlich exponentielles Wachstum bedeuten. Im Beispiel des Sortierprogramms würde sich mit jeder weiteren Zahl die Laufzeit (ungefähr) verdoppeln, was bereits bei verhältnismäßig kleinen Eingabegrößen zu extrem langen Laufzeiten führt. Solch einen Zeitverbrauch erreicht ein Sortierprogramm beispielsweise, indem es alle möglichen Reihenfolgen der Zahlen daraufhin testet, ob sie sortiert sind.
Verfahren mit exponentieller Laufzeit versucht man daher nach Möglichkeit zu vermeiden – ob das überhaupt geht, ist eine der Fragen, die man sich in der Theoretischen Informatik stellt (vgl. dazu Komplexitätstheorie und NP-vollständig). Angestrebt werden Verfahren mit polynomieller ( für eine geeignete natürliche Zahl ) oder noch besser logarithmischer Laufzeit . Heute gebräuchliche Sortierverfahren erreichen meist eine worst case Laufzeit von oder . Man beachte dabei, dass ein Programm im Grunde dreigeteilt ist – Eingabe, Verarbeitung, Ausgabe – und dass sich nur der mittlere Teil in dieser Hinsicht optimieren lässt (Ein- und Ausgabe haben in der Regel lineares Zeitverhalten – es muss ja jeder einzelne Wert eingelesen/ausgegeben werden).
Konkrete Laufzeitbestimmung (Profiling)
[Bearbeiten | Quelltext bearbeiten]Die konkrete Laufzeitbestimmung von Programmen und insbesondere Programmteilen wird in der Softwareentwicklung als Profiling bezeichnet. Eine Software, die Profiling unterstützt, indem sie das zu untersuchende Programm mit Code zur Laufzeiterfassung ergänzt (instrumentiert) und die Resultate der Laufzeitbestimmung aufbereitet, wird als Profiler bezeichnet. Profiler sind häufig als Teil einer integrierten Entwicklungsumgebung realisiert.
Laufzeit als Ausführungsphase eines Programms, des Weiteren Vorgänge außerhalb des Laufzeitkontexts
[Bearbeiten | Quelltext bearbeiten]Laufzeit (runtime) bezeichnet auch die Phase der Ausführung eines Programms in einem spezifischen Laufzeitkontext: variierende Hardwareeigenschaften, Eingabeparameter und Benutzer-Interaktion. Das Programm befindet sich zur Laufzeit typischerweise in einer Verwendung in einem Kontext, der in dieser exakten Konstellation durch den Entwickler nicht (oder nur näherungsweise über Dynamische Code-Analyse) vorhersehbar war.
Da nun beim Ausführen in diesen variierenden Kontexten bestimmte Programmeigenheiten – insbesondere Fehler – erstmals auftreten können, erhält der Entwickler häufig nur auf diesem Wege die Hinweise für notwendige Änderungen am Programm. Im weiteren Sinn kann somit auch die reguläre Ausführung eines Programms als Teil des Entwicklungsprozesses angesehen werden.
Weitere Phasen sind z. B. die Übersetzungszeit (engl. compile time) als Phase bis zum Zeitpunkt der automatischen Übersetzung des Quelltextes und die link time für den Zeitpunkt, zu dem das Programm aus seinen binären Programmkomponenten zu einer ausführbaren Einheit zusammengeführt wird. Manchmal wird die Phase des eigentlichen Programmierens und Modellierens als precompile time bezeichnet.