Geschwindigkeit static

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Eines vorweg: Ich weiß, meine Art der "Performancemessung" ist ungenau und wird einigen hier nciht gefallen. Aber davon abgesehen:


Ich habe folgende Testklasse geschrieben:
Code:
public class Test
{
	public static Test instance = new Test();
	
	public static void blubberS()
	{
		// any algorithm
		int i=0;
		++i;
		--i;
	}
	
	public void blubber()
	{
		// any algorithm
		int i=0;
		++i;
		--i;
	}
	
	public static void main(String[] args) throws Exception
	{
		long startTime=System.currentTimeMillis();
        for (long i=0; i < 1000000000l; i++)
        {
        	Test.blubberS();
        }

        long diffTime=System.currentTimeMillis() - startTime;
        System.err.println( "Elapsed: " + diffTime + "ms." );

        
        startTime=System.currentTimeMillis();
        for (long i=0; i < 1000000000l; i++)
        {
        	Test.instance.blubber();
        }
        diffTime=System.currentTimeMillis() - startTime;
        System.err.println( "Elapsed: " + diffTime + "ms." );
	}
}

Es zeigt sich, dass der nicht-statische Methoden-zugriff mithilfe einer statischen Klasseninstanz im Schnitt etwa 15% bis 20% schneller ist, als der direkte Aufruf der statischen Methode. Warum ist das so?
 

Wildcard

Top Contributor
Eines vorweg: Ich weiß, meine Art der "Performancemessung" ist ungenau und wird einigen hier nciht gefallen. Aber davon abgesehen:
Es zeigt sich, dass der nicht-statische Methoden-zugriff mithilfe einer statischen Klasseninstanz im Schnitt etwa 15% bis 20% schneller ist, als der direkte Aufruf der statischen Methode.
Es zeigt sich, das du die Argumente warum solche Messungen Unsinn sind, zwar gelesen, aber entweder nicht verstanden, oder bewusst ignoriert hast.
Code:
   public static void main(String[] args) throws Exception
   {
      long startTime=System.currentTimeMillis();
      for (long i=0; i < 1000000000l; i++)
      {
         Test.instance.blubber();
      }


        long diffTime=System.currentTimeMillis() - startTime;
        System.err.println( "Elapsed: " + diffTime + "ms." );

       
        startTime=System.currentTimeMillis();
        for (long i=0; i < 1000000000l; i++)
        {
           Test.blubberS();
        }
        diffTime=System.currentTimeMillis() - startTime;
        System.err.println( "Elapsed: " + diffTime + "ms." );
   }

Und schon habe ich das exakte Gegenteil 'bewiesen'
 
M

maki

Gast
Ja, du hast Recht, diese Art von tests sind vollkommen sinnfrei ;)

Vertausche die Schleifen, sehe und erstarre... sie laufen gleichlang.

Liegt vielleicht an der Hotspot VM.

Nachtrag: Schon wieder zu langsam...
 

Evolver

Bekanntes Mitglied
OK, nun habe ich mcih endlich mal damit beschäftigt und verstanden, warum ein solchen Micro-Benchmarking keine Aussagekräftigen Ergebnisse liefert. Aber wie macht man es denn richtig? Ich habe einige Tipps zur Umgehung der Hotspot-Optimierung gefunden, aber so richtig das Gelbe vom Ei scheint das trotzdem nicht zu sein.
 

Marco13

Top Contributor
Microbenchmarks sind immer schwierig. Es gibt Fälle, wo man eine grobe Richtung erkennen kann. So ganz grob kann man vielleicht sagen, dass man grundsätzlich nicht sowas machen sollte wie
Code:
void teste()
{
    start();
    for (int i=0; i<100000000; i++)
    {
        methodeA();
    }
    stopUndGibZeitAus();

    start();
    for (int i=0; i<100000000; i++)
    {
        methodeB();
    }
    stopUndGibZeitAus();
}
sondern dem JIT-Compiler auch die Möglichkeit geben, an beidem rumzubasteln, also z.B. sowas wie
Code:
void testeA(int n)
{
    start();
    for (int i=0; i<100000000; i++)
    {
        methodeA();
    }
    stopUndGibZeitAus();
}

// testeB(int n) analog...

void teste()
{
    for (int n=100; n<10000000; n*=10)
    {
        testeA(n);
        testeB(n);
    }
}

