Difference between revisions of "LSL Mandelbrot Benchmark"

From Second Life Wiki
Jump to navigation Jump to search
Line 107: Line 107:
This version was optimized for the LSL2 VM, it might run faster under Mono then the unoptimized version.
This version was optimized for the LSL2 VM, it might run faster under Mono then the unoptimized version.


<lsl>
<lsl>//
//
// The Great Computer Language Shootout
// The Great Computer Language Shootout
// http://shootout.alioth.debian.org/
// http://shootout.alioth.debian.org/
Line 157: Line 156:
               Zi = 2.0*Zr*Zi + Ci;
               Zi = 2.0*Zr*Zi + Ci;
               Zr = Tr;
               Zr = Tr;
              isNotOverLimit = Zr*Zr + Zi*Zi <= limit2;
          } while ((isNotOverLimit = (Zr*Zr + Zi*Zi <= limit2)) && (++i < m));
          } while ((++i < m) && isNotOverLimit);
      
      
           bits = (bits << 1) + isNotOverLimit;
           bits = (bits << 1) + isNotOverLimit;
Line 203: Line 201:
         time();
         time();
     }
     }
}
}</lsl>
</lsl>

Revision as of 09:41, 14 April 2008

<lsl> // // The Great Computer Language Shootout // http://shootout.alioth.debian.org/ // // contributed by Isaac Gouy // modified by Babbage Linden, Oct 10 2007 //

string hexc="0123456789ABCDEF";

string byte2hex(integer byte) {

   integer highBits = (byte & 0xF0) >> 4;
   integer lowBits = byte & 0x0F;
   return llGetSubString(hexc, highBits, highBits) + llGetSubString(hexc, lowBits, lowBits);

}

mandlebrot(integer width) {

   integer height = width;
   integer i;
   integer m = 50;
   integer bits = 0;
   integer bitnum = 0;
   integer isOverLimit = FALSE;
   float Zr = 0.0;
   float Zi = 0.0;
   float Cr = 0.0;
   float Ci = 0.0;
   float Tr;
   float Ti;
   float limit2 = 4.0;
   
   llSay(0, "P4");
   llSay(0, (string)width + " " + (string)height);
   
   string hexBytes = "";
   
   integer y;
   for(y = 0; y < height; y++) 
   {
       integer x;
    for(x = 0; x < width; x++)
    {
   
       Zr = 0.0; Zi = 0.0;
       Cr = 2.0*x / width - 1.5;
       Ci = 2.0*y / height - 1.0;
   
       i = 0;
       do {
          Tr = Zr*Zr - Zi*Zi + Cr;
          Ti = 2.0*Zr*Zi + Ci;
          Zr = Tr; Zi = Ti;
          isOverLimit = Zr*Zr + Zi*Zi > limit2;
       } while (!isOverLimit && (++i < m));
   
       bits = bits << 1;
       if (!isOverLimit) bits++;
       bitnum++;
   
       if (x == width - 1) {
          bits = bits << (8 - bitnum);
          bitnum = 8;
       }
   
       if (bitnum == 8)
       {
          hexBytes += byte2hex(bits);
          bits = 0; bitnum = 0;
       }
    }
   }
   llSay(0, "0x" + hexBytes);

}

test() {

   mandlebrot(10);

}

time() {

   llResetTime();
   llSay(0, "Starting tests...");
   test();
   llSay(0, "Finished tests in " + (string)llGetTime() + "s");

}

default {

   state_entry()
   {
       time();
   }
   
   touch_start(integer num)
   {
       time();
   }

} </lsl>

LSL2 Optimized

This version was optimized for the LSL2 VM, it might run faster under Mono then the unoptimized version.

<lsl>// // The Great Computer Language Shootout // http://shootout.alioth.debian.org/ // // contributed by Isaac Gouy // modified by Babbage Linden, Oct 10 2007 // optimized for LSL2 by Strife Onizuka, Apr 14 2008 //

string hexc="0123456789ABCDEF";

string byte2hex(integer byte) {

   integer highBits = (byte & 0xF0) >> 4;
   integer lowBits = byte & 0x0F;
   return llGetSubString(hexc, highBits, highBits) + llGetSubString(hexc, lowBits, lowBits);

}

mandlebrot(integer width) {

   integer height = width;
   integer m = 50;
   integer bits = 0;
   integer bitnum = 0;
   integer isNotOverLimit = TRUE;
   float limit2 = 4.0;
   
   llSay(0, "P4");
   llSay(0, (string)width + " " + (string)height);
   
   string hexBytes = "";
   
   integer y = 0;
   for(; y < height; ++y) 
   {
       integer x = 0;
       for(; x < width; ++x)
       {
      
          float Zr = 0.0;
          float Zi = 0.0;
          float Cr = 2.0*x / width - 1.5;
          float Ci = 2.0*y / height - 1.0;
   
          integer i = 0;
          do {
             float Tr = Zr*Zr - Zi*Zi + Cr;
             Zi = 2.0*Zr*Zi + Ci;
             Zr = Tr;
          } while ((isNotOverLimit = (Zr*Zr + Zi*Zi <= limit2)) && (++i < m));
   
          bits = (bits << 1) + isNotOverLimit;
          ++bitnum;
   
          if (x == width - 1) {
             bits = bits << (8 - bitnum);
             bitnum = 8;
          }
   
          if (bitnum == 8)
          {
             hexBytes += byte2hex(bits);
             bits = 0; bitnum = 0;
          }
       }
   }
   llSay(0, "0x" + hexBytes);

}

test() {

   mandlebrot(10);

}

time() {

   llResetTime();
   llSay(0, "Starting tests...");
   test();
   llSay(0, "Finished tests in " + (string)llGetTime() + "s");

}

default {

   state_entry()
   {
       time();
   }
   
   touch_start(integer num)
   {
       time();
   }

}</lsl>