数学建模社区-数学中国

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

作者: forcal    时间: 2010-9-27 19:28
标题: Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
" D6 g3 y. h8 w在大量函数调用时,Forcal更具速度优势。3 |/ q3 J1 x/ E0 A
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。/ J% G: C3 U1 U( B: Z' r% v

" z6 ]; F9 u- Y7 M& l) }例1:Fibonacci递归程序(n取40)
& T. ~. p# G2 R
  1. SetRealStackMax(1000);! Z0 l6 Z7 ], @7 h) }  ?# A8 G
  2. F(n)= which{
    % o: h) [; Q( [/ M
  3.         n == 0,
    7 r' L9 n! v- E, C( O
  4.                 return(0),
    " A8 @# \- I% e% P
  5.         n == 1,5 ?6 s6 v6 B- R1 C
  6.                 return(1),* P* O( A! o2 f, U
  7.         return [F(n - 1) + F(n - 2)]. a# w0 ?8 L+ ^; W1 V6 {
  8. };' ]0 r/ M6 `" Y7 _$ N2 o; x& M+ k
  9. main(:t,n)=$ K$ O1 I* h! N" e2 u  O4 X1 P
  10. {# _# V3 o1 X- e
  11.         t=sys::clock(),' n$ S$ W/ D9 |+ j. f! ]1 G: ~" v
  12.         n=F(40),
    ( J  P% h- p. t% H( X
  13.         t=sys::clock()-t,  b0 U8 q( {! q! {( M* |6 Q" K4 O
  14.         printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
    8 q* X' Y: c* C8 }5 [( }
  15. };   A1 H0 R2 i; C- `  g+ R4 D# O8 V
复制代码
结果:) v# ^! R6 E0 j2 N9 l2 L

9 ^+ G2 N/ g$ yfibonacci=102334155, fibonacci_Time=41859毫秒=41秒+ A# V+ z. s* x/ X% b
' Z& q4 v, f! _) `+ W8 s
例2:八皇后问题
) b' B+ b# I# v+ e1 m" a' s
  1. // 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。! V1 n* U% x: W7 H) I0 V
  2. // Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。) C3 g$ T$ V0 H, c; I
  3. // Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
    - D: o3 V% I6 S0 g( X: m$ |
  4. // 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
    6 R. O  h$ _/ P0 G2 Z- u; }
  5. // 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。  O% A8 J+ D5 O: w: x3 c: ?
  6. // 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
    0 h( ?5 D6 F. ^+ D4 }- O1 t9 F1 f
  7. // 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。( J: }% k3 G5 R0 K9 \0 G4 B
  8. // 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。7 u9 k& x# c; I) d/ z
  9. // 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
    1 I  a+ n. V, Y: D8 [
  10. //Forcal源程序& s. Q: E* {7 v# l
  11. i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);0 x+ o) j2 ~& Y4 y6 ^9 W9 ]0 t3 k
  12. i:test(row, ld, rd : pos,p : sum,upperlim)=$ O7 O/ U3 f1 G- g5 P0 B5 x% R
  13. {8 Z; T- b8 o; b/ c! H
  14.     which0 ~2 ]& @, O8 E2 }
  15.     {   row != upperlim,2 g1 n& p+ {3 g. ~* A) Z
  16.         {   pos = and{upperlim , not[row.or(ld).or(rd)]},+ l5 l9 W6 A0 A1 o2 ^) P
  17.             while{ pos,6 K( Z1 l* H$ C" h( |8 u2 C
  18.                 p = and(pos,-pos),6 I" H( i& i3 }- r  l
  19.                 pos = pos -p,
    0 Z8 Q' @  @+ g0 E- b
  20.                 test(row+p, shl(ld+p,1), shr(rd+p,1))! d! X1 q5 W1 W8 k' G6 c
  21.             }: r) O" ~5 g0 E9 ]5 q0 T, u% z: b
  22.         },
    - z2 I3 ], O% v
  23.         sum++
    1 Y; A3 c* z' d  \1 v
  24.     }
    0 [* M4 q+ v; w( Q% O
  25. };( Q) u% |  F5 o! I
  26. i:main(:tm,n:sum,upperlim)=7 T) P3 D; n2 j  c
  27. {: c2 G/ {5 b. h, a$ G
  28.     n=15,
    ! v1 j* G( A# }9 K" O$ W
  29.     tm=sys::clock(),/ s8 v$ c0 h  Z4 u. t; N- F4 E
  30.     printff("Queens:{1,i}, ",n),# e" [# ~" f4 B; ~
  31.     upperlim=shl(upperlim,n)-1,
    " i8 K* e4 u: J
  32.     test(0,0,0),! ~! F: @# F' K8 I5 b
  33.     printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)$ e  b4 O3 Y* p' p
  34. };
    # G- Y9 `: M/ `
复制代码
Forcal运行结果:. a2 x( _' g. y* E' v

: l5 ~6 C* L9 M) T& @4 H8 a    Queens:15, sum:2279184, 59547毫秒.
4 M& R( Q0 P# ~/ Q- a4 m! E$ @* H7 y7 o: m; E$ W4 r0 z
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
- e' e! F0 o! j2 N* M
  1. mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =2 Y+ ?+ Z3 k9 J; a( q/ P. t
  2. {
      Q$ c7 G+ n( C$ [
  3.         cr = y - 0.5,
    , N5 J& I4 j0 R- r2 [
  4.         ci = x,0 s8 H# A4 h4 }5 k, Q# N; e1 d( o6 m
  5.         zi = 0.0,; f3 T' O9 Q3 b  V, J9 s
  6.         zr = 0.0,0 h4 \, @* q/ m/ N$ d
  7.         i = 0,9 O/ k- b2 C0 V: @3 ~
  8.         (1).while {' m( ]7 i/ J& S  {$ A
  9.                 i ++,. H3 w% g- o/ ]( w- I, J
  10.                 temp = zr * zi,
    ( i# M" f( r' m+ |! j5 w( \
  11.                 zr2 = zr * zr,
    # }/ i( R! V, m4 M* f6 C# L4 @* [
  12.                 zi2 = zi * zi,0 P' p# T0 r) {0 |
  13.                 zr = zr2 - zi2 + cr,
    . A8 Y4 s+ p& b  l1 a6 s
  14.                 zi = temp + temp + ci,4 j) r' I" L4 @! M
  15.                 if [zi2 + zr2 > 16, return (i)],
    ' I+ J' g. ]: z
  16.                 if [i > 1000, return (0)]
    3 g' e$ E9 w4 \
  17.         }; U2 A& d7 n7 X' Z4 K
  18.         $ D+ r3 F  X% _. K. T3 o
  19. };7 X, }' V: b. Y0 p
  20. main (:i,x,y,old,now) = {1 Z- S7 R8 N; D: ]0 D6 `! N
  21.         old=sys::clock(),! O- a* ^+ P% h9 E! E. n8 N/ U
  22.         y = -39,0 F; S# Z1 F' z* U8 k4 \. L
  23.         while{  y < 39,& p* s$ V. E0 l+ N8 e) B, o+ U0 @" [# I
  24.                 printff("\r\n")," N* A" ?7 o& D& ~* q
  25.                 x = -39,3 U# ]5 M* N! b. x
  26.                 while{  x < 39,7 b7 B0 t- e1 L: B9 t4 \
  27.                         i = mandelbrot(x/40.0, y/40.0),
    + b! c* ^; Z( z- @4 v7 v  J6 I
  28.                         which{        i==0,
    0 K4 ~: X$ `3 n
  29.                                 printff("*"),
    ; s/ \! S& g/ k9 D9 _
  30.                                 printff(" ")+ ]8 L  F% r; T3 z5 ~
  31.                         },
    ( O* U; N; ~9 _( ?& Q
  32.                         x++
    * x" R' W6 q4 P
  33.                 },% _# f2 _/ M8 V
  34.                 y++* y; |8 j4 `5 J* E/ |- A3 P
  35.         },
    6 E! F3 H2 A6 N
  36.         now=sys::clock(),
    ) W8 Y/ ?7 c8 |; m! c8 v2 U
  37.         printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)- K! c9 H) x, `# y! V
  38. };6 o/ A, G1 |; @0 ?4 x+ C9 R$ N
复制代码
- X1 N' y8 J2 ?  W3 T9 z
运行结果:
; W" C# S, C8 s8 U, A$ [
  1.                                        *
    + P; f% r: n: o2 M
  2.                                        *
    " S$ ?; C% m; ~$ @2 W  Z( Q8 Z
  3.                                        *
    . ^- U) m. o4 c% J7 w
  4.                                        *  @' E, B. s" n8 V2 \  S
  5.                                        *" g6 ?: k  r5 x* x- a( I
  6.                                       ***4 T7 t8 K, j+ c7 v6 Y; K
  7.                                      *****/ H: P8 k) L% Q7 |3 @- Z# M9 N. n  w
  8.                                      *****! n# _8 J/ `$ F8 k
  9.                                       ***! b) [- [) ~* c  X; B; G$ N9 H
  10.                                        *
    4 S7 h6 f1 a/ `% H. W
  11.                                    *********
    # q" \8 m7 Z  O- d: X, w6 e6 J$ s
  12.                                  *************
      v& r# E& K2 u# D( t
  13.                                 ***************
    3 D6 `) K. d, a9 J4 {1 ?6 v
  14.                              *********************
    4 K  R: q& I6 }. x, k0 k
  15.                              *********************" Q3 i: Y) p" t/ M" ]; r7 j0 ?
  16.                               *******************
    / B7 h9 {4 |/ m# y5 Q) U( F2 w
  17.                               *******************
    2 Y+ x% P1 ]$ p2 t- z
  18.                               *******************
      z: V! V2 U1 N' g. R
  19.                               *******************1 H' m0 w& l) V8 }( f
  20.                             ***********************
    + f! [# z" w- ?. ^3 p) u" C
  21.                               *******************
    * a! j3 \3 L3 i. Y, k5 R8 g; o
  22.                               *******************
    9 w+ x$ R7 d8 S; u
  23.                              *********************
    0 F4 p7 U0 }/ K
  24.                               *******************
    . f2 I! |) T. ]9 ^6 |' C
  25.                               *******************0 V/ L" [5 \7 c( S2 }
  26.                                *****************
    & B6 b' o( W; V1 D) z* p4 _
  27.                                 ***************3 C- I+ A9 q& W6 h# q! J
  28.                                  ************** }4 _$ I; X+ Z0 A# E( O
  29.                                    *********  {6 ?4 ]* M9 e( ^. y- R7 X; T
  30.                                        *2 S4 B0 F% ?* F: h5 c/ [
  31.                                 ***************
    " M  g% Z( j# ~3 ?, a' R
  32.                             ***********************# i8 H! ?* u8 a7 ~3 [3 {0 E
  33.                          * ************************* *) f! Y/ s! o+ d" z  g& Z
  34.                          *****************************
    . g, c. U3 q. t  X, J7 N
  35.                       * ******************************* *# }# X3 F5 c1 k5 U$ ~# B% T
  36.                        *********************************7 {& L, _; H, |9 o5 Z* x- @& i
  37.                       ***********************************3 F3 w" W' ~' C& l: y  Q$ m: f4 p
  38.                     ***************************************  V. v4 D% @( W. W! x; z9 I, l
  39.                *** ***************************************** ***
    8 }" j! z3 x& d3 Y: `; f
  40.                *************************************************. Q" P- Y& t3 |, D7 ]/ |9 b# I
  41.                 ***********************************************
    & F$ R$ j4 G1 m* `- M
  42.                  *********************************************/ D2 ?6 ^" D, n# g  n, u
  43.                  *********************************************
    # y5 x* F- T3 j+ ]5 R9 t, {
  44.                 ***********************************************3 M4 |6 p7 A% t6 I) ^5 ~
  45.                 ***********************************************
    1 Z1 j; q8 P2 h+ h( n# J  o
  46.               ***************************************************
    3 u* y) Q" L2 f% Y+ T/ f) J
  47.                *************************************************
    ) f' b9 o2 b& r8 a
  48.                *************************************************
    ! z4 ?' ^; `. d8 i2 e+ t
  49.               ***************************************************8 p" y' t7 i3 e; W
  50.               ***************************************************
    - g) E' I% I2 u$ r2 q5 d) C- i9 b
  51.          *    ***************************************************    *
    * I; a2 t0 y7 Q/ k) `
  52.        *****  ***************************************************  *****- W- [+ E( ^5 C( T8 J1 v
  53.        ****** *************************************************** ******0 t" h; W( {) h# r' i
  54.       ******* *************************************************** *******
    2 i3 f) f0 e6 k6 `/ D$ B
  55.     ***********************************************************************7 v4 H# e4 R  `: t3 Y0 @+ o, u0 J
  56.     ********* *************************************************** *********
    7 o1 Z& L' K$ ~% \1 m3 c& z
  57.        ****** *************************************************** ******2 \. a& `# z0 s0 [
  58.        *****  ***************************************************  *****# U! n! f  C9 i: v
  59.               ***************************************************( |% Z9 I+ R1 B
  60.               ***************************************************) S) D; m1 ^- p% q
  61.               ***************************************************
    . T& l% q! R! ~9 G% B0 m
  62.               ***************************************************' M; b% v5 Q! R: z% ^: T" n
  63.                *************************************************! @, A8 V0 B7 `% r) C2 n' ]
  64.                *************************************************
    9 s0 ^! X; L8 R5 G6 N0 y
  65.               ***************************************************, H6 B+ y' a. o
  66.                 ***********************************************
    / r  I( T3 y. K) `
  67.                 ***********************************************
    / Z# z5 F8 ?5 m: Y+ @" O6 m
  68.                   *******************************************
    & d$ Y# d' |: B4 z5 C$ n' }
  69.                    *****************************************6 S5 B5 |* b1 S3 N
  70.                  *********************************************
    6 O" ]  ?$ c. C! r  i# F/ N: |! Z
  71.                 **** ****************** ****************** ****# X8 F2 `; o' d7 A) j
  72.                  ***  ****************   ****************  ***9 Q6 M+ ]; c$ V; M/ Z8 [
  73.                   *    **************     **************    *
    0 v# n/ j; }3 J- W" a
  74.                          ***********       ***********
    / ?3 a7 g1 A, f* D
  75.                          **  *****           *****  **
    2 i$ ?. k4 q4 ^+ P' f! y
  76.                           *   *                 *   *
    1 y+ `' E5 y' i0 n! D4 _6 L
复制代码

( C' }2 h: F8 ~. I6 ^. a运行时间为:
! w; ?; K3 S9 N' m0 @0 n* u2 i" m6 w4 O# w8 R
        Forcal Elapsed 1.078
% t5 F8 C# z. ?& V2 l




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