Difference between revisions of "LSL Mandelbrot Benchmark"

From Second Life Wiki
Jump to navigation Jump to search
m (<lsl> tag to <source>)
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<lsl>
{{LSL Header}}{{DEFAULTSORT:Mandelbrot}}
<source lang="lsl2">
//
//
// The Great Computer Language Shootout
// The Great Computer Language Shootout
Line 102: Line 103:
     }
     }
}
}
</lsl>
</source>


==LSL2 Optimized==
==LSL2 Optimized==
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>
<source lang="lsl2">//
//
// The Great Computer Language Shootout
// The Great Computer Language Shootout
// http://shootout.alioth.debian.org/
// http://shootout.alioth.debian.org/
Line 157: Line 157:
               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 202:
         time();
         time();
     }
     }
}
}</source>
</lsl>
 
{{LSLC|Library}}
{{LSLC|Benchmark}}

Latest revision as of 11:03, 25 January 2015

//
// 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();
    }
}

LSL2 Optimized

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

//
// 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();
    }
}