16: Schleifen 9 – Laufzeitmessungen

 

Mit System.nanoTime() lässt sich die aktuelle Zeit in Nanosekunden ermitteln. Benutzen Sie dies dazu, um den Zeitbedarf zur Berechnung der Lösung aus Aufgabe 14 und Aufgabe 15 zu berechnen.
Schreiben Sie das Programm so, dass eine Tabelle ausgegeben wird mit den Laufzeiten in Abhängigkeit der vorgegebenen Genauigkeit.

Lösung

Messung der Laufzeit von Aufgabe 14

public class Aufgabe16
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		double dErgebnis, dAbweichung, dEPS;
		int iDezimalstellen, iSchritt;

		for (iDezimalstellen = 1; iDezimalstellen <= 8; ++ iDezimalstellen)
		{
			dEPS = 1. / Math.pow(10, iDezimalstellen);
			iSchritt = 0;
			dErgebnis = 1;
			long lStartMS = System.nanoTime();

			do
			{ // Schleife nährt Pi an bis zur gewählten Abweichung
				++ iSchritt;
				double dPrev = 4. * dErgebnis;
				dErgebnis += Math.pow(-1, iSchritt)*(1. / (2 * iSchritt+1));
				dAbweichung = dPrev-dErgebnis * 4;
				if (dAbweichung < 0)
					dAbweichung *= -1.;
			} // end do
			while (dAbweichung > dEPS);

			System.out.print("Auf "+iDezimalstellen+" Stelle(n) "
					+ " berechneter Wert -> Pi="+4. * dErgebnis+" nach "
					+ iSchritt+" Schritten");
			long lEndMS = System.nanoTime();
			long lMS = lEndMS-lStartMS;
			System.out.println("  -> Rechenzeit: "+lMS);
		} // end for
	} // end main
} // end class

Messung der Laufzeit von Aufgabe 15

import java.util.Scanner; 	// Scanner für die Eingabe von Werten

public class Aufgabe16b
{
	public static void main(String[] args)
	{
		// Variablen Deklaration
		Scanner scnEingabe = new Scanner(System.in);
		double dErgebnis, dAbweichung, dEPS, dZahl;
		int iDezimalstellen, iSchritt;

		// Variablen Initialisierung
		System.out.print("Berechnung des Cosinus von: ");
		dZahl = scnEingabe.nextDouble();

		for (iDezimalstellen = 1; iDezimalstellen <= 12; ++ iDezimalstellen)
		{ // Berechnung für jede Anzahl an Dezimalstellen
			dEPS = 1. / Math.pow(10, iDezimalstellen);

			double dZaehler = 1.;
			long iNenner = 2;
			iSchritt = 0;
			dErgebnis = 1;

			long lStartMS = System.nanoTime();

			do
			{ // Schleife nährt den Cosinus an
				++ iSchritt;

				dZaehler *= (dZahl * dZahl);
				if (iSchritt > 1)
					iNenner *= (iSchritt * 2- 1) * (iSchritt * 2);

				double dPrev = dErgebnis;
				dErgebnis += Math.pow(-1, iSchritt) * (dZaehler / iNenner);

				dAbweichung = dPrev-dErgebnis;
				if (dAbweichung < 0)
					dAbweichung *= -1.;
			} // end do
			while (dAbweichung > dEPS);

			System.out.print("Auf "+iDezimalstellen+" Stelle(n), "
					+ " Cos("+dZahl+") = "+dErgebnis+" nach "
					+ iSchritt+" Schritten");
			long lEndMS = System.nanoTime();
			long lMS = lEndMS-lStartMS;
			System.out.println("  -> Rechenzeit: "+lMS);
		} // end for
	} // end main
} // end class