数学建模社区-数学中国

标题: Forcal运行速度测试例子 [打印本页]

作者: forcal    时间: 2010-9-27 19:28
标题: Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。0 J/ m* @2 l1 i
在大量函数调用时,Forcal更具速度优势。, v! E0 x! Q* T7 ]( Z" ~
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。
! [" i6 _: ~; V! C, o! E* ]9 R
' s* H( o' V5 |. F- ]例1:Fibonacci递归程序(n取40)7 v. B4 A  P- u7 h/ q7 N' g8 Y
  1. SetRealStackMax(1000);: ?% V3 H8 y9 _
  2. F(n)= which{# ~. T( x: j. g( U$ u% t4 B
  3.         n == 0,
    ; Z& q* E! {! S- |4 l7 D
  4.                 return(0),
    9 P( z* r5 l4 f" S
  5.         n == 1,
    7 n1 a) g( ^3 ^6 r5 p
  6.                 return(1),
    0 R3 h7 Z) U' L/ J4 I, b$ Z: V
  7.         return [F(n - 1) + F(n - 2)]
    $ q5 b! N' F" q9 l3 B/ \+ l- n& X
  8. };
    3 b' U, e* @! R+ U/ s, z; a+ @  g
  9. main(:t,n)=
    9 w8 H( J) N0 r) o/ {8 ?
  10. {
    + a1 M/ h5 g9 p3 a- y
  11.         t=sys::clock(),
    : v' z  R5 l+ x" h' s) G
  12.         n=F(40),5 {, B1 u6 W2 [# J4 s9 n6 `" i
  13.         t=sys::clock()-t,% N; {1 a/ }4 n+ I* x% G
  14.         printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
    ' c7 L% Y( S" {3 V# H
  15. }; ( P1 f* r6 v- H  ?; m1 p9 I/ Y
复制代码
结果:
+ g2 h8 A4 ^7 _: _* Q; j9 L' P6 x# }: y: R
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒
. {7 J9 o. v6 ~4 R" \6 y
& N9 z5 e4 h9 L1 h% m1 z% W4 A例2:八皇后问题
- x  s4 d5 a% o5 W
  1. // 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。" v0 g/ O( C. |' a2 t
  2. // Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。0 u$ s7 @: X8 L0 ~" N" d) r
  3. // Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。' J0 h3 Z( D# u, ^
  4. // 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。9 c8 n6 t' v) }( `0 A# H2 A
  5. // 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
    % l. y# |& Y' b) C4 b3 V+ D
  6. // 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
    ; c- r5 _# R8 q  A+ `9 t) a
  7. // 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
    - h" M" t- B; i4 w
  8. // 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
    1 r" X1 `5 i  Y5 S
  9. // 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
    & ?# T2 [- j/ }" j" z
  10. //Forcal源程序
    . |; z* M: y0 x: o+ o7 b
  11. i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
    ! R8 {( h  x7 E/ K
  12. i:test(row, ld, rd : pos,p : sum,upperlim)=
    " J) I# H1 u, s" i
  13. {
    & u& J7 i. y4 C! B0 ?- H1 H
  14.     which
    . A& P1 c2 P* @; D2 d
  15.     {   row != upperlim,
    ( A4 _' d5 s/ T& w6 j
  16.         {   pos = and{upperlim , not[row.or(ld).or(rd)]},
    1 L) H6 {+ Q' c3 ?8 l2 T
  17.             while{ pos,
    * \& s' C2 s9 X: F1 y, t
  18.                 p = and(pos,-pos),
    7 u2 x9 h, N7 x, S8 ?
  19.                 pos = pos -p,& T8 l; `' D8 H4 N
  20.                 test(row+p, shl(ld+p,1), shr(rd+p,1))
    * A7 B6 r" a/ ^; `
  21.             }- _  W" T+ l: F$ @9 k* f6 |1 U  a
  22.         },! p" w! _" S' u& c
  23.         sum++
    ' g$ z0 i, F8 v3 R/ y4 K' z
  24.     }1 Z: ]7 k5 T3 I3 {  C/ y8 z
  25. };$ m7 X# g- n9 w/ W& Z
  26. i:main(:tm,n:sum,upperlim)=
    : a& s' `1 u  t8 \( s0 ^7 J
  27. {
    / S6 L' i1 Z' L/ i) ~7 f6 I; ~, N
  28.     n=15,
    3 E9 }  X# W: a( J
  29.     tm=sys::clock(),
    7 ]; Y( X- F. A
  30.     printff("Queens:{1,i}, ",n),
    + A$ y7 O  k- N: R
  31.     upperlim=shl(upperlim,n)-1,
    , E: t* v" `6 S4 c
  32.     test(0,0,0),
    7 S4 d) I- m6 R" g
  33.     printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)+ W6 I! d  K% j2 H/ C& n0 w" v
  34. };; e( M2 ^* I- N' U* r. n2 z
复制代码
Forcal运行结果:
) i+ P6 ]! G+ k6 D0 ?' b0 x- G, D$ p: k6 {' i; `, R0 P
    Queens:15, sum:2279184, 59547毫秒.* ]: P  V/ V. h

& t  ?. }: w  C5 n3 z; m例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右5 l6 X' v( o" V8 U5 H2 z
  1. mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
    ! ~$ C( c( ~+ o! p0 N- y3 c
  2. {
    , R) H* x- c2 t( \7 l+ |
  3.         cr = y - 0.5,
    ) U$ k! c# K3 ]* M) Z* D& }
  4.         ci = x,& a2 f$ E; I1 E! S3 B. b8 |
  5.         zi = 0.0,. Q+ s. Z2 [! ~% c! u+ t9 `" P  |
  6.         zr = 0.0,9 [: p( K4 _) y$ u- [! P
  7.         i = 0,
    / o% [+ G* ?3 q" O5 ~; w3 I
  8.         (1).while {
    - D( N3 O# z8 b" J. O7 q1 G( G
  9.                 i ++,
    1 Z' z9 y; d0 f# f' @; T
  10.                 temp = zr * zi,
    : p- W+ i1 H9 B; Y* d
  11.                 zr2 = zr * zr,( }- i4 t# C( _2 T; c
  12.                 zi2 = zi * zi,
    % o9 p9 D! R; i- X; H: w/ U
  13.                 zr = zr2 - zi2 + cr,% {2 r8 V( Z* h! K) c* a
  14.                 zi = temp + temp + ci,' _8 Z, V# J/ M: d& g
  15.                 if [zi2 + zr2 > 16, return (i)],
    5 @1 }4 q7 H& ?
  16.                 if [i > 1000, return (0)]4 X6 n9 s- p& K  D" `8 d0 Z( i; n% ^
  17.         }
    0 ^- ]3 K" }$ v2 Y& W
  18.         
    ) v" M+ p( U4 w4 s& Q
  19. };) q" R6 b4 m! t" @9 w
  20. main (:i,x,y,old,now) = {
    ( L4 G3 i; c9 p
  21.         old=sys::clock(),
    ( p3 H  _6 b( h/ Y
  22.         y = -39,
    1 A0 g0 ]2 y- \8 C- a9 D7 a7 A- c
  23.         while{  y < 39,
    ; D( K/ A; v& t% Y5 W" {
  24.                 printff("\r\n"),* e0 M* g9 w8 V5 ^+ b. |4 s2 ^
  25.                 x = -39,  x$ ~" u3 j' N$ n
  26.                 while{  x < 39,( v5 M+ R2 q& L$ O5 e# X
  27.                         i = mandelbrot(x/40.0, y/40.0),
    & O! M5 r5 U* T  F; p( _4 P$ S
  28.                         which{        i==0,
    * j3 f% y0 ]% p0 F: F
  29.                                 printff("*"),
    ; p# A$ O9 U  o* p( P
  30.                                 printff(" ")
    + O+ W6 N9 }) Z" f7 m
  31.                         },
    4 U6 j2 T: X1 g3 ?; ~9 B- P
  32.                         x++
    ' N/ h% P# J( R' ^4 f) _
  33.                 },7 M0 Y( f1 `. s+ o
  34.                 y++
    . n8 y3 c% u7 l' U0 X
  35.         },
    " |& g" V' n3 u& q0 h
  36.         now=sys::clock(),
    % {" y; C0 V; z6 S
  37.         printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)& s4 h" u) l6 [
  38. };
    ) T9 A$ c6 I7 ~
复制代码
! e. Y; P9 M$ Y$ x5 a1 K
运行结果:
3 C: n, _8 n; A
  1.                                        *
    0 u3 P0 h$ t; ^% L
  2.                                        *
    5 P  `2 ]1 G  N! T
  3.                                        *. m) S5 C; X. j/ I' p
  4.                                        *
    $ ~& B* \! H) |! U" c3 e
  5.                                        *
    ) U4 x, q6 ~# ^( u: l5 D
  6.                                       ***
    0 u( e4 I+ r' }+ @0 C8 F7 S, D
  7.                                      *****( c! Z3 ?$ l3 N9 l
  8.                                      *****; }  K! T; m7 K1 p7 V" k  Y
  9.                                       ***
    1 f9 ~) l# N0 d" Z* [' G
  10.                                        *
    ' a* G# J( g1 P; W& n' E
  11.                                    *********$ ]. P6 U- P! R' r
  12.                                  *************
    ( }& _" S  V' u
  13.                                 ***************
    $ z; I" M& `0 Z: }7 {$ i
  14.                              *********************
    / U( E) a) `: t5 Y! t6 o
  15.                              *********************/ [" ^) v. Z5 c+ `) @
  16.                               *******************
    1 l0 h& R7 H/ l
  17.                               *******************. Y8 ~+ ?1 j5 D: x, m! {( ?, I8 H
  18.                               *******************
    ) x4 z6 _: _, v1 p
  19.                               *******************
    ' p9 R1 t( n" T% j7 S# u  X5 w
  20.                             ***********************
    9 Y9 J) j4 s4 }0 Z$ {7 h. B
  21.                               *******************
    1 P4 J# ~' c1 e1 {) \4 R/ T9 A3 ~. k
  22.                               *******************
    , \/ H4 ~5 E. ^$ h
  23.                              *********************9 Y% G$ H# j9 V6 z+ U" U: e
  24.                               *******************! v/ d# y. `9 L) r5 g0 v
  25.                               *******************
    & d7 b( @$ {" U: A- J+ ]1 {  o
  26.                                *****************
    3 D, D3 V/ y# `3 C+ S, E
  27.                                 ***************8 k- {6 \2 q' n* f- M: y& |
  28.                                  *************. }0 w1 D; i( L6 M
  29.                                    *********( y7 ?& K! I0 C  a1 T( \0 u( r
  30.                                        *7 M5 A- y8 p0 O/ k
  31.                                 ***************4 B' c9 B) R2 w) l/ `
  32.                             ***********************
    5 D1 d- E4 e) n8 p9 c
  33.                          * ************************* *0 s; N# Y- R$ C, `. m
  34.                          *****************************# k1 Z' ?; w0 P$ A' l; O  @2 B
  35.                       * ******************************* *
    ' d9 e( ?/ g- q  B' I3 \  K
  36.                        *********************************, G# M* m, ]1 D) }* n. Z
  37.                       ***********************************# h% o- W6 ~4 f
  38.                     ***************************************
    1 b3 S9 a# h; y; p% x
  39.                *** ***************************************** ***/ N' [" h' Q9 @  g
  40.                *************************************************: E1 H6 |5 O0 \- ?, G/ k! u
  41.                 ***********************************************
    $ m/ x; m0 C2 A6 N/ D; Q
  42.                  *********************************************  b8 F* p) ?8 k( ^  u, r
  43.                  *********************************************
    3 H/ E7 q$ g7 F6 }9 k3 F
  44.                 ***********************************************
    ; O/ a' x& _% {- O( m; r- u
  45.                 ***********************************************# {% x' @* P/ y' M5 \2 z2 a, Q
  46.               ***************************************************
      d. X1 H- Z1 [; f
  47.                *************************************************0 r) U; {, R1 s% K! J, w$ ]
  48.                *************************************************1 n( E# U4 t. R# z
  49.               ***************************************************
    * w# }$ T! x& G8 v1 W
  50.               ***************************************************
    , R/ ]; c7 A5 }+ j/ G" J
  51.          *    ***************************************************    *) p$ ?# d+ V) J0 M; l1 M
  52.        *****  ***************************************************  *****
    . H9 E$ |* T: u" X; w; O) I
  53.        ****** *************************************************** ******4 l3 w& r. I4 M$ E, a! g
  54.       ******* *************************************************** *******
    ' b8 s, E# D+ U9 D# {& H' u
  55.     ***********************************************************************3 h! y# T! m* k3 K  C
  56.     ********* *************************************************** *********- A" \5 O% H% C- E; N4 r
  57.        ****** *************************************************** ******
    - k- d. w& q* [2 L% ^% s
  58.        *****  ***************************************************  *****
    3 f! e2 s7 s; `( Q9 h; ~! S% r
  59.               ***************************************************" ~( Y7 S) f6 O. N" e  x) [/ v9 I
  60.               ***************************************************
    7 e6 f1 u; B1 O  B3 p3 R( X. L$ `% V, U
  61.               ***************************************************
    0 p  o5 `; j5 W4 A# o
  62.               ***************************************************6 P: B! V  n6 Z
  63.                *************************************************
    % ~! D! X: c* m
  64.                *************************************************( [" z6 d$ i1 D* y2 M
  65.               ***************************************************
    ! R9 Q  {) d) O; L, H* T
  66.                 ***********************************************
    9 U! }" R1 `: R+ j
  67.                 ***********************************************& f3 D+ M6 ]# @' h7 f' d
  68.                   *******************************************: j9 N+ _2 d9 B; g* N: `" u
  69.                    *****************************************0 ^2 q4 p8 \/ u6 s
  70.                  *********************************************
    ! f3 k7 A6 i9 t. W% i* i' A
  71.                 **** ****************** ****************** ****- v/ g( b& B5 O% z3 I4 N
  72.                  ***  ****************   ****************  ***
    5 C$ T  e3 V% L( N! r% k0 v* y3 q& h
  73.                   *    **************     **************    *
    . K& Z: c9 q. }! e( j8 k. s
  74.                          ***********       ***********
    9 R: E) T1 h' W0 z. R5 y
  75.                          **  *****           *****  **
    7 W) ]: h* D2 Z. J) p- {4 y. w
  76.                           *   *                 *   *
    $ H: S) b3 m- r! w' V
复制代码

! G9 d$ Q/ p8 y( `运行时间为:) ?+ v, t7 r- ^6 l' ]6 {% k
' ?# [0 G, Q& l# V6 K% K
        Forcal Elapsed 1.078
7 d0 {( ~* r! e, v! y$ T9 @0 w* |




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5