Deutsches Second Life LSL: HomePage/effizienz ...

Home Page | Seiten Index | Letzte Aenderungen | Letzte Kommentare | Benutzer | Registrierung | Anmeldung:  Passwort:  

LSL Script Efficiency




Was ist Effizienz?
Effizienz bestimmt, wie lange es dauert, um ein Script auszuführen.


Es gibt viele Möglichkeiten, Scripte zu beschleunigen, man kann zum Beispiel ++a statt a++ benutzen.


Jedoch könnten die meisten jener Microoptimierungen zukünftig nicht nicht (mehr) gelten. Es gibt aber einige allgemeinen Richtlinien, die zu vermeiden sind:



Regeln zum Posten von Scripten


1. Bitte schreibe keine Theorien auf
2. Bitte schreibe nicht “X ist schneller als Y.”, bitte schreibe «X benötigt X Millisekunden, Y benötigt Y Millisekunden.”.


Der folgende Code zeigt die Zeit in Millisekunden an, die jeder Funktionaufruf benötigt.


Bitte verändert das nachstehende Script nicht, denn jede kleine Änderung könnte die Effizienz ändern/beeinflussen.
Vielen Dank an Xaviar Czervik für die Erstellung des Originalcodes und an Strife Onizuka für die Optimierung des Codes.


//WICHTIG: Bitte führe Tests nur in einer leeren Region aus.
// Bitte reduziere Vermüllung und stelle sicher, dass Du keine Attachments trägst.
// Bevorzuge Tests auf einer privaten Sim, auf der sich keine anderen Nutzer befinden.
// Bewege Dich nicht, wenn der Test durchgeführt wird.
// Es gibt eine Bandbreite von Fehlern, das mehrmalige Durchführen von Tests ermöglicht es, diese genauer zu bestimmen.

integer time() {
    string stamp = llGetTimestamp();
    return (integer) llGetSubString(stamp, 11, 12) * 3600000 + 
           (integer) llGetSubString(stamp, 14, 15) * 60000 + 
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000;
//llInsertString(llDeleteSubString(stamp, 19, 19) + "000000", 23, ".")
}

default {
  state_entry() {
    //test variables
    float counter;

    //framework variables
    float i = 0;
    float j = 0;
    float max = 10000;
    float start = time();
    do {
      //test
      counter += 1;
      
    }while (++i < max);
    float delta = time();
    do ; while (++j < max);
    float end = time();//remove the time required by the framework
    float t = ((delta - start) - (end - delta))/max;
    llOwnerSay("The function in the loop took a total of " + (string)t + " milliseconds.");
  }
}


Effizienz
Obwohl die folgenden Daten korrekt sind, wurde die oben genannte Funktion nicht genutzt.
Eine etwas weniger optimierte Version von Xaviar Czervik wurde genutzt.
Könnte bitte jemand die Tests mit der oben genannten Funktion wiederholen?


Theoretisch sind ++a und a +=1 in der Geschwindigkeit gleich. Dies stimmt aber nicht:


++a:     0.364700 millis
  a += 1:  0.346900 millis
  a++:     0.413700 millis


Test der selben Funktion für Schleifen:


´

++a:     0.358370 millis
  a += 1:  0.351200 millis
  a++:     0.424600 millis

llOwnerSay v. llSay v. llShout v. llWhisper (Kanal 0, sofern anwendbar):


llOwnerSay(): 4.359000 millis
  llWhisper():  5.201000 millis
  llSay():      5.226000 millis
  llShout():   14.877000 millis

Verschiedene Kanäle (llSay() Used for all):


-100000000: 1.226400 millis
  -100000:    1.254300 millis
  -100:       1.296100 millis
  -1:         1.292400 millis
  0:          5.226000 millis
  1:          1.242300 millis
  100:        1.249100 millis
  100000:     1.219700 millis
  100000000:  1.228700 millis


Größe des Textes (llSay() and Channel 1 used for all):


1 Character:    1.242300 millis
   10 Characters:  1.309700 millis
   100 Characters: 1.965600 millis




Home | Funktionen | Events | Typen | Kontrollstrukturen| Beispiele


Zu dieser Seite gibt es keine Dateien. [Zeige Dateien/Upload]
Kein Kommentar. [Zeige Kommentare]