(* sml version 110.0.7 *) (* ********************************************************************* Zahlenwert zum Kalibrieren: ********************************************************************* *) val warteschleifen_durchgaenge = 125; (* ********************************************************************* Interessante Aufrufe: Wenn warteschleifen_durchgaenge den Wert 125 hat: messreihe("produkt ", produkt ); messreihe("produkt'", produkt'); Wenn warteschleifen_durchgaenge den Wert 5000000 hat: messreihe("produkt'", produkt'); Diese Zahlen wurden so gewaehlt, dass auf einem CIP-Rechner die interessanten Effekte erkennbar sind. Auf einem langsameren Rechner sind kleinere Zahlen sinnvoll, auf einem schnelleren Rechner groessere Zahlen. ********************************************************************* *) (* ********************************************************************* Vorgegebene Funktionsdefinitionen: ********************************************************************* *) fun warteschleife(n) = if n=0 then n else warteschleife(n-1) exception arithmetik_nicht_verfuegbar; fun n + m : int = raise arithmetik_nicht_verfuegbar; fun n + m : real = raise arithmetik_nicht_verfuegbar; fun n - m : int = raise arithmetik_nicht_verfuegbar; fun n - m : real = raise arithmetik_nicht_verfuegbar; fun n * m : int = raise arithmetik_nicht_verfuegbar; fun n * m : real = raise arithmetik_nicht_verfuegbar; fun n div m : int = raise arithmetik_nicht_verfuegbar; fun n / m : real = raise arithmetik_nicht_verfuegbar; fun vorgaenger(n) = Word.toInt( Word.-(Word.fromInt(n), 0wx1) ); fun summe(n,m) = let (* kuenstliche Verlangsamung der Addition, *) (* um ueberhaupt messbare Zeiten zu erhalten *) val w = warteschleife(warteschleifen_durchgaenge) in Word.toInt( Word.+(Word.fromInt(n), Word.fromInt(m)) ) end; fun ist_gerade(n) = ( Word.andb(Word.fromInt(n),0wx1) = 0wx0 ); fun doppelt(n) = Word.toInt( Word.<<( Word.fromInt(n), 0wx1) ); fun haelfte(n) = Word.toInt( Word.>>( Word.fromInt(n), 0wx1) ); fun zeitmessung(fname, f, a, b) = let val timer = Timer.startCPUTimer(); val wert = f(a,b); val {usr=usrTime, gc=gcTime, ...} = Timer.checkCPUTimer(timer); val laufzeit = Time.fmt 4 (Time.-(usrTime, gcTime)); in laufzeit ^ " sec: " ^ fname ^ "(" ^ Int.toString(a) ^ "," ^ Int.toString(b) ^ ")" ^ " = " ^ Int.toString(wert) end; fun zeitmessungen(fname, f) = "\n" ^ "Bei " ^ Int.toString(warteschleifen_durchgaenge) ^ " Warteschleifendurchgaengen je Aufruf von summe:" ^ "\n" ^ zeitmessung(fname, f, 2,1000) ^ "\n" ^ zeitmessung(fname, f, 2,10000) ^ "\n" ^ zeitmessung(fname, f, 2,100000) ^ "\n" ^ zeitmessung(fname, f, 2,1000000) ^ "\n" ^ zeitmessung(fname, f, 2,10000000) ^ "\n" ; fun messreihe(fname, f) = print(zeitmessungen(fname, f)); (* ********************************************************************* BITTE OBERHALB VON DIESEM KOMMENTAR NUR DEN KALIBRIER-WERT VERAENDERN! Eigene Funktionsdefinitionen: ********************************************************************* *)