Difference between revisions of "LSL Mandelbrot Benchmark"

From Second Life Wiki
Jump to navigation Jump to search
m (lsl code tagging)
Line 12: Line 12:
string byte2hex(integer byte)  
string byte2hex(integer byte)  
{
{
     integer highBits = byte & 0xF0;
     integer highBits = (byte & 0xF0) >> 4;
     integer lowBits = byte & 0x0F;
     integer lowBits = byte & 0x0F;
     return llGetSubString(hexc, highBits, highBits) + llGetSubString(hexc, lowBits, lowBits);
     return llGetSubString(hexc, highBits, highBits) + llGetSubString(hexc, lowBits, lowBits);
Line 72: Line 72:
         }
         }
     }
     }
    }
    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;
              isNotOverLimit = Zr*Zr + Zi*Zi <= limit2;
          } while ((++i < m) && isNotOverLimit);
   
          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);
     llSay(0, "0x" + hexBytes);

Revision as of 09:29, 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;
             isNotOverLimit = Zr*Zr + Zi*Zi <= limit2;
          } while ((++i < m) && isNotOverLimit);
   
          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>