LSL Mandelbrot Benchmark
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
//
// 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();
}
}