数学建模社区-数学中国

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

作者: forcal    时间: 2010-9-27 19:28
标题: Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
$ @! `/ V* H$ O7 O6 F) A* V1 R8 e在大量函数调用时,Forcal更具速度优势。
2 ?2 _; c0 b2 p2 ~2 Y9 D以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。* i6 M% {# T, L1 Z7 Y- w$ q

5 R1 k5 }5 u! `6 l4 R9 T! Y0 K例1:Fibonacci递归程序(n取40)
( ?) I$ \, J, M0 T# t: n
  1. SetRealStackMax(1000);
    3 |0 V# \, X( f7 |' F. `
  2. F(n)= which{  p# r. S7 D9 d# U
  3.         n == 0,% q  B2 j' K7 f& k! _. X) p) t
  4.                 return(0),+ U6 o  R$ \7 }
  5.         n == 1,! h+ _8 C2 @0 F( J( D5 s
  6.                 return(1),
    : ~# q  `6 [. k. {! n/ D  X
  7.         return [F(n - 1) + F(n - 2)]  s" ]% B5 [: D  {
  8. };& ~' K8 ^/ Y5 Y. _* ]8 x
  9. main(:t,n)=: ]) l! l( D$ l
  10. {( e2 |& l$ i! z8 d! _+ M
  11.         t=sys::clock(),* s2 d# D1 N, R% ^! a. {: w
  12.         n=F(40),
    ) C" a( Z2 M8 M( r+ _
  13.         t=sys::clock()-t,
    * \! S* b5 t0 X
  14.         printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
    : g' S" I0 q) ~* i( L9 z& h
  15. }; $ ]6 t7 ], W; U5 o9 Q) F  c8 W! D: H