Aber das ist eher eine Daumen- als eine Faustregel :wink: In gewisser Hinsicht ist deine "Kern-Methode" noch problematischer:
Code:
public void blubber()
   {
      // any algorithm
      int i=0;
      ++i;
      --i;
   }
Ein "schlauer" Compiler könnte das komplett wegoptimieren! Man muss z.B. bei den meisten C/C++-Compilern damit rechnen, dass eine Schleife wie
Code:
for (int i=0; i<1000000; i++) { }
tatsächlich eine Ausführungszeit von 0.0 hat - der Compiler merkt, dass dort nichts gemacht wird!

Verläßlicher (nicht verläßlich, aber verläßlicher) ist, wenn man ihn "zwingt", etwas zu machen.
Code:
int n = 0;
for (int i=0; i<1000000; i++) 
{ 
    n++;
}
System.out.println(n);
(theoretisch könnte sowas zwar auch zu einem
System.out.println(1000000);
optimiert werden, aber solche Optimierungen stoßen dann schnell an ihre Grenzen)


Zusammenfassend: Das ist alles Bullshit :wink: Wirklich verläßlich kann man Benchmarks nur mit einem guten Profiler machen, z.B. Optimizeit von Borland, oder ... vielleicht auch irgendwelchen freien, für Eclipse, oder dem, dem der bei NetBeans 6.1 dabei ist (abgesehen vom ersten habe ich die noch nicht verwendet, aber es gibt auch einige freie Java-Profiler, die IMHO ziemlich schlecht sind...)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
T Geschwindigkeit beim Generieren erhöhen? Allgemeine Java-Themen 7
S Geschwindigkeit HashMap oder .getParent Allgemeine Java-Themen 5
byte JMockit - Geschwindigkeit Allgemeine Java-Themen 7
B Verzeichnis durchsuchen geschwindigkeit optimieren Allgemeine Java-Themen 6
R Parser: Datei auslesen, Datei erstellen - Geschwindigkeit Allgemeine Java-Themen 16
G java spiel (geschwindigkeit) Allgemeine Java-Themen 37
F Geschwindigkeit messen Allgemeine Java-Themen 7
O RXTX Geschwindigkeit? Codebeispiel dabei. Allgemeine Java-Themen 21
P Geschwindigkeit von Java GUIs Allgemeine Java-Themen 45
J Http/Https Geschwindigkeit Allgemeine Java-Themen 14
B java geschwindigkeit Allgemeine Java-Themen 16
O Geschwindigkeit Fortran und Java Allgemeine Java-Themen 11
J JCopy & Geschwindigkeit? Allgemeine Java-Themen 4
A Geschwindigkeit Java unter Linux Allgemeine Java-Themen 9
M Geschwindigkeit RXTX JAVA Allgemeine Java-Themen 3
N Performance-Test (Geschwindigkeit von Methoden vergleichen)? Allgemeine Java-Themen 4
P Geschwindigkeit und Genauigkeit bei Zeitmessung Allgemeine Java-Themen 13
T Geschwindigkeit bei Polygonen und BufferedImage Allgemeine Java-Themen 9
R Geschwindigkeit herausfinden Allgemeine Java-Themen 2
E Methoden abstract static Methode Allgemeine Java-Themen 8
N nicht static und auch nicht new Allgemeine Java-Themen 3
P static Blocks und variablen Allgemeine Java-Themen 41
Kirby.exe Cannot make a static reference to the non-static field rimWidth Allgemeine Java-Themen 12
Thallius Ist meine static Helper Class Thread save? Allgemeine Java-Themen 9
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
A Variablen non-static variable cannot be referenced from a static content Allgemeine Java-Themen 4
P Static Variable -> unterschiedliche Werte? Allgemeine Java-Themen 1
K Static Variablen verbieten Allgemeine Java-Themen 10
C Generic collections und static typing Allgemeine Java-Themen 4
M Warum nicht static ? Allgemeine Java-Themen 10
M Eine static-Methode verlassen Allgemeine Java-Themen 2
B Schlüsselworte [ERLEDIGT] static { } - Was ist das und wofür kann ich das brauchen? Allgemeine Java-Themen 1
J private static final String variable Allgemeine Java-Themen 8
L Non-static-Variables in Enumerationen Allgemeine Java-Themen 2
L OOP Klassen-Design (static oder nicht?) Allgemeine Java-Themen 3
T Enumeration/Static Final/Bitfield Allgemeine Java-Themen 6
T Static kann nicht verändert werden Allgemeine Java-Themen 3
W Threads Cannot make a static reference.. Allgemeine Java-Themen 13
H Programierstil: static - Zugriff vs. Staticzugriff Allgemeine Java-Themen 24
N Static oder andere Lösung Allgemeine Java-Themen 5
N Vererbung Static & private fields - Nicht ganz einfach? Allgemeine Java-Themen 4
M Wo hin mit static factory methods? Allgemeine Java-Themen 40
M Public Static importRunning -> Bad Design oder ok ? Allgemeine Java-Themen 5
S Cannot make a static reference to the non-static field MySecondClass.Points Allgemeine Java-Themen 3
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
S auf public void Methode zugreifen ohne static Allgemeine Java-Themen 11
K Static - Problem Allgemeine Java-Themen 10
M Variablen Variablenzugriff aus static void Allgemeine Java-Themen 21
D API - Beispiel + static member in inner (non static) class Allgemeine Java-Themen 2
S static methoden Allgemeine Java-Themen 9
S Performance Frage: Objekt oder static? Allgemeine Java-Themen 33
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
A Annotation einer Subklasse im static-Block auslesen. Allgemeine Java-Themen 6
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B static Variable / Unterklasse Allgemeine Java-Themen 2
I Was macht static { ... } ? Allgemeine Java-Themen 8
G static inner Klassen Allgemeine Java-Themen 7
G static und dynamic linking? Allgemeine Java-Themen 32
J in einer static Variable Wert ändern Allgemeine Java-Themen 6
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
G static- Methoden überschreiben Allgemeine Java-Themen 10
V Static oder wie? Allgemeine Java-Themen 61
I reflection get inner static classes Allgemeine Java-Themen 2
L static main - Spezifikation? Allgemeine Java-Themen 7
G URLClassLoader stößt static Block nicht an Allgemeine Java-Themen 8
D static Allgemeine Java-Themen 46
P static-Methode aus dem Konstruktor aufrufen Allgemeine Java-Themen 6
oliver1974 "(.) should be accessed in a static way" Falsche W Allgemeine Java-Themen 6
P static Klassenvariable Allgemeine Java-Themen 15
B JPasswordField klassenübergreifend auslesen->static Probl Allgemeine Java-Themen 4
F Methoden: static vs. instance Allgemeine Java-Themen 24
MQue static Methoden/Klassen Allgemeine Java-Themen 7
K Warum static-Methoden nutzen Allgemeine Java-Themen 26
G Java-Befehle Native und Static Allgemeine Java-Themen 2
conan2 static-Block in Klassen Allgemeine Java-Themen 6
M JNI, static.a mit load.Library laden? Allgemeine Java-Themen 2
K Static Members von Superklasse für JEDEN Erben Allgemeine Java-Themen 6
padde479 The static method sleep(long) from the type Thread should. Allgemeine Java-Themen 2
M static-Methode vorschreiben Allgemeine Java-Themen 5
S singleton vs. static Allgemeine Java-Themen 7
G Object mit static Feldern speichern Allgemeine Java-Themen 9
J Warum heißt es eig. "public static void main" ? Allgemeine Java-Themen 4
conan2 "Cannot make a static reference to the non-static field Allgemeine Java-Themen 8
P Singleton vs static Allgemeine Java-Themen 19
J parameterized und static fields Allgemeine Java-Themen 4
A Static reference to non-static field Allgemeine Java-Themen 10
S static umgehen Allgemeine Java-Themen 5
G static oder nicht Allgemeine Java-Themen 4
J Problem mit static/non-static Allgemeine Java-Themen 2
G getAppletContext() in static Methode Allgemeine Java-Themen 3
m@nu Programm-Models in Static-Objekten speichern Allgemeine Java-Themen 5
J Nicht-static variable in static variable kopieren - wie? Allgemeine Java-Themen 14
O does not declare a static final serialVersionUID field of . Allgemeine Java-Themen 6
G static vor einem array Allgemeine Java-Themen 2
K Überschreiben von 'static'-Methoden hat anderes Verhalten? Allgemeine Java-Themen 2
A JSP & static-Variablen Allgemeine Java-Themen 3
B Static Import: Syntaxfrage Allgemeine Java-Themen 2
S Static + Speicher + Bytecode etc. Brauche HILFE :/ Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben