Zeitmessung

PapstbenR

Mitglied
Hallo,

wollte einmal fragen, ob ich die Zeit, die eine Methode braucht, so messen kann:

beispielhafte Klasse, die gemessen werden soll:
Java:
public class PunkteMalen {

	public static void main(String[] args) throws IOException {
		// Eine Beispiel Methode, in der die Zeit gemessen werden soll
		double timeBefore =	System.nanoTime();
		
		for(int i = 0; i <= 100000; i++){
			System.out.println("...");
		}
		
		Logging.logging(timeBefore, System.nanoTime(), 1, "PunkteMalen");
	}

}

Nun mein Logger:
Java:
public class Logging {

	static FileWriter writer;
	File file;
	static String filename = "Performance_Log.txt";

	/**
	 * Konstruktor
	 */
	Logging() {
		
	}

	/**
	 * Write the calculated values in the log.
	 * 
	 * @param timeBefore
	 * @param timeAfter
	 * @param level
	 * @param name
	 * @throws IOException
	 */
	public static void logging(double timeBefore, double timeAfter, int level,
			String name) throws IOException {

		checkIfEmpty();

		try {
			writer = new FileWriter(filename, true);

			writer.write(getTimestamp() + "," + name + "," + level + ","
					+ formateRunningtime(timeBefore, timeAfter) + "," + getUser());
			writer.write(System.getProperty("line.separator"));

			writer.flush();
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * Get the timestamp of today.
	 * 
	 * @return timestamp
	 */
	static String getTimestamp() {
		Calendar cal = Calendar.getInstance();

		// Datum
		String date = cal.get(Calendar.DAY_OF_MONTH) + "."
				+ (cal.get(Calendar.MONTH) + 1) + "." + cal.get(Calendar.YEAR);

		// Uhrzeit
		String time = cal.get(Calendar.HOUR_OF_DAY) + ":"
				+ cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND)
				+ ":" + cal.get(Calendar.MILLISECOND);

		return date + "," + time;
	}

	/**
	 * Converting from nanoseconds in seconds.
	 * 
	 * @param timeBefore
	 * @param timeAfter
	 * @return runtimeWithFour
	 */
	static String formateRunningtime(double timeBefore, double timeAfter) {
		// Nanosekunden in Sekunden konvertieren
		double runtime = ((timeAfter - timeBefore) / 1000000000);

		// nur 4 Nachkommastellen
		DecimalFormat f = new DecimalFormat("#0.0000");
		String runtimeWithFour = f.format(runtime);

		// Komma durch einen Punkt ersetzen, da sonst nicht nach Excel
		// importiert werden kann
		runtimeWithFour = runtimeWithFour.replace(",", ".");

		return runtimeWithFour;
	}

	/**
	 * If textfile is empty, then this this methode creates a title column.
	 * 
	 * @throws IOException
	 */
	static void checkIfEmpty() throws IOException {
		FileInputStream fis = new FileInputStream(new File(filename));

		int b = fis.read();

		if (b == -1) {
			try {
				writer = new FileWriter(filename, true);

				writer.write("Datum,Uhrzeit,Name,Level,Zeit,Von");
				writer.write(System.getProperty("line.separator"));

				writer.flush();
				writer.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Getting the username
	 * 
	 * @return user
	 */
	static String getUser() {
		return System.getProperty("user.name");
	}

}

Was haltet ihr davon?
 
Zuletzt bearbeitet:

Natac

Bekanntes Mitglied
Gibt es einen bestimmten Grund, warum du nicht mit System.currentTimeInMillis() arbeitest!?

Ansonsten sei angemerkt, dass es bereits zahlreiche Logging-Frameworks für Java gibt. Da einen ganz eigenen Logger zu schreiben halte ich für wenig sinnvoll.
 

PapstbenR

Mitglied
Gibt es einen bestimmten Grund, warum du nicht mit System.currentTimeInMillis() arbeitest!?

Ansonsten sei angemerkt, dass es bereits zahlreiche Logging-Frameworks für Java gibt. Da einen ganz eigenen Logger zu schreiben halte ich für wenig sinnvoll.

Hatte System.currentTimeInMillis() nicht verwendet, weil ich auf zahlreichen Seiten gelesen hatte, dass man doch lieber nano verwenden sollte.

Kannst du ein einfaches und kostenloses Framework empfehlen?
 

turtle

Top Contributor
Im Prinzip geht das so, aber...
Java:
for(int i = 0; i <= 100000; i++){
            System.out.println("...");
        }
So etwas bezeichnet man als Micro-Benchmarking und diese sind unter Java extrem schwieriger als in anderen Programmiersprachen.

Denn die JVM-Hotspot kann, wenn gewisse Dinge passieren, den Code optimieren.

Beispielhaft KANN die JVM die Schleife entrollen und durch das Endergebnis ersetzen, so dass überhaupt keine Schleife durchlaufen wird. Oder ganze Schleifen können weg-optimiert werden, so dass die Ausführungszeit dann 0 ist.

Daher lautet mein Rat immer derartige Micro-Benchmarks extrem mit Vorsicht zu bewerten. Hier mal einige Referenzen zum Thema (https://wikis.oracle.com/display/HotSpotInternals/Home, Java theory and practice: Dynamic compilation and performance measurement
 

ARadauer

Top Contributor
Logging würde ich nicht selber machen und wie turtle schon gesagt hat... oft bei kleinen algos nicht aussagekräftig... wenn du hingegen mal schnell ein db query messen willst, ob das 50 oder 500 ms braucht.. dafür reichts..
 

Ähnliche Java Themen


Oben