复制代码
结果:. D8 G3 B# w- c( R, i' L
7 J0 B* K; w% O# h
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒. Z- T4 ?+ \9 t" y  k7 j+ @6 x
8 \2 R: z6 s$ P+ Y
例2:八皇后问题$ f+ |$ U5 h4 h  }) ^5 T
  1. // 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
    . J/ R+ R* S' ]
  2. // Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
    3 I$ i# U$ B! Q7 A. P. T" b
  3. // Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。- E2 ^- H) y2 Y
  4. // 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。5 i. V/ f+ F0 I; y
  5. // 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
    # n- v. z" _# z. G) s
  6. // 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
    , q( K3 V  w& u6 r4 P
  7. // 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。; u- T- ~5 r5 `
  8. // 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。3 j/ ~( u4 G) P9 }
  9. // 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
    : c' O% _" s, T) W
  10. //Forcal源程序( m; W+ N( R# d$ w+ p7 n* k; A9 {
  11. i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
    * A& U) K$ {* \% z/ _7 ^: n/ ]
  12. i:test(row, ld, rd : pos,p : sum,upperlim)=
    5 w  `5 {; h" ^% b) S8 M) F! R
  13. {
    ( c  X2 F0 W5 X
  14.     which. k- T0 P: g& z9 f3 U4 y8 }' K( u
  15.     {   row != upperlim,
    4 ?9 {; l- C1 `5 X  T( H9 a
  16.         {   pos = and{upperlim , not[row.or(ld).or(rd)]},- J! S0 Z& B4 x
  17.             while{ pos,9 J& c: I8 K+ h" O& H, U, @$ Q* Q
  18.                 p = and(pos,-pos),# y, L. N8 A$ {! i
  19.                 pos = pos -p,
    " p1 I& C+ t/ w0 |3 J+ f+ e: ?
  20.                 test(row+p, shl(ld+p,1), shr(rd+p,1))$ J. h9 o# l# X* @  O
  21.             }1 R- g( G3 s+ K  Q1 g1 C8 m6 V
  22.         },- L% I8 ^0 y( h
  23.         sum++
    % u' q7 K  p8 G# ]4 L7 q  }
  24.     }# h/ g2 l  E" n. [/ J! W- P
  25. };9 a8 P0 r  W) m. E' J2 C
  26. i:main(:tm,n:sum,upperlim)=
    . j* Q/ \0 g4 l- T" }
  27. {- c1 V! |, w: g0 i, R
  28.     n=15,  Z, b3 n2 o7 @; @- b
  29.     tm=sys::clock(),( s2 n9 n9 f9 e8 i/ g" h5 n" t
  30.     printff("Queens:{1,i}, ",n),$ S' Q/ {& E/ X+ H
  31.     upperlim=shl(upperlim,n)-1,
    4 q3 M3 x" P& k/ [
  32.     test(0,0,0),, F2 s$ U$ u! r. Y, [
  33.     printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
    # \/ |0 J" p8 O) o) r
  34. };
    & n8 s, `0 w2 a9 [- C  e' }0 ]
复制代码
Forcal运行结果:) ^1 i, v3 _3 H' Y+ C' W
2 ]- g% i. U& b3 z/ R/ Z
    Queens:15, sum:2279184, 59547毫秒.
+ n# c' D" H, g- J  v' d$ e% q' c* J8 s; o* ]
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右: ]- Q. U9 [3 S) q! q
  1. mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
    " ?, r: k7 H, K6 @  a
  2. {9 M, j8 {6 n9 ?6 B# ~- k$ W
  3.         cr = y - 0.5,
    5 C' b9 G  _8 V' R+ H7 x
  4.         ci = x,9 |7 l# _: p, G1 h  `( }
  5.         zi = 0.0,5 q0 s3 M  \& p; l" m2 c
  6.         zr = 0.0,; U- e% K) |; _) S
  7.         i = 0,
    % a* D( f1 ?0 A% P) b) s3 ~
  8.         (1).while {
    : I! o2 l4 C. D' r7 B; {
  9.                 i ++,
    . g2 L* `+ j' t: o2 B
  10.                 temp = zr * zi,  `8 {' `2 [' V; E" |! H* I
  11.                 zr2 = zr * zr,/ L3 Y' U9 W7 U8 p" N) I
  12.                 zi2 = zi * zi,
    5 K0 ]2 B1 x# i. ]
  13.                 zr = zr2 - zi2 + cr,( x% \4 Y: I; _3 H4 J. _$ c5 c
  14.                 zi = temp + temp + ci,
    & M6 O9 [/ H4 _" r1 W. a* l
  15.                 if [zi2 + zr2 > 16, return (i)],* x- d# d# C7 f) }
  16.                 if [i > 1000, return (0)]
    , }% E0 a( f" x. N( y
  17.         }2 X7 i2 d5 O' I
  18.         + X; y4 X  D5 x# l
  19. };
    + A. h- I: D4 Y; F! D$ v5 R- v
  20. main (:i,x,y,old,now) = {
    ; r- w7 b* q4 M3 @/ F3 U) r
  21.         old=sys::clock(),
    5 S" @- [1 G; `. J9 v0 ~
  22.         y = -39,
    + W  u' M( g$ A7 z* X; O/ ^
  23.         while{  y < 39,
    + S' D/ `" b( V4 S; n6 @: U
  24.                 printff("\r\n"),, _. ^: _0 P4 V2 i1 @
  25.                 x = -39,$ v& w, g6 V# m3 Z
  26.                 while{  x < 39,% H! p8 W/ X" Q- o. P
  27.                         i = mandelbrot(x/40.0, y/40.0),
    1 |1 X8 N% L2 X9 K' O
  28.                         which{        i==0,  R% [+ R# j$ n! J! [9 C7 e+ Y3 N
  29.                                 printff("*"),
    " K" a7 X" J+ D& U2 G( {9 p  _
  30.                                 printff(" ")
    3 W9 x2 [9 R& C+ ?
  31.                         },
    $ v' M1 c0 O7 E6 ]
  32.                         x++1 y7 {% J  c" z+ X$ c
  33.                 },
    " I& e# ?" b1 u
  34.                 y++
    2 e0 a6 x9 M* G6 i( b0 o
  35.         },$ c4 ~" G; L* j
  36.         now=sys::clock(),
    3 X' ]( W2 Z- {+ J
  37.         printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)% u* h# J! n5 B1 m
  38. };% P& S% a6 A/ {. Z* u2 }( j
复制代码
7 [) }( j8 `6 A
运行结果:' i4 l, x  ?5 r# _8 B+ k! b
  1.                                        *
    - i9 e3 H% X0 P+ C( Z
  2.                                        *
    5 y& u6 ^- a" ^9 T( N! w) M
  3.                                        *3 o" _3 E# T; a6 D
  4.                                        *
    * f- d2 X1 H8 o7 ?# q7 J
  5.                                        *' G, p7 l; H: M+ m0 Z+ d
  6.                                       ***
    ' @' V! B! I" }! i
  7.                                      *****
    6 ^; `; \: k! g* g9 O+ F
  8.                                      *****% S4 h/ J+ P8 `  T; P/ |& E
  9.                                       ***
    ; N: D% ?" C% ~7 R5 X- Q- ?
  10.                                        *3 n( r0 ]/ Y0 O6 H/ F1 O
  11.                                    *********
    # D& O- o+ {3 \% S' _" F+ ^
  12.                                  *************: u6 d9 v" M( r* ]7 y7 V$ n4 s
  13.                                 ***************
    8 R- I# a" `9 L* r
  14.                              *********************' a$ V: v1 R; H! i/ M' c
  15.                              *********************
    ( p9 B7 T" ~3 B
  16.                               *******************5 k4 _# K( e9 F; Z
  17.                               *******************( i) Q! v  Q' L4 X; ~
  18.                               *******************8 }5 s$ D# ?1 M+ z# v; q, u
  19.                               *******************9 [+ e* [( M4 `* T. j  [
  20.                             ***********************
    . h: p" j' w$ e
  21.                               *******************# d+ f" u' [" y# @4 ^3 ^: r; a
  22.                               *******************( e  Y( I. c! G& o8 y
  23.                              *********************" N: {! r5 Q7 |7 I' e: o' B0 o9 t
  24.                               *******************
    8 @( R# T2 V* e4 s) ]
  25.                               *******************
    * l1 t+ _4 A0 g9 g3 y
  26.                                *****************6 T: i2 i2 y  V0 K& j
  27.                                 ***************- ?3 _% k4 F7 ?7 _( e7 N
  28.                                  *************! P: {+ @5 B1 J7 _: o  {- p
  29.                                    *********
    " ?0 ^6 S$ e: h3 o
  30.                                        *
    & ^) V% {$ x: U+ _
  31.                                 ***************
    1 f5 D) _! {3 ?( O0 U) K
  32.                             ***********************- T/ S/ y" g/ @- Y: v
  33.                          * ************************* *
    0 O, x0 e! O0 P9 }# h: s& p
  34.                          ****************************** t8 _) v- H* c# d
  35.                       * ******************************* *
    1 T  H( W' ]: b! ~
  36.                        *********************************
    1 K, E8 Y# }- G* P9 D+ J/ c6 m
  37.                       ***********************************8 G6 W+ I9 s! t1 ~
  38.                     ***************************************
    . I+ N, x( K$ C
  39.                *** ***************************************** **** `6 x, Z2 x( Y" T
  40.                *************************************************
    1 Z. Z9 _. }& `$ D6 O9 J: x
  41.                 ***********************************************. ]" c" ~- ?% j. F& A
  42.                  ********************************************** t, a; |6 o; {5 [$ {4 |
  43.                  *********************************************
    2 ~: F% j! R+ |5 \
  44.                 ***********************************************  @7 U, m: q# @
  45.                 ***********************************************: J3 d6 v) U: r% p1 Z8 f; Y
  46.               ***************************************************
    9 b) ~) P! s, t2 S: Z1 J2 D
  47.                *************************************************" @# J! h3 q' s! `* i, J
  48.                *************************************************
    % S1 L% ~) P; ~- s2 _$ k- W& O6 m  R
  49.               ***************************************************
    8 z% q6 P5 b* C
  50.               ***************************************************; ]. ?7 t) `2 W  X' G# e
  51.          *    ***************************************************    *  t' b. l" s4 c- d; k. a: o5 Y  \
  52.        *****  ***************************************************  *****0 Z* c& K# a; ?. d5 D, i3 G
  53.        ****** *************************************************** ******
    # R. O8 `7 X. \; ^7 t( b- x! ^
  54.       ******* *************************************************** *******
    2 J* N$ I- ?/ R3 \) B7 y* T
  55.     ***********************************************************************
    % a: j3 e4 z7 t6 F3 _" {9 C6 j
  56.     ********* *************************************************** *********  W" Y; |3 N: k
  57.        ****** *************************************************** ******
    ! c: Y) D; B* e! ?4 i+ |. I, ?
  58.        *****  ***************************************************  *****
    ; L  q7 r" U7 [/ T. @, y" F
  59.               ***************************************************
    # m$ `; G- g2 j# P
  60.               ***************************************************2 R! A6 A, q1 H: |
  61.               ***************************************************  a4 V- \) b! A
  62.               ***************************************************
    4 k0 g# D+ m- M4 n
  63.                *************************************************
    5 z$ D3 s( U" g+ L! V) _
  64.                *************************************************
    5 J6 K" _7 `2 m, `9 ]$ k
  65.               ***************************************************
    $ o4 x1 |. U1 B7 A- p
  66.                 ***********************************************1 f% s( W% _/ A
  67.                 ***********************************************
    . T% X/ l# \  Y$ p. B
  68.                   *******************************************
    ; V9 A3 l9 p) t% h
  69.                    *****************************************/ M, }4 Q4 ~/ m- t7 s$ U# ~
  70.                  ********************************************** r/ P" j/ |2 M
  71.                 **** ****************** ****************** ****$ S, s$ _) F- t, g3 s
  72.                  ***  ****************   ****************  ***+ |- ]9 n; J  r6 I) w. E" _9 w9 O) q
  73.                   *    **************     **************    *
    8 }. |: r! U) |  w. s6 G
  74.                          ***********       ***********! v! d9 d6 ]* k3 Z# ]& y4 R
  75.                          **  *****           *****  **
    & L* X" c6 `6 O1 E
  76.                           *   *                 *   *6 C' e( v3 `, G9 E
复制代码

+ q) g0 B! z: w8 `. q: Y" g$ a运行时间为:
" @3 n* Q& B7 j1 H8 E" x
7 z) w% Q) X: o- t: \        Forcal Elapsed 1.078+ C" a+ o: E9 H- `" G/ R2 n





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