forcal 发表于 2010-9-27 19:28

Forcal运行速度测试例子

Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
在大量函数调用时,Forcal更具速度优势。
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。

例1:Fibonacci递归程序(n取40)
SetRealStackMax(1000);
F(n)= which{
        n == 0,
                return(0),
        n == 1,
                return(1),
        return
};
main(:t,n)=
{
        t=sys::clock(),
        n=F(40),
        t=sys::clock()-t,
        printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
};
结果:

fibonacci=102334155, fibonacci_Time=41859毫秒=41秒

例2:八皇后问题
// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
//Forcal源程序
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
i:test(row, ld, rd : pos,p : sum,upperlim)=
{
    which
    {   row != upperlim,
        {   pos = and{upperlim , not},
            while{ pos,
                p = and(pos,-pos),
                pos = pos -p,
                test(row+p, shl(ld+p,1), shr(rd+p,1))
            }
        },
        sum++
    }
};
i:main(:tm,n:sum,upperlim)=
{
    n=15,
    tm=sys::clock(),
    printff("Queens:{1,i}, ",n),
    upperlim=shl(upperlim,n)-1,
    test(0,0,0),
    printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
};
Forcal运行结果:

    Queens:15, sum:2279184, 59547毫秒.

例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
{
        cr = y - 0.5,
        ci = x,
        zi = 0.0,
        zr = 0.0,
        i = 0,
        (1).while {
                i ++,
                temp = zr * zi,
                zr2 = zr * zr,
                zi2 = zi * zi,
                zr = zr2 - zi2 + cr,
                zi = temp + temp + ci,
                if ,
                if
        }
        
};
main (:i,x,y,old,now) = {
        old=sys::clock(),
        y = -39,
        while{  y < 39,
                printff("\r\n"),
                x = -39,
                while{  x < 39,
                        i = mandelbrot(x/40.0, y/40.0),
                        which{        i==0,
                                printff("*"),
                                printff(" ")
                        },
                        x++
                },
                y++
        },
        now=sys::clock(),
        printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)
};

运行结果:
                                       *
                                       *
                                       *
                                       *
                                       *
                                      ***
                                     *****
                                     *****
                                      ***
                                       *
                                   *********
                                 *************
                                ***************
                             *********************
                             *********************
                              *******************
                              *******************
                              *******************
                              *******************
                            ***********************
                              *******************
                              *******************
                             *********************
                              *******************
                              *******************
                               *****************
                                ***************
                                 *************
                                   *********
                                       *
                                ***************
                            ***********************
                         * ************************* *
                         *****************************
                      * ******************************* *
                       *********************************
                      ***********************************
                    ***************************************
               *** ***************************************** ***
               *************************************************
                ***********************************************
                 *********************************************
                 *********************************************
                ***********************************************
                ***********************************************
              ***************************************************
               *************************************************
               *************************************************
              ***************************************************
              ***************************************************
         *    ***************************************************    *
       *****  ***************************************************  *****
       ****** *************************************************** ******
      ******* *************************************************** *******
    ***********************************************************************
    ********* *************************************************** *********
       ****** *************************************************** ******
       *****  ***************************************************  *****
              ***************************************************
              ***************************************************
              ***************************************************
              ***************************************************
               *************************************************
               *************************************************
              ***************************************************
                ***********************************************
                ***********************************************
                  *******************************************
                   *****************************************
                 *********************************************
                **** ****************** ****************** ****
                 ***  ****************   ****************  ***
                  *    **************     **************    *
                         ***********       ***********
                         **  *****           *****  **
                          *   *                 *   *

运行时间为:

        Forcal Elapsed 1.078
页: [1]
查看完整版本: Forcal运行速度测试例子