# Rechenzeit



## Lexi (21. Mai 2009)

Ich habe eben ein wenig mit Addition und Multiplikation in Verbindung mit System.nanoTime() rumgespielt und etwas festgestellt, was mich ein wenig erstaunt hat.
Es macht keinen Unterschied ob ich jetzt 1+1 rechne oder ob ich 123423456*78932462 rechne, die Zeiten liegen immer im Bereich von 2000 - 2500.
Wie kommt das ? Wie rechnet Java ?


```
public static void main(String[] args) {
		long time;
		long time2;
		double zahl;
		time =System.nanoTime();
		zahl = 349687596*1000000000;
		time2 = System.nanoTime();
		System.out.println(time2-time);
	}
```


----------



## Wildcard (21. Mai 2009)

Solche Operationen sind derart rasant das die Auflösung einer solchen Timing Funktion keinesfalls ausreicht. Mit anderen Worten: Der ausgegebene Zeitwert ist Müll.


----------



## Lexi (21. Mai 2009)

d.h. Wenn ich das auf eine andere Art und Weise messe, würde man durchaus einen unterschied zwischen 1+1 und 234928*239840235 feststellen können ?


----------



## icarus2 (21. Mai 2009)

Ich denke das Problem ist, dass die Rechenoperation derart schnell ist, dass die Zeitberechnugn nicht schnell genug ist da ein sinnvolles Ergebnis auszugeben.


==> Die Zeit einer so schnellen Rechenoperation zu messen macht keinen Sinn.


----------



## Wildcard (21. Mai 2009)

schon möglich. Microbenchmarks sind aber schwieriger als man meinen sollte und haben eigentlich auch keine Aussagekraft. Was genau möchtest du eigentlich in Erfahrung bringen?


----------



## Lexi (21. Mai 2009)

Achso.
Gibt es eine Möglichkeit die Zeit anders zu messen ?

Edit: Habe Wildcards post nicht gesehen.
Das mit der Zeit ist eigentlich eher Nebensache - auf jeden Fall das konkrete Messen und daraus resultierende konkrete Zeiten.
Mich interessierts es eher allgemein, wie Java solche Rechenoperationen durchführt.
Also, was passiert wenn sich in meinem Code 13*23 befindet. Was genau macht Java um nachher auf 299 zu kommen ?


----------



## Schandro (21. Mai 2009)

rechne einfach 1 Millionen mal anstatt 1 mal, dann siehst du den Unterschied zwischen + und *


----------



## Marco13 (21. Mai 2009)

Sowas ist fast nicht vernünftig zu messen. Selbst wenn man es 1 Million mal ausführt, weiß man nicht, was der JIT draus macht. Er könnte es einfach wegoptimieren. Insbesondere, wenn alles Konstanten sind, wird das ganze sowieso direkt zur compilezeit ausgerechnet, d.h. prinzipiell dauert ein
double x = Math.sqrt(Math.sin(Math.cos(Math.tan(Math.sqrt(42)))));
genauso lange wie ein
double x = 1;
Und die größe einer Zahl bei der gleichen Operation spielt (theoretisch) sowieso keine Rolle.


----------

