# JSF Performance - zu viele Methodenaufrufe, woher kommen sie



## Nicnac (3. Aug 2006)

Hallo,

ich beschäftige mich schon eine Weile mit JSF und ich versuche zu verstehen woher die Performanceprobleme kommen die ich habe.
Dabei habe ich herausgefunden, daß einige Methoden viel öfter als benötigt aufgerufen werden. 

Ein Beispiel:
Ich habe eine Startseite des "Assistenten" die nur menüpunkte enthält, die aufgrund verschiedener Kriterien gerendert werden sollen oder nicht.

Es gibt zwei Menüpunkte die nur gerendert werden soll wenn ein "Testpool" nicht leer ist, der Code ist ungefähr so:


```
<h:panelGroup rendered="#{!bean.assistantTestPoolEmpty}">
      <h:commandLink .../>		 	 
<h:panelGroup/>
```

Die Methode isAssistantTestPoolEmpty() in der Bean wird aber !10! Mal aufgerufen. Ich benutze diese Methode nur als rendered-Kriterium in der jsp-Datei, sonst nirgendwo.

Weiß jemand, warum die Methode 5 mal so oft aufgerufen wird?
Was macht JSF da?

Vielen Dank für jede Hilfe, ich bin ziemlich am Verzweifeln, da das ja bei weitem nicht die einzigste Stelle ist!

Viele Grüße
N. Schweighardt


----------



## Gast (4. Aug 2006)

mir gehts auch genau so.....


----------



## KSG9|sebastian (4. Aug 2006)

verfolg das ganze doch mal im debugger


----------



## Nicnac (5. Aug 2006)

Hallo,

ich habe das Ganze schon im Debugger schon verfolgt, deswegen ist es mir ja so unerklärlich.
Die einzigen beiden Aufrufe im Code sind die in den rendered-Attributen, also 2. Setze ich jetzt einen Breakpoint
in die Methode wird sie 10 Mal aufgerufen.

Vielleicht wird die Seite mehrmals geladen? Das würde es erklären. Aber warum wird die Seite mehrmals geladen?

Grüße
Nicnac


----------



## SlaterB (5. Aug 2006)

hast du eine Art Log?
dann versuche mal

```
<% System.out.println(" vor  panelGroup"); %>
 <h:panelGroup rendered="#{!bean.assistantTestPoolEmpty}">
      <h:commandLink .../>          
<h:panelGroup/>  
<% System.out.println("nach panelGroup"); %>
```
oder ähnlich um die Anzahl der Seitenaufrufe zu bestimmen,

in der get-operation könntest du noch eine Ausgabe des StackTraces einbauen, zum Beispiel mit


```
System.out.println("Quelle des Aufrufs: "+getQuellen(10));

	public static String getQuelle(int tiefe) {
		String s = "";
		StackTraceElement[] sT = new Error().getStackTrace();
		
		if (sT.length <= tiefe) {
			return "-";
		} 
		
		StackTraceElement sE = sT[tiefe];

		s = sE.getClassName();
		s += "."+sE.getMethodName();
		s+=" "+sE.getLineNumber();
		return s;
	}

	public static String getQuellen(int tiefeMax) {
		String s = "";
		String line = null;
		for (int i=1; i<tiefeMax; i++) {
			line = getQuelle(i);
			if (line.length()<2) {
				break;
			} 
			s+=line+"\n";
		}
		return s;
	}
```
wenn du das mit den ersten Ausgaben zusammen machst:
finden alle 'Quelle des Aufrufs:'-Ausgaben zwischen 'vor  panelGroup' und 'nach panelGroup' statt?


----------



## Nicnac (5. Aug 2006)

Hi,

danke schonmal, ich probiere das am Montag auf der Arbeit aus!

Melde mich dann.

Schönes WE,
Nicnac


----------

