• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Code Performance Frage

StechusKaktus

New member
Hi jswelt Community,

ich habe mal eine Frage zu der Performance von JavaScript und z.B. das durchlaufen von Schleifen.
Ich möchte gerne die bestmögliche Leistung erhalten (und natürlich sauber Arbeiten) und wollte mal fragen,
wie man am besten in JavaScript seinen Code schreibt?!

Zum Beispiel habe ich hier einen Code Abschnitt, der bei jeder Bewegung immer bestimmte Position updaten soll.
Nun habe ich so mehrere "gleichzeitige" eingaben von Positionen. Wie könnte ich diesen Ablauf in der Schleife verbessern?

Code:
this.updatePositions = function( updatePos ){
        var positionX	= updatePos.getScreenX( screenW ) + 1920;
	var positionY	= updatePos.getScreenY( screenH ) + 720;
	var newPosition	= new Point( positionX, positionY );
			
	var elementArray	= mtt_obj.Elements;
	var tArrayLength	= elementArray.length;
		
	for( var i = 0; i < tArrayLength; i++ ){
			
		if( updateCursor.cursorId == elementArray[i][0] ){
				
			var tElement	= elementArray[i];
			var tElement1	= elementArray[i][1];

			tElement1.position = newPosition;	

			if( tElement1.data.type == 'obj' || tElement1.data.type == 'desc' ){
                                // ...do something.	
				for ( var i = 0; i < el_items.length; i++ ){	
					
					if( tElement1.data.SID == el_items[i][0] ){
						
						for( var j = 1; j < el_items[i].length; j++ ){
							// ...do something.
						} 
						break;
					}
							
				}
				
				if( max_menus > 1 ){ /* ... do something... */ }
				return;		
			}	
					
			if( tElement1.data.type == 'rel' ){
				// ...do something.
			        return;
			}

			var range = newPosition.getDistance( tElement[2] );

			if( range > 40 ){	
				// ...do something.
			}
					
			var diff = mtt_obj.onFrameCount - tElement[3];
					
			if( diff > 50 ){
			        if( range <= 5 ){
				        
				        if( typeof ElementArray[i][4] == 'undefined' ){
					        // ...do something.
					        return;
				        }
			        } else if( typeof ElementArray[i][4]  != 'undefined' ){
				       // ...do something.
				        return;
			         }
					
		        }
			return; 
		}		
	}	
}

Was könnte man evtl. verbessern, damit der hier vorliegende Beispiel Code verbessert wird?
Hättet ihr da Tipps für mich?

Des Weiteren frage ich mich, wie es sich hier mit den Schleifen verhält?
Ist das effizient gestaltet?
Code:
var array = [ "el1", "el2",..., "n" ];
var arrayLength = array.length;

for( var i = 0; < arrayLength; i++ ){
     var arrayPos = array[i];
     arrayPos.irgendwas
     tue_noch_was( arrayPos );
     // ... und so weiter. 
     
     if( array Pos < 100 ){
          // mache wieder was usw.
          for(...)...  
     }

}

Dieser Code soll einfacher verdeutlichen, wie der "Große" Codeabschnitt hier drüber abläuft.

Kann man hier noch Leistung herauskitzeln damit wirklich alles smooth abläuft?

Vielen Dank für eure Hilfe und Tips.
 
Du hast da lauter Abfragen nach IDs. Kannst du dort, wo du die gewünschten IDs speicherst nicht gleich die Elemente speichern? Dann bräuchstest du die Schleifen, die dann nach dem Element mit der ID suchen, überhaupt gar nicht.
 
ich probiere hier mit dem TUIO Protokoll eine Touch Anwendung in HTML / Javascript zu erstellen.

@kkapsner
Das mit den ids in den Element speichern weiss ich leider momentan nicht, wie ich das anders lösen könnte.

Wenn ein Finger die Touch Fläche berühert, sendet tuio folgendes:
Code:
currentTime Object { seconds=4, microSeconds=684000, initialize=function(), mehr...}
cursorId 0
motionAccel 0
motionSpeed 0
path [Object { xPos=0.15312500298023224, yPos=0.21250000596046448, currentTime={...}, mehr...}]
sessionId 0
startTime Object { seconds=4, microSeconds=684000, initialize=function(), mehr...}
state 0
xPos 0.15312500298023224
xSpeed 0
yPos 0.21250000596046448
ySpeed 0

Sobald der Finger bewegt wird, sendet tuio wieder neue informationen:
Code:
currentTime Object { seconds=5, microSeconds=247000, initialize=function(), mehr...}
cursorId 0
motionAccel 0
motionSpeed 0
path [Object { xPos=0.15000000596046448, yPos=0.21666666865348816, currentTime={...}, mehr...}, Object { xPos=0.15000000596046448, yPos=0.21875, currentTime={...}, mehr...}, Object { xPos=0.15000000596046448, yPos=0.22083333134651184, currentTime={...}, mehr...}, 5 mehr...]

sessionId 0
startTime Object { seconds=4, microSeconds=872000, initialize=function(), mehr...}
state 3
xPos 0.14687499403953552
xSpeed 0
yPos 0.23749999701976776
ySpeed 0

Wenn man das irgendwie verbinden könnte, wäre das natürlich viel besser, aber da ist mir keine Lösung dazu eingefallen.

Dazu hätte ich gleich noch eine Frage:

Kann es sein, das manchmal der Browser manchmal "alte" Dateien/ Objekte behält und er dann irgendwann an Leistung verliert? Oder
liegt das immer nur am eigenen Code? Weil ab und zu geht die Leistung einfach so komplett in die Knie und ich muss den Browser neustarten damit es funktioniert.
Aber diese einbrüchen komme zu unterschiedlichen Zeiten zustande, auch wenn ich beim Testen die halbwegs gleichen Abläufe durchführe.
Falls es nicht am Code liegt, könnte man dieses Problem irgendwie beheben? Oder liegt es evtl. daran, dass ich dann zuviele Schleifen drin habe und er bei zuvielen
Element dann anfängt zulange zu rechnen?

Danke für eure Hilfe.
 
Du kannst die cursorId und/oder die sessionId doch als Index in einem Array verwenden. Dann kannst du immer gleich darauf zugreifen.

Kann es sein, das manchmal der Browser manchmal "alte" Dateien/ Objekte behält und er dann irgendwann an Leistung verliert?
Das kann schon passieren. Mit welchem Browser testest du denn?
 
Du kannst die cursorId und/oder die sessionId doch als Index in einem Array verwenden. Dann kannst du immer gleich darauf zugreifen.

Die Idee finde ich garnicht mal so schlecht. Werd ich mal ausprobieren. Daran habe ich selber garnicht gedacht. Danke für den Vorschlag.


Das kann schon passieren. Mit welchem Browser testest du denn?
Ich teste mit FF und IE. Kann man diesen Leistungseinbruch irgendwie umgehen? Oder den Browser zwingen, nicht verwendete sache zu löschen?
Also eine Art Garbage Collection verwenden?

Grüße
 
Danke für den Vorschlag.
Bitte - gern geschehen.

Ich teste mit FF und IE.
Welche Version?

Kann man diesen Leistungseinbruch irgendwie umgehen?
Ja - indem man sauber programmiert.

Oder den Browser zwingen, nicht verwendete sache zu löschen?
Also eine Art Garbage Collection verwenden?
Zwingen kann man den Browser nicht, aber er hat eine automatische GC.
 
Zurück
Oben