Difference between revisions of "LSL Script Efficiency"

From Second Life Wiki
Jump to navigation Jump to search
m (→‎Rules for posting: fixed the test script)
Line 19: Line 19:




The following code will get the time for each fuction call in millis.
The following code will get the time for each function call in millis.


<pre>
<pre>
//IMPORTANT: Only perform tests in an empty region to reduce contamination.
integer time() {
integer time() {
     string stamp = llGetTimestamp();
     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;
     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 {
default {
   state_entry() {
   state_entry() {
    //test variables
    float counter;
    //framework variables
     float i = 0;
     float i = 0;
    float j = 0;
     float max = 10000;
     float max = 10000;
     float current = time();
     float start = time();
     while (i < max) {
     do {
      i += 1;
      //test
     }
      counter += 1;
     float t = (time()+-current)/max;
     
    }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.");
     llOwnerSay("The function in the loop took a total of " + (string)t + " milliseconds.");
   }
   }

Revision as of 14:32, 16 May 2007

What is Efficiency

Efficiency is how long it takes to run a script.

There are many ways to speed up scripts, such as using ++a instead of a++.

Rules for posting

1. Don't add theories.
2. Don't write "x is faster than y", write, "x takes X millis, y takes Y milis".


The following code will get the time for each function call in millis.

//IMPORTANT: Only perform tests in an empty region to reduce contamination.

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.");
  }
}

Efficiency

In theory, ++a and a += 1 are equal in speed, however this is not true:

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

Testing the same function in for loops:

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

llOwnerSay v. llSay v. llShout v. llWhisper (Channel 0 where applies):

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

Different Channels (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

Amount of text (llSay() and Channel 1 used for all):

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