Difference between revisions of "Efficiency Tester"

From Second Life Wiki
Jump to navigation Jump to search
(guess why this page thru yesterday mystically presented exactly the same code with less comments than the LSL Script Efficiency page)
m (clarify - add comments and white space and less distractingly creative variable names and never single letter variable names -- also strike the old never-reached un-explained llInsertString code)
Line 14: Line 14:
// There is a margin of error so run the tests multiple times to determine it.
// There is a margin of error so run the tests multiple times to determine it.


integer time() {
integer time() { // count milliseconds since the day began
     string stamp = llGetTimestamp();
     string stamp = llGetTimestamp(); // "YYYY-MM-DDThh:mm:ss.ff..fZ"
     return (integer) llGetSubString(stamp, 11, 12) * 3600000 +  
     return (integer) llGetSubString(stamp, 11, 12) * 3600000 + // hh
           (integer) llGetSubString(stamp, 14, 15) * 60000 +  
           (integer) llGetSubString(stamp, 14, 15) * 60000 + // mm
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000;
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000; // ss.ff..f
//llInsertString(llDeleteSubString(stamp, 19, 19) + "000000", 23, ".")
}
}


default {
default {
   state_entry() {
   state_entry() {
     //test variables
     //test variables
     float counter;
     float counter;
Line 30: Line 30:
     float i = 0;
     float i = 0;
     float j = 0;
     float j = 0;
     float max = 10000;
     float max = 10000; // 2ms of work takes 20 seconds to repeat 10,000 times, plus overhead
     float start = time();
 
     float t0 = time();
     do {
     do {
       //test
       //test
       counter += 1;
       counter += 1;
        
        
     }while (++i < max);
     }while (++i < max);
     float delta = time();
     float t1 = time();
     do ; while (++j < max);
     do ; while (++j < max);
     float end = time();//remove the time required by the framework
     float t2 = time();//remove the time required by the framework
     float t = ((delta - start) - (end - delta))/max;
     float elapsed = ((t1 - t0) - (t2 - t1))/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)elapsed + " milliseconds.");
   }
   }
}
}

Revision as of 04:42, 16 October 2007

Want to know how fast some code is? Run your code inside code like this example to call it time and again and measure the change in llGetTimestamp.

Want to know how small some code is? Add three copies of your code to a script, call llGetFreeMemory to count free space, and start deleting copies. After deleting each copy, you should see a consistent savings in free space, i.e, the code space cost of your code.

Please understand, we don't mean to be arguing for many different ways to measure the costs of code. We do mean to be building a consensus on best practices, presented as a short discussion drawn from a neutral point of view.

//IMPORTANT: Only perform tests in an empty region.
// To reduce contamination and be sure to wearing no attachments.
// Preferably do tests in a private sim with one on it.
// Don't move while performing the test.
// There is a margin of error so run the tests multiple times to determine it.

integer time() { // count milliseconds since the day began
    string stamp = llGetTimestamp(); // "YYYY-MM-DDThh:mm:ss.ff..fZ"
    return (integer) llGetSubString(stamp, 11, 12) * 3600000 + // hh
           (integer) llGetSubString(stamp, 14, 15) * 60000 +  // mm
           llRound((float)llGetSubString(stamp, 17, -2) * 1000000.0)/1000; // ss.ff..f
}

default {
  state_entry() {

    //test variables
    float counter;

    //framework variables
    float i = 0;
    float j = 0;
    float max = 10000; // 2ms of work takes 20 seconds to repeat 10,000 times, plus overhead

    float t0 = time();
    do {

      //test
      counter += 1;
      
    }while (++i < max);
    float t1 = time();
    do ; while (++j < max);
    float t2 = time();//remove the time required by the framework
    float elapsed = ((t1 - t0) - (t2 - t1))/max;
    llOwnerSay("The function in the loop took a total of " + (string)elapsed + " milliseconds.");
  }
}

Copy-edited by Xaviar Czervik, then modified by Strife Onizuka, then further edited as the history of this article shows.