\documentclass[a4paper]{article} \usepackage[utf-8]{inputenc} \usepackage[german]{babel} \usepackage{url} \usepackage{alltt} \usepackage{multicol} \title{Mit der Zeit gehen — Keeping Track of Time} \ifx\shorttitle\undefined\else \shorttitle{Mit der Zeit gehen} \fi \author{Michael Kalus} \begin{document} \maketitle Laufzeitmessung mit Gforth; OSX, Linux, Windows. \begin{multicols}{2} Neulich begab es sich, dass bei den Projekt--Euler--Versuchen in Gforth ich auch ganz gern die Laufzeiten meiner Lösungsversuche gesehen hätte. Drei Zeiten stellt das OSX dem Gforth bereit: Das Wort \texttt{utime} liefert den Stand der Echtzeituhr (realtimeclock) als doppelt genauen Wert in Mikrosekunden auf dem Stack ab. Und mit \texttt{cputime} bekommt man zwei Zeiten vom System, \texttt{duser} und \texttt{dsystem}, beide ebenfalls doppelt genau. Bei diesen Euler--Kalkulationen kann nun mittels \texttt{utime} die Zeit wiedergegeben werden, die seit dem Start eines Algorithmus bis zu dessen Fertigstellung vergangen ist. Und wenn es länger dauert und du inzwischen YouTube, Mail oder andere Vorgänge hattest, geht das natürlich in die Ausführungszeit ein. Der folgend angegebene runtime--test liefert ein kontinuierliches Bild der Zeiten, um dies zu studieren. Es wird sichtbar, dass die usertime recht unabhängig von anderen Tasks ist, welche im Hintergrund oder sogar im Vordergrund ablaufen mögen, während die systime das nicht ist. Gforth erhält diese Zeiten vom Betriebssystem. \begin{verbatim} : cputime ... #ifdef HAVE_GETRUSAGE struct rusage usage; getrusage(RUSAGE_SELF, &usage); duser = timeval2us(&usage.ru_\texttt{utime}); dsystem = timeval2us(&usage.ru_stime); ... \end{verbatim} \begin{tt} The getrusage() function shall provide measures of the resources used by the current process ... RUSAGE\_SELF Returns information about the current process. \end{tt} So sollte es nun klarer sein, was \texttt{utime} und \texttt{cputime} auf den Stack geben und was man damit machen kann. Eine elegante Art, interaktiv damit umzugehen, hat Brian Fox beigesteuert. Sein \texttt{elapse} misst gleich die Ausführungszeit einer kompletten Kommandozeile. \section{Selbstkritik} Während mein Stück Programm kein so gutes Beispiel für Forthcode ist, weil es, ohne Teile faktorisiert zu haben, in einem durch geschrieben ist, hat Brian Fox sehr schön gezeigt, wie man es besser macht. Er hat die funktionellen Teile identifiziert und in eigene Worte gehüllt. Damit wird das letztendlich ausführende Wort in seiner Funktion gut transparent. Zu meiner Entlastung kann ich nur sagen, wie dieser Lindwurm entstanden ist: Um die \texttt{for next}--Schleife herum wurde zunächst in zwei lokalen Variablen die Anfangs-- und die Endzeit abgelegt. Dann experimentierte ich mit verschiedenen Ausgabeformaten und schließlich dachte ich, es könnte doch mal ganz instruktiv sein, alle Zeiten wiederholt darzustellen. Das ging mittels copy\&paste und etwas Anpassung bequem, und so ist hier nichts weiter faktorisiert. Forth eignet sich für beide Vorgehensweisen. Mal schnell was ausprobieren und studieren, ohne auf Eleganz zu achten, geht ebenso, wie mit der Zeit stabile gute Tools zu finden. Das ist ein Feature, das mich an Forth immer wieder so fasziniert. Übrigens, da \texttt{utime} die Zeit doppeltgenau in Mikrosekunden angibt, bekommen wir etwas wie \emph{die Zeit, die seit 1970} vergangen ist? Wer weiss es genauer? \begin{verbatim} 1213138874991075 / 1000000 / 60 / 60 / 24 / 365 = 38,4683.. years. \end{verbatim} \section{Quellen} Gforth Manual; gforth-0.6.2.pdf \\ Usenet Forum: comp.lang.forth \end{multicols} \section{Listing} \begin{quote} \listinginput[1]{1}{2008-03/keep-track-of-time.fs} \end{quote} \vfill \begin{center} \includegraphics[height=10cm]{2008-03/mit-der-zeit-gehen}\\ Theo Windges: \emph{Mit der Zeit gehen}\\ \url{http://www.theo-windges.de/zeit-katalog.htm}\\ (Mit freundlicher Genehmigung des Künstlers) \end{center} \vfill \end{document}