Mandelbrot

Mandelbrot

This benchmark computes and draws 50 times the same mandelbrot figure on the standard output with 0 and 1 characters.

Results

The execution time is the user time added to the system time, as returned by the bash "time" command. The execution time is computed by redirecting the standard output to /dev/null.
Python Perl Gambas Gambas + JIT
Execution time (s) 35.3 23.2 13.6 0.56
vs. Python 1 0.66 0.39 0.016
vs. Perl 1.52 1 0.59 0.024
vs. Gambas 2.60 1.71 1 0.041
vs. Gambas + JIT 63.04 41.43 24.29 1

Python source code

#!/usr/bin/python
import sys
MAXITER = 50
LIMIT = 4
out = sys.stdout;
def mandelbrot(w, h) :
 xmin = -1.5
 ymin = -1
 invN = 2.0 / w
 checknext = True
 for y in range(h) :
 Ci = y * invN + ymin
 for x in range(w) :
 Zr = 0.0
 Zi = 0.0
 Tr = 0.0
 Ti = 0.0
 Cr = x * invN + xmin
 if (checknext) :
 for k in range(MAXITER) :
 Zi = 2 * Zr * Zi + Ci
 Zr = Tr - Ti + Cr
 Ti = Zi * Zi
 Tr = Zr * Zr
 if (Tr + Ti) > LIMIT :
 break
 if k == MAXITER :
 out.write("1")
 else :
 out.write("0")
 checknext = False
 else :
 for k in range(MAXITER) :
 Zi = 2 * Zr * Zi + Ci
 Zr = Tr - Ti + Cr
 Ti = Zi * Zi
 Tr = Zr * Zr
 if (Tr + Ti) < LIMIT :
 out.write("1")
 else :
 out.write("0")
 checknext = True
 out.write("\n")
for i in range(50) :
 mandelbrot(200, 200)

Perl source code

#!/usr/bin/perl -w
use strict;
my $MAXITER = 50;
my $LIMIT = 4;
sub mandelbrot($$)
{
 my $w = $_[0];
 my $h = $_[1];
 my $xmin = -1.5;
 my $ymin = -1;
 my $invN = 2/$w;
 my $checknext=1;
 for my $y (0..$h-1) {
 my $Ci = $y * $invN + $ymin;
 X:
 for my $x (0..$w-1) {
 my $Zr = 0;
 my $Zi = 0;
 my $Tr = 0;
 my $Ti = 0;
 my $Cr = $x * $invN + $xmin;
 if ($checknext) {
 for (1..$MAXITER) {
 $Zi = 2 * $Zr * $Zi + $Ci;
 $Zr = $Tr - $Ti + $Cr;
 $Ti = $Zi * $Zi;
 $Tr = $Zr * $Zr;
 if ($Tr + $Ti > $LIMIT) {
 print "0";
 next X;
 }
 }
 print "1";
 $checknext = 0;
 } else {
 for (1..$MAXITER) {
 $Zi = 2 * $Zr * $Zi + $Ci;
 $Zr = $Tr - $Ti + $Cr;
 $Ti = $Zi * $Zi;
 $Tr = $Zr * $Zr;
 }
 if ($Tr+$Ti < $LIMIT) {
 print "1";
 } else { # $Tr+$Ti is a large number or overflow ('nan' or 'inf')
 print "0";
 $checknext = 1;
 }
 }
 }
 print "\n";
 }
}
for(1..50) {
 mandelbrot(200, 200);
}

Gambas source code

#!/usr/bin/env gbs3
Private Const MAXITER As Integer = 50
Private Const LIMIT As Integer = 4
Sub Mandelbrot(W As Integer, H As Integer)
 Dim XMin As Float = -1.5
 Dim YMin As Float = -1
 Dim InvN As Float = 2.0 / W
 Dim CheckNext As Boolean = True
 Dim X, Y, K As Integer
 Dim Cr, Ci, Zr, Zi, {Tr}, Ti, T As Float
 For Y = 0 To H - 1
 Ci = Y * InvN + YMin
 For X = 0 To W - 1
 Zr = 0
 Zi = 0
 {Tr} = 0
 Ti = 0
 Cr = X * InvN + XMin
 If CheckNext Then
 For K = 1 To MAXITER
 Zi = 2 * Zr * Zi + Ci
 Zr = {Tr} - Ti + Cr
 Ti = Zi * Zi
 {Tr} = Zr * Zr
 T = {Tr} + Ti
 If IsNan(T) Or If T > LIMIT Then Break
 Next
 If K > MAXITER Then
 Print "1";
 CheckNext = False
 Else
 Print "0";
 Endif
 Else
 For K = 1 To MAXITER
 Zi = 2 * Zr * Zi + Ci
 Zr = {Tr} - Ti + Cr
 Ti = Zi * Zi
 {Tr} = Zr * Zr
 Next
 T = {Tr} + Ti
 If IsNan(T) Or If T > LIMIT Then
 Print "0";
 CheckNext = True
 Else
 Print "1";
 Endif
 Endif
 Next
 Print
 Next
End
Dim I As Integer
For I = 1 To 50
 Mandelbrot(200, 200)
Next

AltStyle によって変換されたページ (->オリジナル) /